策略模式其实很好理解,我们讲一个通俗易懂的举例。
三国时期,诸葛亮是个高人,可以给一些锦囊妙计,让某人在特定的时候打开使用。
关键:妙计,锦囊, 使用
妙计共有的特点就是可以打开看,定义一个接口。
public interface IStrategy { void operate(); }
接下来可以可以装妙计了,来2个妙计
public class StrategyOne implements IStrategy { @Override public void operate() { System.out.println("妙计1:今天不要出门。"); } } public class StrategyTwo implements IStrategy { @Override public void operate() { System.out.println("妙计2:出门记得带上口罩。");
//实际的运用中,这里可能是非常复杂的算法 } }
有了2个妙计了,我们就放在一个地方吧——锦囊
public class Context { private IStrategy strategy; public Context(IStrategy strategy) { this.strategy = strategy; } public void operate() { this.strategy.operate(); } }
接下来让阿斗来获得并使用妙计
public class Adou { public static void main(String[] args) { Context context; System.out.println("我拿到第一个妙计了,迅速打开查看:"); // 拿到第一个妙计 context = new Context(new StrategyOne()); // 看看妙计 context.operate(); System.out.println("第一个妙计可能不行,找到第二个妙计查看:"); // 拿到第二个妙计 context = new Context(new StrategyTwo()); context.operate(); } }
运行结果:
我拿到第一个妙计了,迅速打开查看:
妙计1:今天不要出门。
第一个妙计可能不行,找到第二个妙计查看:
妙计2:出门记得带上口罩。
策略模式的优点:
1、算法自由切换
2、避免使用多重条件判断
3、扩展性好
缺点:
1、类的数量增加
2、所有的策略接口要对外暴露(可以用工厂方法、代理模式或享元模式来修正)