美文网首页
设计模式-策略模式

设计模式-策略模式

作者: 右左君 | 来源:发表于2018-08-14 22:30 被阅读0次

设计模式-策略模式

策略模式

策略模式-对象行为型模式 :定义了一系列算法,并且将算法分别封装,它们之间可以相互替换。

策略模式使得算法与使用算法的客户独立,算法之间也相互独立,无依赖。

情景

模拟鸭子

  • 鸭子的行为可能有: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 语句。
  • 实现代码的复用
  • 扩展性更好

缺点

  • 所有算法/行为必须清楚,否而无法决定使用哪个算法
  • 一旦算法很多,那实现类亦会很多。

参考书目

相关文章

网友评论

      本文标题:设计模式-策略模式

      本文链接:https://www.haomeiwen.com/subject/ofvbbftx.html