美文网首页
Head First 策略模式

Head First 策略模式

作者: 酥酥肉 | 来源:发表于2018-11-14 13:32 被阅读0次

    设计原则一

    1、找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
    把会变化的部分取出来“封装”起来,以便以后可以轻易改动或扩充此部分

    设计原则二

    针对接口编程,而不是针对实现编程
    利用接口代表行为,比如鸭子的fly-behavior ,而行为的每个实现都将实现一个接口

    设计原则三

    多用组合,少用集成

    策略模式

    策略模式定义的算法族, 分别封装起来,让他们之间可以互相转换,此模式让算法的变化独立于使用算法的客户
    类似 鸭子的飞,叫的行为,有不同===> 算法的变化

    基础类

    public abstract class Duck {
        protected FlyBehavior flyBehavior;
        protected QuackBehavior quackBehavior;
    
        /**
         * 鸭子的外观
         */
        public abstract void display();
    
        /**
         * 游泳
         */
        public void swim() {
            System.out.println("我游啊游啊游......");
        }
        /**
         * 飞行
         */
        public void performFly() {
            //将飞行这件小事委托给行为类
            if (flyBehavior != null)
                flyBehavior.fly();
        }
    
        /**
         * 设置鸭子的飞行行为
         *
         * @param flyBehavior 飞
         */
        public void setFlyBehavior(FlyBehavior flyBehavior) {
            this.flyBehavior = flyBehavior;
        }
    
        /** * 叫  */
        public void performQuack() {
            //将浪叫这件小事委托给行为类
            if (quackBehavior != null)
                quackBehavior.quack();
        }
        /**
         * 设置鸭子叫的行为
         *
         * @param quackBehavior 叫
         */
        public void setQuackBehavior(QuackBehavior quackBehavior) {
            this.quackBehavior = quackBehavior;
        }
    }
    

    总结,这里把鸭子叫,非的不确定行为抽象出来,使用 组合的方式组合起来
    但是鸭子确定的行为就可以保留在基类里

    public interface FlyBehavior {
        /**
         * 飞行
         */
        void fly();
    }
    
    public interface QuackBehavior {
        /**
         * 叫
         */
        void quack();
    }
    
    

    这里想实现怎么飞就怎么飞,用翅膀,坐飞机,坐火箭。这样就能达到代码复用,只用维护一份,
    比如这里实现用翅膀飞

    public class FlyWithWings implements FlyBehavior{
        @Override
        public void fly() {
            System.out.println("我飞起来了!!!");
        }
    }
    

    实现一只绿头鸭

    public class MallardDuck extends Duck {
    
        public MallardDuck() {
            flyBehavior = new FlyNoWay();
            quackBehavior = new Quack();
        }
    
        @Override
        public void display() {
            System.out.println("我可是一只货真价实的野鸭子!");
        }
    }
    

    测试

    public static void main(String[] args) {
    
            System.out.println("Hello World!");
            Duck duck = new MallardDuck();
            duck.swim();
            duck.display();
            duck.performFly();
            duck.performQuack();
    
            //现在会飞了
            duck.setFlyBehavior(new FlyWithWings());
            duck.performFly();
            //可是不会叫了
            duck.setQuackBehavior(new MuteQuack());
            duck.performQuack();
        }
    

    相关文章

      网友评论

          本文标题:Head First 策略模式

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