• 《head First设计模式》阅读笔记01_策略模式


    1.模拟鸭子系统引出策略模式

    1.1.系统设计构思

     

     

     

    1.2.系统代码实现

    1.2.1.定义鸭子行为接口及实现

    1.2.1.1.飞行行为接口及实现
    package com.wf.strategy.behavior;
    
    /**
     * @ClassName FlyBehavior
     * @Description 鸭子飞行行为
     * @Author wf
     * @Date 2020/6/30 10:06
     * @Version 1.0
     */
    public interface FlyBehavior {
        void fly();
    }
    package com.wf.strategy.behavior;
    
    /**
     * @ClassName FlyWithWings
     * @Description 带翅膀会飞的鸭子行为
     * @Author wf
     * @Date 2020/6/30 10:08
     * @Version 1.0
     */
    public class FlyWithWings implements FlyBehavior {
        public void fly() {
            System.out.println("我会飞,I'm flying...");
        }
    }
    package com.wf.strategy.behavior;
    
    /**
     * @ClassName FlyNoWay
     * @Description 不会飞的鸭子行为
     * @Author wf
     * @Date 2020/6/30 10:08
     * @Version 1.0
     */
    public class FlyNoWay implements FlyBehavior {
        public void fly() {
            //什么也不做,不会飞
        System.out.println("I can't fly...");
        }
    }
    1.2.1.2.鸭子叫声行为接口及实现
    package com.wf.strategy.behavior;
    
    /**
     * @ClassName QuackBehavior
     * @Description 鸭子呱呱叫行为
     * @Author wf
     * @Date 2020/6/30 10:06
     * @Version 1.0
     */
    public interface QuackBehavior {
        void quack();
    }
    package com.wf.strategy.behavior;
    
    /**
     * @ClassName Squeak
     * @Description 吱吱叫的鸭子行为
     * @Author wf
     * @Date 2020/6/30 10:14
     * @Version 1.0
     */
    public class Squeak implements QuackBehavior {
        public void quack() {
            System.out.println("鸭子吱吱叫,Squeak");
        }
    }
    package com.wf.strategy.behavior;
    
    /**
     * @ClassName Quack
     * @Description 呱呱叫的鸭子行为
     * @Author wf
     * @Date 2020/6/30 10:14
     * @Version 1.0
     */
    public class Quack implements QuackBehavior {
        public void quack() {
            System.out.println("鸭子呱呱叫,Quack");
        }
    }
    package com.wf.strategy.behavior;
    
    /**
     * @ClassName Quack
     * @Description 不会叫,安静的鸭子行为
     * @Author wf
     * @Date 2020/6/30 10:14
     * @Version 1.0
     */
    public class MuteQuack implements QuackBehavior {
        public void quack() {
            System.out.println("<Silence>");
        }
    }

     1.2.2.鸭子超类定义

    package com.wf.strategy.imitateduckgame.duck;
    
    import com.wf.strategy.behavior.FlyBehavior;
    import com.wf.strategy.behavior.QuackBehavior;
    
    /**
     * @ClassName Duck
     * @Description 鸭子超类抽象
     * @Author wf
     * @Date 2020/6/30 10:26
     * @Version 1.0
     */
    public abstract class Duck {
        protected FlyBehavior flyBehavior;
        protected QuackBehavior quackBehavior;
        public void swim(){
            System.out.println("All ducks float,even decoys");
        }
        //不同的鸭子,有不同的外形
        public abstract void display();
    
        //委托接口实现具体行为
        public void performFly(){
            flyBehavior.fly();
        }
    
        public void performQuack(){
            quackBehavior.quack();
        }
    }
     1.2.2.1.实现不同类型的鸭子

    实现一个绿头鸭,会飞,能呱呱叫。

    package com.wf.strategy.imitateduckgame.duck;
    
    import com.wf.strategy.behavior.FlyWithWings;
    import com.wf.strategy.behavior.Quack;
    
    /**
     * @ClassName MallardDuck
     * @Description 绿头鸭
     * @Author wf
     * @Date 2020/6/30 10:41
     * @Version 1.0
     */
    public class MallardDuck extends Duck {
        public MallardDuck(){
            //暂时在构造器中,初始化鸭子行为:会飞,能呱呱叫
            flyBehavior = new FlyWithWings();
            quackBehavior = new Quack();
        }
        public void display() {
            System.out.println("I'm a real Mallard duck");
        }
    }

    1.2.3.测试类

    package com.wf.strategy.imitateduckgame.duck;
    
    public class MiniDuckSimulator {
        public static void main(String[] args) {
            //定义一种鸭子实例
            Duck mallard = new MallardDuck();
            //测试鸭子行为
            mallard.performFly();
            mallard.performQuack();
        }
    }

    测试结果如下:

     1.2.4.优化系统

    1.2.4.1.动态设置鸭子行为

      前面的设计中,通过在鸭子子类实现的构造器中初始化,鸭子行为。代码不够弹性,健壮。

      现在,在鸭子超类中,提供setter方法,然后由客户端调用时,动态设置鸭子行为。

    1.修改Duck类

    增加setter方法,代码修改如下:

    package com.wf.strategy.imitateduckgame.duck;
    
    import com.wf.strategy.behavior.FlyBehavior;
    import com.wf.strategy.behavior.QuackBehavior;
    
    /**
     * @ClassName Duck
     * @Description 鸭子超类抽象
     * @Author wf
     * @Date 2020/6/30 10:26
     * @Version 1.0
     */
    public abstract class Duck {
        protected FlyBehavior flyBehavior;
        protected QuackBehavior quackBehavior;
        public void swim(){
            System.out.println("All ducks float,even decoys");
        }
        //不同的鸭子,有不同的外形
        public abstract void display();
    
        //委托接口实现具体行为
        public void performFly(){
            flyBehavior.fly();
        }
    
        public void performQuack(){
            quackBehavior.quack();
        }
    
        public void setFlyBehavior(FlyBehavior flyBehavior) {
            this.flyBehavior = flyBehavior;
        }
    
        public void setQuackBehavior(QuackBehavior quackBehavior) {
            this.quackBehavior = quackBehavior;
        }
    }
    1.2.4.2.扩展系统---增加一种模型鸭
    1.新增鸭子类型:模型鸭
    package com.wf.strategy.imitateduckgame.duck;
    
    import com.wf.strategy.behavior.FlyNoWay;
    import com.wf.strategy.behavior.Quack;
    
    /**
     * @ClassName ModelDuck
     * @Description 模型鸭
     * @Author wf
     * @Date 2020/6/30 11:14
     * @Version 1.0
     */
    public class ModelDuck extends Duck {
        public ModelDuck() {
            //初始化时,模型鸭不会飞行
            flyBehavior = new FlyNoWay();
            quackBehavior = new Quack();
        }
    
        public void display() {
            System.out.println("I'm a model duck");
        }
    }
    2.新建一种飞行行为
      利用火箭助力,帮助模型鸭飞行。代码如下:
    package com.wf.strategy.behavior;
    
    /**
     * @ClassName FlyRocketPowered
     * @Description 火箭助力飞行
     * @Author wf
     * @Date 2020/6/30 11:17
     * @Version 1.0
     */
    public class FlyRocketPowered implements FlyBehavior {
        public void fly() {
            System.out.println("I'm flying with a rocket!!");
        }
    }
    1.2.4.3.修改测试类 

      增加对模型鸭,行为测试:

    package com.wf.strategy.imitateduckgame.duck;
    
    import com.wf.strategy.behavior.FlyRocketPowered;
    
    public class MiniDuckSimulator {
        public static void main(String[] args) {
            //定义一种鸭子实例
            Duck mallard = new MallardDuck();
            //测试鸭子行为
            mallard.performFly();
            mallard.performQuack();
    
            //测试新增加模型鸭,行为
            Duck model = new ModelDuck();
            model.performFly(); //一开始不会飞行
            //动态设置飞行行为,使用火箭助力飞行
            model.setFlyBehavior(new FlyRocketPowered());
            model.performFly();
        }
    }

    测试结果如下:

     总结:

      通过对模型鸭的行为测试:一开始,模型鸭是不会飞行的。而调用setter方法,进行设置飞行行为,

    以达到动态设置飞行行为的目的。

    1.3.策略模式定义

      上面的系统设计,使用了策略模式。现在,给策略模式,下一个标准的定义:

    策略模式 :

      定义算法簇,分别封装起来,让它们之间互相替换。此模式让算法的变化独立于使用算法的客户。

    1.3.1.系统类图

  • 相关阅读:
    搭建vue环境
    git常用命令整理
    highcharts 当Y轴全部没有数据的时候 数据标签显示最下面 而不是居中显示
    highcharts 不显示X轴 Y轴 刻度
    关于placeholder中 文字添加换行 用转义字符&#13;&#10;代替<br>
    highcharts 柱状图 折线图 混合 双纵轴显示
    单行、多行文字溢出 显示省略号
    Highcharts 饼图 文字颜色设置
    多行文本,垂直居中显示,文字超出高度显示省略号
    学习方法-5:比较学习法
  • 原文地址:https://www.cnblogs.com/wfdespace/p/13213514.html
Copyright © 2020-2023  润新知