设计模式-策略模式
策略模式
策略模式-对象行为型模式 :定义了一系列算法,并且将算法分别封装,它们之间可以相互替换。
策略模式使得算法与使用算法的客户独立,算法之间也相互独立,无依赖。
情景
模拟鸭子
- 鸭子的行为可能有:fly、swim、dispaly等等
- 不同鸭子有不同的行为
code
- 将Duck设为超类,不同的鸭子继承这个超类
- 将不同的行为抽取出来,分别作为一个独立的策略。
public abstract class Duck {
/**
* 策略接口
*/
FlyBehavior flyBehavior;
public Duck(FlyBehavior flyBehavior){
this.flyBehavior = flyBehavior;
}
public void swim(){
System.out.println(" SWIM ");
}
public abstract void display();
public void performFly(){
flyBehavior.fly();
}
/**
* dynamic set
* @param flyBehavior
*/
public void setFlyBehavior(FlyBehavior flyBehavior){
this.flyBehavior = flyBehavior;
}
}
/**
* fly behavior interface
*/
public interface FlyBehavior {
void fly();
}
- 根据不同行为,分别实现策略接口
public class FlyWithWings implements FlyBehavior{
@Override
public void fly() {
System.out.println("i can fly with wings !");
}
}
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("i can't fly!");
}
}
- 具体类
public class MallardDuck extends Duck{
public MallardDuck(){
}
@Override
public void display() {
System.out.println(" i am a mallard duck");
}
}
- 测试
@Test
public void test(){
Duck duck = new MallardDuck(new FlyWithWings());
duck.performFly();
duck.setFlyBehavior(new FlyNoWay());
duck.performFly();
}
// result:
//i can fly with wings !
//i can't fly!
优点
- 避免使用多重if-else 语句。
- 实现代码的复用
- 扩展性更好
缺点
- 所有算法/行为必须清楚,否而无法决定使用哪个算法
- 一旦算法很多,那实现类亦会很多。
参考书目
- head fist desgin pattern
- 《JAVA与模式》之策略模式
网友评论