Java开发之设计模式--策略模式(Strategy Pattern)

来源:互联网 发布:北京地下室 知乎 编辑:程序博客网 时间:2024/04/25 23:17

模拟场景:

刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。

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

类图

这里写图片描述

Java程序

  • 三个妙计是同一类型,那咱就写个接口:
package com.zanelove.strategy;/** * I'm glad to share my knowledge with you all. * 首先定一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口 * */public interface IStrategy {    //每个锦囊妙计都是一个可执行的算法    public void operate();}
  • 三个妙计,三个实现类:

1.

package com.zanelove.strategy;/** * I'm glad to share my knowledge with you all.  * 找乔国老帮忙,使孙权不能杀刘备 */public class BackBoor implements IStrategy {    public void operate() {        System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");    }}

2.

package com.zanelove.strategy;/** * I'm glad to share my knowledge with you all.  * 求吴国太开个绿灯 */public class GivenGreenLight implements IStrategy {    public void operate() {        System.out.println("求吴国太开个绿灯,放行!");    }}

3.

package com.zanelove.strategy;/** * I'm glad to share my knowledge with you all.  * 孙夫人断后,挡住追兵 */public class BlockEnemy implements IStrategy {    public void operate() {        System.out.println("孙夫人断后,挡住追兵");    }}
  • 三个妙计入锦囊:
package com.zanelove.strategy;/*** I'm glad to share my knowledge with you all. * 计谋有了,那还要有锦囊*/public class Context {     //构造函数,你要使用哪个妙计    private IStrategy strategy;    public Context(IStrategy strategy){        this.strategy = strategy;     }    //使用计谋了,看我出招了     public void operate(){        this.strategy.operate();     }}

然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列的、还想着娶纯情少女的、色迷迷的刘老爷子去入赘了,嗨,还别说,小亮的三个妙计还真是不错,瞅瞅:

  • 赵云出场,一个顶俩:
package com.zanelove.strategy;/** * I'm glad to share my knowledge with you all.  */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(); //孙夫人退兵    } }

策略模式优点:

算法的使用和算法本身解耦,即把变化的具体算法封装了起来。策略模式是除了继承之外的一种弹性替代方案,如果你使用继承定义了一个类,下面有部分的派生类,此时你会让基类所困住,要想修改它特别不容易,而策略模式则可能通过组合不同的对象来改变行为。

策略模式缺点:

1、 虽说客户代码无须关心各个策略是如何实现的,但是它们还是要知道有多少种策略实现,具体功能情况,这样才可以根据需要使用哪个策略。
2、 使用策略模式后出现很多小类。

就这三招,搞的周郎是“陪了夫人又折兵”呀!这就是策略模式,高内聚低耦合的特点也表现出来了, 还有一个就是扩展性,也就是 OCP 原则,策略类可以继续增加下去,只要修改 Context.java 就可以了,这 个不多说了,自己领会吧。

0 0
原创粉丝点击