需求
- 我们现在需要一个鸭子应用,但是鸭子(Duck)有很多品种
- RedHeadDuck(红头鸭),MallardDuck(绿头鸭),RubberDuck(橡皮鸭),DecoyDuck(诱惑鸭)
- 总结鸭子的方法:display(外形)是每个都不一样的,可是叫,飞,游泳是有存在不同的情况的:部分相同,部分不存在的;所以使用“策略设计模式”–(Strategy Design Pattern)
图解
- 抽取总的抽象父类:Duck。Duck 拥有的成员接口变量:FlyBehavior,QuackBehavior;并提供setter 方法
- Duck 拥有方法:swim(),abstract disply(),performQuack(),PerformFly()。。。方法。其中perfromXX 的方法是两位成员接口变量完成的
- Duck 有各自的子类实现类:MallardDuck,RedheadDuck,RubberDuck,DecoyDuck—他们只需要实现display方法;然后在构造函数需用合适的Behavior 实现类;
- xxxBehavior的实现类分别实现对应的方法,然后供具体的duck在构造函数创建;
小结
我们应该出了必须具体实现的方法如:display(),其他的方法都交由接口实现.然后具体的鸭子就能各自根据情况,使用不同的策略,调用具体的Behavior,这个就是Strategy Design Pattern.
具体代码
1.两个行为接口
interface FlyBehavior{
void fly();
}
interface QuackBehavior{
void quack();
}
2.父类Duck
abstract class Duck{
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
protected void swim(){
System.out.println("鸭子游泳......");
}
protected void performFly(){
flyBehavior.fly();
}
protected void performQuack(){
quackBehavior.quack();
}
abstract void display();
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
3.对行为继续不同的实现:
FlyBehavior:
—FlyRockBehavior
—NotFlitBehavior
—FlyNoWayBehivor
QuackBehavior
—Quck
—Squeak
—MulteQuack
4.具体的鸭子类
class MallarDuck{
public MallarDuck(){
setFlyBehavior(new FlyRockBehavior());
setQuackBehavior(new MulteQuack());
}
display(){
....
}
}
使用
我们再增加新的功能的使用,只需要基础duck,复写display 方法,然后需要合适的Behavior 或者自己实现新的Behavior 就可以了.这个就是—策略模式