定义
策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
理解
上面的定义是百度抄的,反复读了好几遍也没在脑子里留下非常深的印象。一个很好的场景是,“见人说人话,见鬼说鬼话”,这里的“见人”或“见鬼”就是不同的场景,而各个场景并不需要理解说话者每个场景的逻辑(相互隔离)。
比如韦小宝见到康熙说:“陛下真是鸟生鱼汤”,见到毛十八说:“上刀山下火海在所不辞”,见到天地会的人会说:“替天行道,劫富济贫,反清复明”。而康熙并不知道韦小宝会说“反清复明”,同样毛十八也不知道韦小宝在官场说的奉承话。
流程图
class.png在这里定义了一个环境类Context用来对策略对象进行配置,使得调用者与接口隔离,调用者只需关心具体的场景即可。 IScrene场景接口,每个场景TianDiHui,Mao18,KangXi实现该接口中的speak这个方法。
场景接口定义
public interface IScene {
public void speak();
}
实现类一(天地会)
public class TianDiHui implements IScene {
@Override
public void speak() {
System.out.println("替天行道,劫富济贫,反清复明");
}
}
实现类二(毛18)
public class Mao18 implements IScene {
@Override
public void speak() {
System.out.println("上刀山下火海在所不辞");
}
}
实现类二(康熙)
public class KangXi implements IScene {
@Override
public void speak() {
System.out.println("陛下真是鸟生鱼汤!");
}
}
环境配置类
public class Context {
private IScene iScene;
public Context(IScene iScene){
this.iScene = iScene;
}
public void speak(){
this.iScene.speak();
}
}
具体调用类
public class WeiXiaoBao {
Context context;
@Test
public void think(){
System.out.println("======遇到毛18======");
context = new Context(new Mao18());
context.speak();
System.out.println("======遇到康熙======");
context = new Context(new KangXi());
context.speak();
System.out.println("======遇到天地会成员======");
context = new Context(new TianDiHui());
context.speak();
}
}
至此一个简单的策略模式设计完毕。
策略模式优点
1、可以动态的改变对象的行为
2、可以避免使用多重条件转移语句
策略模式缺点
1、客户端(调用方)需要知道所有策略,并且知道具体需要使用哪个策略
2、策略模式造成很多的策略类,每个具体策略类都会产生一个新类。
网友评论