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