相当于锦囊妙计,似乎锦囊妙计长得完全一样,但里面的东西不一样
策略模式组成:
- 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
- 具体策略角色:包装了相关的算法和行为。
- 环境角色:持有一个策略类的引用,最终给客户端调用。
案例分析:
你打算去一趟北京,你不知道怎么去,你不想一个一个去问家人,于是你问你哥,你哥于是问了你爸妈,你爸妈分别给了你哥一个锦囊,你想知道你爸妈给的什么锦囊,通过你哥就可以知道了
/**
* 抽象策略类,相当于锦囊
* @author zhouzhongyi
*/
public interface Strategy {
//出行策略
void strategy();
}
/***
* 具体策略类,你妈的锦囊(MotherStrategy)
* @author zhouzhongyi
*
*/
public class MotherStrategy implements Strategy{
@Override
public void strategy() {
System.out.println("坐高铁去舒服一点");
}
}
/***
* 具体策略类,你爸的锦囊(FatherStrategy)
* @author zhouzhongyi
*
*/
public class FatherStrategy implements Strategy{
@Override
public void strategy() {
System.out.println("坐飞机去快一点");
}
}
/**
* 环境类(Context) 你哥哥拥有两个锦囊
*
* @author zhouzhongyi
*
*/
public class BrotherContext {
// 拥有一个策略即锦囊引用
private Strategy strategy;
public BrotherContext(Strategy strategy) {
this.strategy = strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void travel() {
// 根据具体策略类,执行对应的策略
strategy.strategy();
}
}
/**
* 测试类
* @author zhouzhongyi
*
*/
public class StrategyTest {
@Test
public void test() {
Strategy strategy = new FatherStrategy() ;//爸爸的策略
BrotherContext brother= new BrotherContext (strategy);//放到哥哥那里
brother.strategy();//哥哥给我才知道
strategy = new MotherStrategy();//妈妈的策略
brother.setStrategy(strategy);//放到哥哥那里
brother.strategy();
}
}
生活中这种模式随处可见,比如说领导想知道某件事情,都是找管事的第一责任人去问,这个第一责任人其实就是军师一样的,专门提供锦囊妙计