Java 设计模式之策略模式

定义

模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法的变化不会影响使用算法的用户。

策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现方式分割开来,并委派给不同的对象对这些算法进行管理。

通俗理解:

在现实生活中经常遇到某种目标存在多种策略可供选择的情况。

例如:出行可以选择乘坐火车、汽车、私家车、自行车等。

优点:

1、多重条件语句不易维护,使用策略模式可以避免使用多重条件语句,如if…else 语句、switch…case语句。

2、使用恰当的继承,可以把公共代码转移到父类里面,避免重复代码。

3、策略模式可以提供相同的行为不同的实现,客户可以根据不同时间或空间要求选择不同的。

4、策略模式完美支持开闭原则,可以在不修改原代码的情况下,灵活增加算法。

5、策略模式实现了对算法的使用和实现,二者分离。

缺点:

1、使用者必须了解所有算法的区别,以便选择恰当的算法类。

2、会造成很多策略类,增加维护难度。

策略模式结构:

1、抽象策略类:定义一个公共接口,各种不同算法以不同的方式实现这个接口,环境角色使用这个接口调用不同算法,一般使用接口或者抽象类实现。

2、具体策略类:实现了抽象策略定义的接口,提供具体的算法实现。

3、环境类: 持有一个策略类的引用,最终给客户端调用。

代码实现场景:

刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题。

先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜。

上代码:

/** * 首先定一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口 */public interface IStrategy { //每个锦囊妙计都是一个可执行的算法 public void operate();}/** * 妙计有了,需要把妙计放到锦囊里面 */public class Context { // 构造函数,你要使用那个妙计 private IStrategy iStrategy; public Context(IStrategy iStrategy) { this.iStrategy = iStrategy; } // 开始使用锦囊 public void operate() { this.iStrategy.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 BlockEnemy implements IStrategy { @Override public void operate() { System.out.println(“孙夫人断后,挡住追兵”); }}public class ZhaoYun { /** * 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计 * @param args */ public static void main(String[] args) { Context context; System.out.println(“———–刚刚到吴国的时候拆第一个————-“); context = new Context(new BackDoor()); context.operate(); System.out.println(“”); System.out.println(“———–刘备乐不思蜀了,拆第二个了————-“); context = new Context(new GivenGreenLight()); context.operate(); System.out.println(“”); System.out.println(“———–孙权的小兵追了,咋办?拆第三个 ————-“); context = new Context(new BlockEnemy()); context.operate(); System.out.println(“”); }}

注:本文创作思路源于《设计模式之禅》

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年7月16日
下一篇 2022年7月16日

相关推荐

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息