策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
运行结果:
具体的算法实现策略1我们这里通过<<设计模式之禅>>这本书上的一个例子,来进一步了解策略模式。
场景如下:
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。先说这个场景中的要素:三个锦囊,三个妙计,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜。我们来看看如何利用策略模式来实现这个过程。
妙计接口,代码如下:
//妙计接口 interface IStrategy{ //每个妙计都是一个可执行的算法 public void operation(); }接口很简单,定义了一个方法operate,每个妙计都是可执行的,否则叫什么妙计。我们先来看第一个妙计——找乔国老开后门.。代码如下:
public class Backdoor implements IStrategy{ public void operation() { System.out.println("找乔国老帮忙,让吴国太给孙权施加压力"); } }第二个妙计是找吴国太哭诉,企图给自己开绿灯,代码如下:
public class GivenGreenLight implements IStrategy{ public void operation() { System.out.println("求吴国太开绿灯,放行"); } }第三个妙计是在逃跑的时候,让新娘子孙夫人断后,谁来砍谁,这是非常好的主意,代码如下:
public class BlockEnemy implements IStrategy{ public void operation() { System.out.println("孙夫人断后,挡住追兵"); } }这样三个妙计都有了,还缺少一个锦囊,用来把三个妙计给装起来。另外还缺少使用锦囊妙计的人,这个人就是赵云了。代码如下:
//锦囊 public class Context{ private IStrategy stragety; public Context(IStrategy strategy) { this.stragety=strategy; } //使用妙计了,看我出招 public void operate() { this.stragety.operation(); } }public class ZhaoYun { //赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计 public static void main(String[] args) { Context context; //刚到吴国的时候拆第一个 System.out.println("--刚到吴国的时候拆开第一个--"); context=new Context(new Backdoor()); //拿到妙计 context.operate(); //执行妙计1 System.out.println("--刘备乐不思蜀了,拆第二个了--"); context=new Context(new GivenGreenLight()); //拿到妙计 context.operate(); //执行妙计2 System.out.println("--孙权的小兵追来了,咋办?拆第三个--"); context=new Context(new BlockEnemy()); //拿到妙计 context.operate(); //执行妙计3 } }
执行结果如下:
--刚到吴国的时候拆开第一个-- 找乔国老帮忙,让吴国太给孙权施加压力 --刘备乐不思蜀了,拆第二个了-- 求吴国太开绿灯,放行 --孙权的小兵追来了,咋办?拆第三个-- 孙夫人断后,挡住追兵相信看完这个例子你一定明白了策略模式是个怎样的设计模式了吧。我们接着看看策略模式有什么优点和缺点,以及它适用在什么场景下。