什么是策略模式?
定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户(引用自head first 设计模式中的解释)
下面谈谈我自己对其粗浅的理解(java)
所谓策略,就是动态的改变对象的行为,兵来将当,水来土掩,用类的形式封装最基本不会变的,用接口或者抽象类的形式来实现动态的内容。
好多人都提及策略模式中以下三个重要对象概念:
- 环境(Context)角色:持有一个Strategy的引用。
- 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
- 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
这里引用阿福博客中举到的很生动三国例子来具体说明策略模式内容以及上述的三个重要的对象概念。
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开能解决棘手问题,嘿,还别说,真解决了大问题,搞到最后是周瑜陪了夫人又折兵,那咱们先看看这个场景是什么样子的。
先说说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是亮哥给的,妙计放在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊取出妙计,执行,然后获胜。用java程序怎么表现这些呢?
三个妙计是同一类型的东西,那就写个接口:
public interface IStrategy {
//每个锦囊妙计都是一个可执行的算法。
public void operate();
}
妙计一:初到吴国:
public class BackDoor implements IStrategy {
@Override
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备...");
}
}
妙计二:求吴国太开个绿灯,放行:
public class GivenGreenLight implements IStrategy {
@Override
public void operate() {
System.out.println("求吴国太开个绿灯,放行!");
}
}
妙计三:孙夫人断后,挡住追兵:
public class BlackEnemy implements IStrategy {
@Override
public void operate() {
System.out.println("孙夫人断后,挡住追兵...");
}
}
三个妙计是有了,那需要有个地方放妙计啊,放锦囊里:
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("\n\n\n\n\n\n\n\n\n\n\n\n\n");
//当刘备乐不思蜀时,拆开第二个
System.out.println("----------刘备乐不思蜀,拆第二个了---------------");
context = new Context(new GivenGreenLight());
context.operate();//拆开执行
System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
//孙权的小追兵了,咋办?拆开第三个锦囊
System.out.println("----------孙权的小追兵了,咋办?拆开第三个锦囊---------------");
context = new Context(new BlackEnemy());
context.operate();//拆开执行
System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
}
}
原本想自己总结的,发现这大哥总结举的三国例子简直不能再生动了,看了这个例子,策略模式妥妥的了。
策略模式还可以打一个类似的比方就是相当于,一个游戏的人物手里可以也只能手持一把武器,在游戏过程中可以切换武器,遇到什么场景就切换到对应的合适武器,这也是策略模式的一种。