【设计模式】策略模式 (Strategy Pattern)
策略模式是一种很简单的基础模式,用于封装一系列算法,使客户端的访问独立于算法的实现。我们可以”井中取水”来形象的描述策略模式。“取水”是一个动作,完成这个动作的方式有很多中,可以直接用手提、可以用水车汲水、也可以用电泵抽水。在不同的环境和条件下,我们选择不同的取水方式,这就是策略模式。
策略模式的应用场景
1,有大量动作相同实现不同的行为模式需要配置,以使在适当的环境下选择恰当的行为。
2,算法或实现需要一系列不同的变量。同样的行为在不同的前提下产生不同的结果。
3,有复杂的算法、数据结构或实现需要对客户端隐藏。
UML图

解释
Context 用于封装和隐藏策略,客户端访问 Context 类来完成策略的调用。一般用来存储环境参数,为算法的选择提供依据。
Strategy 策略基类。用于提供策略接口。
ConcreteStrategy 策略的具体实现类,封装各自的算法。
Context 和 Strategy 的交互来完成算法的选择。可以在策略类调用时传入算法所需的参数,也可以将Context作为参数传入算法,让算法在内部自己决定需要那些参数。
一般客户端实例化Strategy然后传入 Context 中,然后客户端与 Context 交互。
代码
略。。。
总结
1,策略模式适用于动作单一,即能抽象出较简单的统一接口的情形。
2,策略模式是一大堆算法的封装。策略模式提供统一的接口访问大量不同的策略算法。
3,如果策略需要的外部参数极少,则可以直接继承Strategy。
继承同样提供了统一接口的封装特性,但是没有Context的情况下,策略的环境参数和具体实现被揉在一起,让策略集合更难维护。某些情况下甚至无法抽象出统一的接口。
4,策略模式有助于消除代码中的条件选择。我们知道,代码中大量出现的 if else 和 switch case ,让维护变得更加困难。策略模式对于消除这种现象非常有帮助 。
5,策略模式可以让我们在不同算法中选择一个有利的实现,但前提是客户端需要知道所有的策略。比如WPF的 Brush就有许多不同的实现,要正确使用Brush,需要了解系统提供的brush类型。
6,不同的策略需要不同的参数,Context 需要提供的参数可能过多。客户端在使用 Context 的时候就可能需要配置大量参数,同时也谁增加Context 和 Strategy的耦合度。
7,类型系统膨胀。策略模式导致增加大量子类。
【设计模式】策略模式 (Strategy Pattern)的更多相关文章
- 设计模式 - 策略模式(Strategy Pattern) 具体解释
策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...
- 设计模式——策略模式(Strategy Pattern)
写在前面: 直接将书中的例子用来作为记录自己学习的成果,不知道这样好不好,如果给原作者带来什么不利的影响不妨告知一声,我及时删掉. UML图: 抽象策略:Strategy package com.cn ...
- C#设计模式——策略模式(Strategy Pattern)
一.概述我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆if…else…语句或者是switch…case…语句.如果该企业中不同级 ...
- 24种设计模式-策略模式(Strategy Pattern)
一.优点: 1. 策略模式提供了管理相关的算法族的办法.策略类的等级结构定义了一个算法或行为族.恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码. 2. 策略模式提供了可以替换继承关系的 ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
- 反馈法学习设计模式(一)——策略模式Strategy Pattern
简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...
- HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)
策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式… Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- 二十四种设计模式:策略模式(Strategy Pattern)
策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...
随机推荐
- Bootstrap 3 How-To #3 布局
对于 Web 开发来说,一个永远的话题是如何创建一个跨浏览器兼容的布局.许多年来,各种框架使用各种技术来解决这个问题.Bootstrap 使用了一个不同的方式来解决这个问题.基于 960 像素的布局 ...
- Laxcus大数据管理系统2.0(14)- 后记
后记 Laxcus最早源于一个失败的搜索引擎项目,项目最后虽然终止了,但是项目中的部分技术,包括FIXP协议.Diffuse/Converge算法.以及很多新的数据处理理念却得以保留下来,这些成为后来 ...
- CnBlogs博文排版技巧(转)
看的一篇讲博文排版技巧的文章,虽然有些地方有些过时,不过还是有些可以借鉴地方的 http://www.cnblogs.com/lyj/archive/2008/11/30/1344463.html
- win7下Oracle 11的安装
把下载的win32_11gR2_database_1of2.zip和win32_11gR2_database_2of2.zip解压到一个database文件夹下,运行安装文件 Oracle11的卸 ...
- 【测试】在hr用户下自行创建T1和T2表写一条SQL语句,(NL连接)
SQL> select t1.* from t1,t2 where t1.object_id=t2.object_id; rows selected. Execution Plan ------ ...
- cocos2d-x Android版游戏之中国移动SDK嵌入
. 拷贝API 将SDK\runtime\CMBilling20007.jar拷贝至游戏工程的runtime目录下(或其他目录) ,但切记不能放在libs目录下编译,否则编译报错(如:bad rang ...
- android大项目运行中出现问题汇总
Android 项目中,特别是当项目文件和规模达到一定的程度后,会引发一些平常不常见的问题. 下面对遇到的一些问题做一个汇总和总结. scenario 1: 在项目中,我们采用了chromimum内核 ...
- Acronis Server备份Linux系统
Acronis Server备份Linux系统 前段时间用Acronis Disk Director Suite解决了Thinkpad笔记本在win7的分区问题(http://chenguang.bl ...
- Windows Socket网络编程-2016.01.07
在使用WSAEventSelect的套接字模型中,遇到了WSAEventSelect返回10038的错误,在定位解决的过程中,简单记录一些定位解决的手段摘要. 使用windows的错误帮助信息,使用命 ...
- 关于Oracle的rac集群和mysql Galera Cluster的想法
到了新公司,公司用的是rac,我比较熟悉mysql第三方的集群方案Galera Cluster这类多主集群, 下面是我参考了他人对rac的介绍,然后和mysql方案进行的臆测级别的分析对比. rac和 ...