首页 > 代码库 > Java设计模式----策略模式
Java设计模式----策略模式
策略模式(Strategy Pattern)体现了两个非常基本的面向对象设计的原则
1、封装变化的概念;
2、编程中使用接口,而不是对接口的实现。
策略模式定义了一个共同的抽象算法接口,其子类实现这个接口定义的方法,并且都有各自不同的实现,这些算法实现可以在客户端调用它们的时候互不影响的变化。 子算法之间是弱连接的关系,提高了软件的可扩展性与可重用性。
策略模式组成
1、抽象策略角色:策略类,通常由一个接口或者抽象类实现
2、具体策略角色:包括了相关的算法和行为,可能不止一个具体策略角色
3、环境角色:持有一个策略类的引用,最终给客户端调用的。
策略模式编写步骤
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(); // 孙夫人退兵 } }
执行结果,
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。