设计模式之策略模式
2017-01-10 23:49
260 查看
策略模式
策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
三个准则
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起针对接口编程,而不是针对实现编程
多用组合,少用继承
举个例子,比如说有个抽象类Duck,每一个继承它的具体类代表一种特定的鸭子,这里的鸭子不一定是显示中的,还可能是模型鸭子等。我们试想,每一种鸭子都有自己特定的叫声和特定的飞行方式,有的还不会飞行,那么就会有很多种组合,如果我们将飞行与叫这两个行为定义到Duck类中,那么每一种特定的鸭子我们都要写很多实现,这样就会造成一些问题。
代码在多个子类中重复
运行时的行为不容易改变
很难知道鸭子的全部行为
改变会牵一发动全身,造成其他鸭子不想要的改变。
这是我们就可以定义两个接口,分为代表飞行行为和叫行为,两个接口分别为FlyBehavior、QuackBehavior。然后在Duck类中调用接口,调用接口的方法,这样就不需要一直重复代码了。
接着我们需要动态改变鸭子的行为,就可以在Duck类中定义两个set方法,将接口具体的实现赋予Duck类中的接口对象,这样就可以在运行时对行为进行改变了。
以上就实现了一个简单的策略模式,只需要实现接口,并将接口对象set给特定的鸭子,那么这个鸭子就可以拥有特定的飞行方式或者叫的方式了。这也就是策略模式定义中的定义了算法族,分别封装起来,让它们之间可以互相替换。
以下为Duck类的定义
public abstract class Duck { FlyBehavior flyBehavior; // 飞行为接口 QuackBehavior quackBehavior; // 叫行为接口 public Duck() { } public abstract void display(); public void swim() { System.out.println("所有鸭子都可以游泳,我在游泳"); } public void performFly() { flyBehavior.fly(); } public void performQuack() { quackBehavior.quack(); } // 设定方法,可以动态改变鸭子的行为 public void setFlyBehavior(FlyBehavior fb) { flyBehavior = fb; } public void setQuackBehavior(QuackBehavior qb) { quackBehavior = qb; } }
再实现一种特定的鸭子就比较容易了,这样就将需要变化的代码与不需要变化的代码分隔开来,让代码的可维护性与可扩展性加强。
以上程序的完整代码可在我的Github中查看
地址为:https://github.com/yangliu0/DesignPatterns
相关文章推荐
- 设计模式之Strategy(策略)
- 设计模式之策略模式(strategy)--游戏角色使用武器
- [设计模式] 23.Strategy 策略模式
- [★] .NET 偶尔连接的设计策略 -联机状态- 脱机模式- 数据同步
- 设计模式袖珍版 连续转载之 - Strategy(策略)
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
- 设计模式随笔系列:鸭子-策略模式(Strategy)[原]
- 设计模式之Strategy(策略)
- 设计模式之策略模式探讨初步[引]
- 设计模式随笔系列:鸭子-策略模式(Strategy)[转]
- 设计模式之Strategy(策略)
- Java设计模式学习之一---策略模式
- AspectJ实现设计模式(二)——策略模式
- 设计模式之策略模式探讨初步
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式与泡mm的关系之strategy策略模式及再思考
- 设计模式之Strategy(策略)
- 设计模式随笔系列:鸭子-策略模式(Strategy)
- 设计模式(20)-策略模式(Strategy)