前言
一年前开始从c语言编程转站到java语言编程,突然发现很多方式不一样,从过程式到OO式,思维一下在完成没有转变过来,即使已经编程了一年时间,却发现对Java的设计模式可以说是一无所知,现在开始学习设计模式,基于《Head First设计模式》。
策略模式
定义:策略模式主要是为了定义算法族,分别封装起来,让算法之间可以互相替换,并让算法的变化独立于使用其算法的用户。
举例:书上经典例子。
如何支持不同类型的鸭子Duck的不同行为,而且可以动态改变行为?
public abstract class Duck {
class flyBehavior fly;
class QuackBehavior quack;
}
public interface QuackBehuavior{
public void quack();
}
public interface FlyBehavior{
public void fly();
}
1个抽象类和2个接口,分别将Duck抽象出来,并且将其不同行为也抽象出来。这个时候定义到任何具体Duck类,都可以定义自己的fly和quack行为。并且通过set和get方式改变行为。如
public class FlyNoway implement FlyBehavior {
public void fly() {
print "Fly without any";
}
}
public class Quack implement QuackBehavior {
...
}
public class ModelDuck extends Duck {
public ModelDuck() {
fly = new FlyNoway()
quack = new Quack();
}
public void setFly(FlyBehavior fly) {
this.fly = fly;
}
...
}
这样fly和quack的行为可以动态根据set方法来改变。
策略模式涉及到几个OO设计原则:
1)多用组合,少用继承:好处是,可以动态扩展各类行为
2)针对接口编程,不针对实现编程:利于扩展
3)封装变化:减少以后的需求,对现有代码的修改。
总结
策略模式的实现主要是将需要动态变化的算法(即变化的行为,如fly和quack)使用组合方式写入主体(Duck)中。
PS:请注意体会并在实践中应用。