原文:oodesign
产生的诱因
当 多个类 仅仅在 行为上有所不同时,这个时候可以选择 将不同的行为的实现算法 孤立 在不同的类中,以达到在运行时可以选择不同的算法的目的。
思路
定义一个算法族,每个算法单独封装 使他们可以互换;策略模式 让 算法 独立于 使用它的客户端。
UML 类图
IStrategy 接口: 所有算法族必须实现的接口,不同的算法实现在 不同的实现类中
ConcreteStrategyA ,ConcreteStrategyB ,ConcreteStrategyC: 算法接口的不同实现
Context 类 : 对算法的引用类;
应用: 机器人案例
相关类:
IBehavior : 机器人行为的抽象
AgressiveBehavior :攻击行为的实现
DefensiveBehavior :防御行为的实现
NormalBehavior:通常行为的实现
Robot :机器人实例
Main : 主函数入口
IBehavior:
package com.ycit.strategy; /** * Created by xlch on 2017/3/15. */ public interface IBehavior { public int command(); } AggressiveBehavior : package com.ycit.strategy; /** * Created by xlch on 2017/3/15. */ public class AgressiveBehavior implements IBehavior { @Override public int command() { System.out.println("攻击他"); return 1; } } DefensiveBehavior : package com.ycit.strategy; /** * Created by xlch on 2017/3/15. */ public class DefensiveBehavior implements IBehavior { @Override public int command() { System.out.println("远离他"); return -1; } } NormalBehavior : package com.ycit.strategy; /** * Created by xlch on 2017/3/15. */ public class NormalBehavior implements IBehavior { @Override public int command() { System.out.println("无视他,径直走开"); return 0; } } Robot: package com.ycit.strategy; /** * Created by xlch on 2017/3/15. */ public class Robot { private String name; private IBehavior behavior; public Robot() { } public Robot(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public IBehavior getBehavior() { return behavior; } public void setBehavior(IBehavior behavior) { this.behavior = behavior; } public void move() { System.out.print(this.name + " 在行走的过程中遇到了另一个机器人 →"); behavior.command(); } } Main: package com.ycit.strategy; /** * Created by xlch on 2017/3/16. */ public class Main { public static void main(String [] args) { Robot robot007 = new Robot("007"); Robot robotG = new Robot("G"); Robot robotR = new Robot("R"); robot007.setBehavior(new AgressiveBehavior()); robotG.setBehavior(new DefensiveBehavior()); robotR.setBehavior(new NormalBehavior()); robot007.move(); robotG.move(); robotR.move(); robot007.setBehavior(new DefensiveBehavior()); robot007.move(); } } 执行结果: 007 在行走的过程中遇到了另一个机器人 →攻击他 G 在行走的过程中遇到了另一个机器人 →远离他 R 在行走的过程中遇到了另一个机器人 →无视他,径直走开 007 在行走的过程中遇到了另一个机器人 →远离他
