时间长了,以前学习的东西,东挪挪,西移移,如今都不知道被放到了哪个角落。如今再次翻看 《Head First 设计模式》(有兴趣的朋友可以买一本看看),做简单记录,以供大家学习。
简单来讲呢, 策略模式就是将具体的实现交给子类来做,需要 使用策略的类 直接和抽象层的类或接口交互,而不是直接和具体策略类交互。
策略模式一个较为正式的定义:它定义了算法簇,将他们封装起来,算法簇之间可以相互替换,让算法的变化独立于使用算法的客户。
举个例子,不同品种鸭子的叫声是不同的。如“呱呱叫” 、 “吱吱叫” 还有的鸭子不叫(模型鸭子),但他们都可以用 “quack”来描述,每种不同的叫声姑且取名为“Quack”、 “Sqack” 、 “QuackNoWay” 。 现在抽象一个父类(也可能是一个借口)叫做 QuackBehavior , 它有个叫quack的方法。客户需要鸭子鸣叫时就像该方法发送一个消息。经过上述分析得到几个类的关系图如下:
上面一直说到 “客户” 一词 , 那它在此究竟是什么呢?我们上面所说的叫声都是鸭子发出的。 鸭子要如何叫就向QuackBehavior 发送一个quack的消息。鸭子的类图如下:
鸭子和QuackBehavior的关系图如下:
说了半天鸭子,鸭子也有具体的品种,不同品种的鸭子叫声是不一样滴(一样滴叫声不考虑了),不同的鸭子我们用以下的类图表示:
最后得到整个类图关系:
注:上图中有包含有飞行方法的接口。
下面给出每个类的代码,具体的策略就自己diy吧:
QuackBehavior
public interface QuackBehavior {
void quack();
}
QuackNoWay
public class QuackNoWay implements QuackBehavior {
public void quack() {
}
}
Quack
public class Quack implements QuackBehavior {
public void quack() {
}
}
Squack
public class Squack implements QuackBehavior {
public void quack() {
}
}
Duck
public abstract class Duck {
public Duck() {
}
// protected FlyBehavior mFlyBehavior;
protected QuackBehavior mQuackBehavior;
public void fly() {
}
public void quack() {
mQuackBehavior.quack();
}
public abstract void display();
// public abstract FlyBehavior setFlyBehavior();
public void setQuackBehavior(QuackBehavior behavior){
mQuackBehavior = behavior;
}
}
GreenDuck
public class GreenDark extends Duck {
public GreenDark() {
}
@Override
public void display() {
System.out.println("I'm a green duck !...");
}
}
ModelDuck
public class ModelDuck extends Duck {
public ModelDuck() {
// TODO Auto-generated constructor stub
}
@Override
public void display() {
System.out.println("I'm a ModelDuck !...");
}
}
RocketDuck
public class RocketDuck extends Duck {
public RocketDuck() {
}
@Override
public void display() {
System.out.println("I'm a RocketDuck !...");
}
}
测试代码
public static void main(String[] args) {
Duck duck = new GreenDark();
duck.setQuackBehavior(new QuackNoWay());
duck.display();
duck.quack();
}
好了,就写到这里吧,更多的测试用例就自己设计了。