最近觅得一本好书《您的设计模式》,读完两章后就能断言,一定是一头极品屌丝写的,而且是专写给开发屌丝男的智慧枕边书,小女子就委屈一下,勉强看看,人笨,谁让他写得这么通俗易懂呢!为了加深理解,用自己的方式记录下来。

  上第一章的策略模式之前讲个故事,解释一下类设计的背景:刘备要去江东娶老婆,临走时诸葛亮给伴郎赵云三个锦囊妙计,嘱咐按天机拆开解决棘手问题。这才有了后来的周瑜赔了夫人又折兵。三个妙计放在锦囊中,赵云从锦囊中取妙计获胜。先看类图:

1.三个妙计是具体的实现类,我们设计一个接口,再写三个实现类:  

public interface IStrategy {
  //每个锦囊妙计都是一个可执行的算法
  public void operate();
}

public class BackDoor implements IStrategy {
  public void operate() {
  System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
  }
}

public class GivenGreenLight implements IStrategy {
  public void operate() {
  System.out.println("求吴国太开个绿灯,放行!");
  }
}

public class BlockEnemy implements IStrategy {
  public void operate() {
  System.out.println("孙夫人断后,挡住追兵");
  }
}

2.三个妙计有了,装在锦囊里,需要设计一个入口类,方便赵云调用:

public class Context {
  //构造函数,你要使用哪个妙计
  private IStrategy straegy;
  public Context(IStrategy strategy){
  this.straegy = strategy;
  }
  //使用计谋,看我出招
  public void operate(){
  this.straegy.operate();
  }
}

3.赵云出场,挨个拆开妙计,周瑜接招:

public class ZhaoYun {

  public static void main(String[] args) {
    Context context;
    //刚刚到吴国的时候拆第一个
    System.out.println("-----------刚刚到吴国的时候拆第一个-------------");
    context = new Context(new BackDoor()); //拿到妙计
    context.operate(); //拆开执行
    System.out.println("\n\n\n\n\n\n\n\n");
    //刘备乐不思蜀,拆第二个
    System.out.println("-----------刘备乐不思蜀,拆第二个-------------");
    context = new Context(new GivenGreenLight());
    context.operate(); //执行第二个锦囊
    System.out.println("\n\n\n\n\n\n\n\n");
    //孙权的小兵追来,咋办?拆第三个
    System.out.println("-----------孙权的小兵追来,咋办?拆第三个-------------");
    context = new Context(new BlockEnemy());
    context.operate(); //孙夫人退兵
    System.out.println("\n\n\n\n\n\n\n\n");
    /*
    *问题来了:赵云实际不知道是那个策略呀,他只知道拆第一个锦囊,
    *而不知道是BackDoor这个妙计,咋办? 似乎这个策略模式已经把计谋名称写出来了
    ** 错! BackDoor、 GivenGreenLight、 BlockEnemy只是一个代码, 你写成first、 second、third,没人会说你错!    
    */
  }
}

4.这就是策略模式,高内聚低耦合,而且扩展性好,要增加策略类,修改Context.java就行,所以应用广泛。

Java设计模式1——策略模式(Strategy Pattern)的更多相关文章

  1. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  2. 反馈法学习设计模式(一)——策略模式Strategy Pattern

    简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...

  3. JAVA设计模式之策略模式 - Strategy

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

  4. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式… Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

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

    策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...

  6. 设计模式原来如此-策略模式(Strategy Pattern)

    策略模式中体现了两个非常基本的面向对象设计的原则:1.封装变化的概念.2.编程中使用接口,而不是对接口的实现. 策略模式的定义:定义一组算法,将每个算法都封装起来,并使它们之间可以互换.策略模式使这些 ...

  7. 【UE4 设计模式】策略模式 Strategy Pattern

    概述 描述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法的变化不会影响到使用算法的客户. 套路 Context(环境类) 负责使用算法策略,其中维持了一 ...

  8. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

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

    策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...

  10. HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)

    策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...

随机推荐

  1. vm虚拟机安装雨林木风ghost镜像

    每次安装总是提示没办法加载镜像,或者镜像不存在,总之就是读取不到光驱里的镜像文件. 这是需要注意的两点:cd光驱模式设置为IDE,不能是scsi和sata两种模式,然后再进入winpe系统就行.

  2. 三级联动(在YII框架中)

    //三级联动 //数据库代码过多就不上传了 //视图 <div class="area">    <table class="table"&g ...

  3. Silverlight RadChart :创建十字定位&圈选

    //图像加载 void Chart_Loaded(object sender, RoutedEventArgs e) { var plotAreaPanel = this.radChart.Defau ...

  4. maven项目导入tomcat7源码

    大家好,今天给大家分享对于tomcat源码在eclipse上的导入运行.此次为以tomcat7为例. 1去官网tomcat7的下载页面下载源码网址http://tomcat.apache.org/do ...

  5. Bash命令积累

    复制本目录下除掉所有的.png文件外的所有其他文件到某个目录下: mv -f !(*.png) ./src/ 除掉所有的.png文件外其余的文件,全部删掉 rm -f !(*.png) 本目录下,不显 ...

  6. 移动支持 – ASP.NET MVC 4 系列

           目前,有各种各样的方法可以提高网站应用程序的移动体验.在某些情况下,我们只想在小规格上做一些微小的风格变化:另一些情况下,我们可能完全改变外观显示或者一些视图的内容:最极端的情况下,我们 ...

  7. Businessworks的设计思想

    Businessworks的设计思想基于一下三篇ATA: <从Eclipse平台看交易平台化>,强调微内核和扩展机制实现 <Google Guice平台模块化开发的果汁>,讨论 ...

  8. [转]windows下编译及使用libevent

    http://www.cnblogs.com/luxiaoxun/p/3603399.html Libevent官网:http://libevent.org/ windows 7下编译: 编译环境:  ...

  9. IOS开发UI基础学习-------总结

    什么叫控件? 屏幕上所有UI元素都叫做控件(也有叫做视图.组件) 控件的共同属性 尺寸 位置 背景色 ... 苹果将控件的共同属性都抽取到父类UIView中 所有控件最终都继承自UIView 父子控件 ...

  10. [zz] 海洋环境的光能传递

    source: http://cgangs.com/article/2557?source=weibo 就我们的目的来说,海洋环境仅由四部分组成:水表.空气.阳光和水表以下部分.在本节中,我们在数学和 ...