Java中的设计模式:策略模式

作者: Arvin Chen 分类: Java 来源: Break易站(www.breakyizhan.com)

策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。

策略模式中一个比较重要的设计原则是:

找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

针对接口编程,而不是针对实现编程。多用组合,少用继承。

对于独立出变化之处,比较重要的例子就是head first这本书中的鸭子的实现。

策略模式的例子解读

joe上班的公司做了一套成功的模拟鸭子的游戏:SimUDuck,游戏中会出现各种鸭子,一边游泳,一边呱呱叫,由于公司竞争压力加剧,必须重新设计鸭子(Duck)类,要求是:便于产生新的鸭子对象,可为鸭子添加新的行为,易于维护,动态设置行为。

那么如果我们之间在鸭子类中加一个飞行的方法,所有的鸭子都继承这个飞行的方法可以么?显然是不行的,因为有的鸭子是不会飞的呀,比如玩具鸭子。所以,这个鸭子飞行和呱呱叫的行为必须独立开来,不然会影响到所有的鸭子。(飞和呱呱叫属于会变的代码)

1.对各种鸭子的解释:

  • RedHeadDuck:红头鸭,可以用翅膀飞,呱呱叫。
  • RubberDuck:橡皮鸭,不会飞,吱吱叫。
  • ModelDuck:模型鸭,不会飞,呱呱叫。
  • DecoyDuck:诱饵鸭,不会飞,不会叫。
  • MallardDuck:野鸭,会用翅膀飞,呱呱叫。

2.Duck是各种鸭子的抽象超类,其内部持有FlyBehavior和QuackBehavior接口类型的引用,因为飞行行为和呱呱叫行为随鸭子的不用而不同,是变化的部分,所以将它们取出并“封装”起来,好让其他部分不会受到影响。

       使用FlyBehavior和QuackBehavior接口类型便于以后增加新的飞行行为或呱呱叫行为,不会影响到既有的行为类,也不会影响使用行为的鸭子类。同样,这也可以让飞行行为和呱呱叫行为被其他对象复用,因为这些行为已经与鸭子类无关了,你也可以将其用在鸡和大鹅身上。

3.对飞行行为的解释:

  •  FlyWithWings用翅膀飞。
  • FlyNoWay:不会飞。
  • FlyRocketPowered:使用火箭动力飞行(鸭子的飞行行为可以动态改变)。

4.对呱呱叫(此呱呱叫泛指鸭子的叫声而不是红头鸭的“呱呱叫”)行为的解释:

  •  Quack:呱呱叫。
  • FakeQuack:假叫。
  •  Squeak:吱吱叫。
  • MuteQuack:不会叫。

5.所有的鸭子都会浮水,所以将swim()方法定义且实现为抽象父类Duck中的具体类。

所有的鸭子的外观随鸭子种类不同而不同,所以将display()方法定义为Duck中的抽象方法,让各个鸭子子类实现。

6.Duck中的performFly()和performQuack()方法:

  鸭子对象不亲自处理飞行行为和呱呱叫行为,而是委托给飞行行为类FlyBehavior和呱呱叫行为类QuackBehavior。例如performFly()方法实现为

public void performFly() {
    flyBehavior.fly();
}

7.Duck的setFlyBehavior()和setQuackBehavior()用于动态设置鸭子的行为。

8.类不仅可以表示具体的“东西”,还.可以用一个类来表示行为,FlyBehavior表示飞行行为,QuackBehavior表示呱呱叫行为。

  •   本文标题:Java中的设计模式:策略模式 - Break易站
    转载请保留页面地址:https://www.breakyizhan.com/java/7009.html
      微信返利机器人
      免费:淘宝,京东,拼多多优惠券
      腾讯,爱奇艺,优酷的VIP视频免费解析,免费看
      即刻扫描二维码,添加微信机器人!

    发表笔记

    电子邮件地址不会被公开。 必填项已用*标注