Java设计模式----策略模式
策略模式(Strategy Pattern)体现了两个很主要的面向对象设计的原则
1、封装变化的概念。
2、编程中使用接口。而不是对接口的实现。
策略模式定义了一个共同的抽象算法接口,其子类实现这个接口定义的方法。而且都有各自不同的实现。这些算法实现能够在client调用它们的时候互不影响的变化。
子算法之间是弱连接的关系,提高了软件的可扩展性与可重用性。
策略模式组成
1、抽象策略角色:策略类。通常由一个接口或者抽象类实现
2、详细策略角色:包含了相关的算法和行为,可能不止一个详细策略角色
3、环境角色:持有一个策略类的引用,终于给client调用的。
策略模式编写步骤
1、对一组算法抽象出一个共同接口,定义这个共同接口
2、编写策略类,实现这个借口,每一个策略类都有其独特的实现
3、编写环境角色类,类中持有一个对共同接口的引用,对策略对象注入如set方法和get方法或者用构造方法完毕赋值
以下是一个策略模式事例
刘备要到江东娶老婆了。走之前诸葛亮给赵云(伴郎)三个锦囊妙计。说是按天机拆开解决棘手问题,嘿,还别说,真是攻克了大问题。搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。
先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计。运行,然后获胜。用 JAVA 程序怎么表现这个呢?我们先看类图:
三个妙计是同一类型的东东。那咱就写个接口:
package com.sanguo.strategy; /** * 定义策略接口 * 诸葛亮妙计接口 * */ public interface IStrategy { //每一个锦囊妙计都是一个可运行的算法 public void operate(); }
然后再写三个实现类,有三个妙计嘛:
package com.sanguo.strategy; /** * 走后门算法 * */ public class BackDoor implements IStrategy { @Override public void operate() { System.out.println("找乔国老帮忙,让吴国太给孙权施加压力"); } }
package com.sanguo.strategy; /** * 求吴国太开绿灯算法 * */ public class GivenGreenLight implements IStrategy { @Override public void operate() { System.out.println("求吴国太开绿灯,放行!"); } }
package com.sanguo.strategy; /** * 孙夫人断后挡追兵 * */ public class BlockEnemy implements IStrategy { @Override public void operate() { System.out.println("孙夫人断后。挡住追兵"); } }
好了,大家看看。三个妙计是有了,那须要有个地方放这些妙计呀,放锦囊呀:
package com.sanguo.strategy; /** * 环境角色。主要完毕对特定策略的调用 这里代表诸葛亮装计策的锦囊 * */ public class Context { private IStrategy strategy; public Context(IStrategy strategy) { this.strategy = strategy;// 构造函数,你要使用的计策算法 } //使用计谋,看我出招 public void operate() { this.strategy.operate(); } }
然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列的、还想着娶纯情少女的、色迷迷的刘老爷子去入赘了,嗨,还别说。小亮的三个妙计还真是不错,瞅瞅:
package com.sanguo.strategy; public class ZhaoYun { public static void main(String[] args) { Context context; // 刚刚到吴国的时候拆第一个 context = new Context(new BackDoor()); // 拿到妙计 context.operate(); // 拆开运行 // 刘备乐不思蜀了,拆第二个了 context = new Context(new GivenGreenLight()); context.operate(); // 运行了第二个锦囊了 // 孙权的小兵追了,咋办?拆第三个 context = new Context(new BlockEnemy()); context.operate(); // 孙夫人退兵 } }
运行结果。![]()