24种设计模式--策略模式【Strategy Pattern】

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

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

  我们先看类图:

三个妙计是同一类型的东东,那咱就写个接口:

 1 package com.iadmob.strategy;
 2
 3 /**
 4 * @author http://www.cnblogs.com/initial-road/
 5 */
 6 public interface IStrategy {
 7
 8   //每个锦囊妙计都是一个可执行的算法
 9   public void operate();
10
11 }
12
13 然后在写三个实现类,有三个妙计嘛:
14
15
16 package com.iadmob.strategy;
17
18
19 /**
20 * @author http://www.cnblogs.com/initial-road/
21 * 找乔国老帮忙,使孙权不能杀刘备
22 */
23 public class BackDoor implements IStrategy {
24
25
26   @Override
27   public void operate() {
28     System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
29   }
30
31
32 }
33
34
35
36 package com.iadmob.strategy;
37
38 /**
39 * @author http://www.cnblogs.com/initial-road/
40 * 求吴国太开个绿灯
41 */
42 public class GivenGreenLight implements IStrategy {
43
44   @Override
45   public void operate() {
46     System.out.println("求吴国太开个绿灯,放行!");
47   }
48
49 }
50
51
52
53 package com.iadmob.strategy;
54
55 /**
56 * @author http://www.cnblogs.com/initial-road/
57 * 孙夫人断后,挡住追兵
58 */
59 public class BlockEnemy implements IStrategy {
60
61   @Override
62   public void operate() {
63     System.out.println("孙夫人断后,挡住追兵");
64   }
65
66 }
67
68 //好了,大家看看,三个妙计是有了,那需要有个地方方这些妙计呀,放锦囊呀:
69
70 package com.iadmob.strategy;
71
72 /**
73 * @author http://www.cnblogs.com/initial-road/
74 * 计谋有了,那还要锦囊
75 */
76 public class Context {
77   //构造函数,你要使用哪个妙计
78   private IStrategy strategy;
79
80   public Context(IStrategy strategy){
81     this.strategy = strategy;
82   }
83
84   //使用计谋了,看我出招了
85   public void operate(){
86     this.strategy.operate();
87   }
88 }

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

 1 package com.iadmob.strategy;
 2
 3 /**
 4 * @author http://www.cnblogs.com/initial-road/
 5 */
 6 public class ZhaoYun {
 7   /**
 8   * 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
 9   */
10   public static void main(String[] args){
11     Context context;
12     //刚刚到吴国的时候拆第一个
13     System.out.println("--------刚刚到吴国的时候拆了一个--------");
14     context = new Context(new BackDoor());    //拿着妙计
15     context.operate();    //拆开执行
16     System.out.println("\n\n\n\n\n\n\n");
17
18     //刘备乐不思蜀,拆第二个
19     System.out.println("--------刘备乐不思蜀,拆第二个了--------");
20     context = new Context(new GivenGreenLight());
21     context.operate();    //执行第二个锦囊了
22     System.out.println("\n\n\n\n\n\n\n");
23
24     //孙权的小兵追了,咋办?拆第三个
25     System.out.println("--------孙权的小兵追了,咋办,拆第三个--------");
26     context = new Context(new BlockEnemy());
27     context.operate();    //孙夫人退兵
28     System.out.println("\n\n\n\n\n\n\n");
29
30     /**
31     * 问题来了:赵云实际不知道是那个策略,他只知道拆第一个锦囊,
32     * 而不知道是BackDoor这个妙计,咋办?似乎这个策略模式已经把计谋名称写出来了
33     * 错!BackDoor、GivenGreenLight、BlockEnemy只是一个代码,你写成first、second、
34     * third,没人会说你错!
35     *
36     * 策略模式的好处就是:体现了高内聚低耦合的特性呀,缺点嘛,这个那个,我回去在查查
37     */
38
39    }
40 }

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

时间: 2024-12-15 22:20:47

24种设计模式--策略模式【Strategy Pattern】的相关文章

设计模式 - 策略模式(Strategy Pattern) 具体解释

