写在前面:

   直接将书中的例子用来作为记录自己学习的成果,不知道这样好不好,如果给原作者带来什么不利的影响不妨告知一声,我及时删掉。

  UML图:

  

  抽象策略:Strategy   

package com.cnblog.clarck;

/**
* 抽象策略
*
* @author clarck
*
*/
public abstract class Strategy {
/**
* 抽象的算法方法
*/
public abstract void algorithmInterface();
}

  具体算法A:ConcreateStrategyA

package com.cnblog.clarck;

/**
* 具体算A
*
* @author clarck
*
*/
public class ConcreateStrategyA extends Strategy {
/**
* 算法A的方法具体实现
*/
@Override
public void algorithmInterface() {
System.out.println("algorithm A implements !");
} }

具体算法B:ConcreateStrategyB

package com.cnblog.clarck;

/**
* 具体算法B
*
* @author clarck
*
*/
public class ConcreateStrategyB extends Strategy {
/**
* 具体算法B的实现
*/
@Override
public void algorithmInterface() {
System.out.println("algorithm B implements !");
} }

算法C的具体实现:ConcreateStrategyC

package com.cnblog.clarck;

/**
* 算法C的具体实现
*
* @author clarck
*
*/
public class ConcreateStrategyC extends Strategy { /**
* 算法C的方法的实现
*/
@Override
public void algorithmInterface() {
System.out.println("algorithm C implements !");
} }

上下文:Context

package com.cnblog.clarck;

/**
* 上下文
*
* @author clarck
*
*/
public class Context {
Strategy mStrategy; public Context(Strategy strategy) {
mStrategy = strategy;
} //上下文接口
public void ContextInterface() {
mStrategy.algorithmInterface();
}
}

测试例子:Test

package com.cnblog.clarck;

/**
* 单元测试类
*
* @author clarck
*
*/
public class Test { public static void main(String[] args) {
Context context;
context = new Context(new ConcreateStrategyA());
context.ContextInterface(); context = new Context(new ConcreateStrategyB());
context.ContextInterface(); context = new Context(new ConcreateStrategyC());
context.ContextInterface();
} }

  摘抄总结(来源于《大话设计模式》):

    策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它都可以以相同的方式调用所有的算法,减少了各种算法与使用算法类之间的耦合。

    策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取这些算法中的公共部分。策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试

    当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为。将这写行为封装在一个个独立的Stratgy类中,

可以在使用这些行为的类消除条件语句

    策略模式就是用来封装算法的,但在实践中,我们可以发现用它来封装几乎任何类型的规则,只要在分析过程中听到学要
在不同的时间应用不同的业务规则,就可以考虑使用策略模式来处理这种变化的可能性。

    在基本的策略模式中,选择所用具体实现的职责由客户端承担,并转给策略模式的Context对象

    简单工厂与策略模式的区别:
    简单工厂模式需要让客户端知道两个类,但是策略模式(Context)只需要让客户端知道一个类,让耦合性更低。

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

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

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

  2. C#设计模式——策略模式(Strategy Pattern)

    一.概述我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆if…else…语句或者是switch…case…语句.如果该企业中不同级 ...

  3. 24种设计模式-策略模式(Strategy Pattern)

    一.优点: 1. 策略模式提供了管理相关的算法族的办法.策略类的等级结构定义了一个算法或行为族.恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码. 2. 策略模式提供了可以替换继承关系的 ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. scrapy框架之(CrawlSpider)

    一.CrawlSpider简介 如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调pa ...

  2. Oracle 序列(自增ID)

    -- 创建序列CREATE SEQUENCE "JPADMIN"."SEQ_JP_BAS_USER_ID" MINVALUE 1 // 最小值MAXVALUE ...

  3. JENKINS安装及新建用户,权限配置

    JENKINS安装及新建用户,权限配置 1. 下载安装 jenkins 官网地址https://jenkins.io/index.html 下载地址https://jenkins.io/downloa ...

  4. VUE--mixins的一些理解。

    概念:混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. 用法: 1.创建混 ...

  5. 【3dsMax安装失败,如何卸载、安装3dMax 2015?】

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  6. 详解http之post

    详解http之post 首先,我们先看看jquery中的post方法的使用: $.ajax({ url:'api/bbg/goods/get_goods_list_wechat', data:{ , ...

  7. 再探canvas(小球实例)

    之前学习过canvas的一些使用,也用过canvas绘制过时钟, 但是很久不用,有些遗忘了,这里做一个简单的回顾. 在web页面创建一个canvas画布非常简单,如下即可: <canvas id ...

  8. 吴恩达《Machine Learning Yearning》总结(11-20章)

    11.何时修改开发集.测试集和度量指标 开展一个新项目,尽快选好开发集和测试集:例子,根据度量指标A分类器排在B分类器前面,但是团队认为B分类器在实际产品上优于A分类器,这时就需要考虑修改开发集和测试 ...

  9. 1.Vue.js的常用指令

      Vue.js介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得 ...

  10. Halcon学习笔记——机器视觉应用工程开发思路及相机标定

    机器视觉应用工程开发思路 机器视觉应用工程主要可划分为两大部分,硬件部分和软件部分. 1.硬件部分,硬件的选型至关重要,决定了后续工作是否可以正常开展,其中关键硬件部分包括:光源,相机以及镜头. 2. ...