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

设计模式-策略模式

作者: 右左君 | 来源:发表于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