策略模式——《设计模式之禅》
很好理解的例子
刘备江东娶亲,三个锦囊妙计
一个接口,三个实现类,三个锦囊妙计
interface IStrategy{
public void operate();
}
/**
* 锦囊妙计1:找乔国老帮忙说情,娶了孙尚香
*/
public class BackDoor implements IStrategy{
public void operate{
System.out.println("找乔国老帮忙说情,娶孙尚香");
}
}
/**
* 锦囊妙计2:找吴国太哭诉,企图给自己开绿灯,方便逃走
*/
public class GivenGreenLight implements IStrategy{
public void operate{
System.out.println("找吴国太哭诉,企图给自己开绿灯,方便逃走");
}
}
/**
* 锦囊妙计3:孙尚香死守,力求断后
*/
public class BlockEnemy implements IStrategy{
public void operate{
System.out.println("孙尚香死守,力求断后");
}
}
封装类,Contex也就是锦囊,承载3个妙计
/**
* 封装类,Contex也就是锦囊,承载3个妙计
*/
public class Context{
private IStrategy strategy;
public Context(IStrategy strategy){
this.strategy = strategy;
}
public void operate(){
this.strategy.operate();
}
}
使用计谋
public class ZhaoYun{
public static void main(String[] args) {
Context context;
system.out.println("刚刚到吴国的时候,打开第一条锦囊妙计");
context = new Context(new BackDoor());
context.operate();
system.out.println("乐不思蜀,打开第二条锦囊妙计");
context = new Context(new GivenGreenLight());
context.operate();
system.out.println("追兵来了");
context = new Context(new BlockEnemy());
context.operate();
}
}
策略模式总结
Define a family of algorithms, encapsulate each other, and make them interchangeable.
策略模式定义一组算法,将每个算法都封装起来,并且使它们之间可以互换
- Context封装角色
上下文角色,起到承上启下封装作用,屏蔽高层模块对策略、算法的直接访问、封装可能存在的变化
public class Context {
private Strategy strategy = null;
public Context(Strategy strategy){
this.strategy = strategy;
}
public void doSomething(){
this.strategy.doSomething();
}
}
- Strategy抽象策略角色
策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性
public interface Strategy{
public void doSomething();
}
- ConcreteStrategy 具体策略角色
实现抽象策略中的操作,该类含有具体的算法
public class ConcreteStrategy implements Strategy {
public void doSomething(){
//code to do something
}
}
class ConcreteStrategy2 implements Strategy {
public void doSomething(){
//code to do something
}
}
- 高层调用Client
public class Client {
public static void main(String[] args) {
Strategy strategy = new ConcreteStrategy();
Context context = new Context(strategy);
context.doSomething();
}
}
策略模式优点
- 算法可以自由切换
- 避免使用多重条件判断
- 扩展性良好
策略模式缺点
- 策略类数量增多
- 所有的策略类都必须对外暴露
策略模式的使用场景
- 多个类只有在算法或行为上稍有不同的场景
- 算法需要自由切换的场景
- 需要屏蔽算法规则的场景
网友评论