码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-09-26 02:07:08      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   使用   java   ar   sp   

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

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

  我们先看类图:

bubuko.com,布布扣

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

 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就可以了,这个不多说了,自己领会吧。

 

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

标签:style   blog   http   color   io   使用   java   ar   sp   

原文地址:http://www.cnblogs.com/initial-road/p/strategy_pattern.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!