原文: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 在行走的过程中遇到了另一个机器人 →远离他