策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全部, 禁止转载, 如有须要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间能够相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族须要常常扩展新的功能, 为了使用父类比較灵活的加入子类, 把父类的行为写成接口(interface)的形式; 使用set()方法

设计模式 - 策略模式(Strategy Pattern) 详解

策略模式(Strategy Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权所有, 禁止转载, 如有需要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间可以相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族需要经常扩展新的功能, 为了使用父类比较灵活的添加子类, 把父类的行为写成接口(interface)的形式; 使用set()方法,

设计模式---策略模式Strategy Pattern

策略模式 定义:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 问题:有一个鸭子类定义了鸭子的种种行为,包括swim(),quack(),fly(),但是,并不是所有的鸭子都会飞行(fly)或者叫(quack),在这里,我们认为所有的鸭子都会浮在水面上(swim).如何实现各种不同的鸭子的不同的表现. 解决方法:第一个想到的会使继承,在鸭子父类中定义好所有的方法,在实现鸭子子类的过程中,对不满足于具体的鸭子的行为进行覆盖,但是在这种方法

设计模式---策略模式(Strategy Pattern)

先说几个例子,让大家对策略模式有个感性的认识:比如玩RPG游戏时,一个人物可以拥有多种武器,但是攻击时只能使用一把武器,切换武器的过程其实就是一个策略模式的应用. 故事案例:鸭子很多种(活生生的鸭子,橡皮鸭,模型鸭,木头鸭...),共性是可以swim,display(即给别人看),活生生的鸭子可以嘎嘎叫,橡皮鸭子可以吱吱叫,模型鸭可以飞,木头鸭什么特别之处都没有,那我们怎么处理这个问题呢? 思路一:鸭子作为一个抽象类(Duck),然后这些具体的鸭子就继承他,并重新新增一些自己特有的方法.(好像感

二十四种设计模式:策略模式(Strategy Pattern)

策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里(两种可互换的算法).由客户端决定使用哪种算法. MessageModel using System; using System.Collections.Generic; using System.Text; na

如何让孩子爱上设计模式 ——14.策略模式(Strategy Pattern)

如何让孩子爱上设计模式 --14.策略模式(Strategy Pattern) 描述性文字 本节讲解的是行为型设计模式中的第一个模式: 策略模式, 这个模式非常简单,也很好理解. 定义一系列的算法,把每个算法封装起来,并使得他们可以相互替换, 让算法独立于使用它的客户而变化. 一般用来替换if-else,个人感觉是面向过程与面向对象思想的 过渡,这里举个简易计算器的栗子,帮助理解~ 普通的if-else/switch计算器 普通的面向过程if-else简易计算器代码如下: 运行结果如下: 这里我

策略模式(Strategy Pattern)

策略模式(Strategy Pattern) 抛开晦涩的定义,首先看一个例子: 我们想要创建一个模拟鸭子的游戏,在这个游戏中,会有各种类型的鸭子,比如mallard duck,red head duck,rubber duck(除了rubber duck(橡皮鸭),看见这其余两种鸭子很好奇,于是查找相关图片,发现mallard duck是绿头鸭,red head duck是红头鸭,自己生活中还没有见过,有趣,哈哈!三种鸭子图片如下所示). 回归话题,在这个模拟鸭子的游戏中,各种鸭子均有两种能力,

设计模式---策略模式Strategy(对象行为型)

1. 概述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理. 2. 应用场景 (1)多个类只区别在表现行为不同,在运行时动态选择具体要执行的行为. (2)需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现. (3)对客户隐藏具体策略(算法)的实现细节,彼此完全独立. 3. 示例 出行旅游:我们可以有几个策略可以考虑:可

说说设计模式~策略模式(Strategy)

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.而对于客户端(UI)来说,可以通过IOC再配合工厂模块,实现动态策略的切换,策略模块通常于一个抽象策略对象(interface or abstract class),多个具体策略对象(implement class )和一个调用策略的入口组成. 何时能用到它? 对于UI来说,可能一个功能会有多种实现方式,而且实现方式可能还会有扩展,例如,一个ATM机,它目前支持工行,建行,家行,以后可能又出现了占占银行,而这时,ATM