《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.系统类图

 

posted @ 2020-06-30 14:19  我爱钻研  阅读(204)  评论(0编辑  收藏  举报