一、问题产生背景

当我们进行一系列处理时(员工工资核算,会员管理,计算器,优惠活动),会有很多相似的算法和处理过程,只是由于具体的算法的差异,导致必须不同处理。这些处理和客户端无关,我们可以把这些算法抽象,然后进行处理。之所以叫策略,基本含义就是

针对一个问题,采用一种处理策略。

二、策略模式的通常做法

1、将类似的算法分离,并抽象。

2、客户端选择算法(可以结合简单工厂模型,将矛盾转移到别的类里面)

3、Context调用算法。(Context是业务处理过程中的全部业务信息)

三、具体实例

我想要实现一个简单的计算器功能,首先我要面对的是+、-、*、/四则运算四个算法,我们可以将它抽象

    public abstract class AbstractCalculation
{
public void Show()
{
Console.WriteLine("这里是一个具体的计算");
} public abstract int Calculation(int iInputLeft, int iInputRight);
}

然后实现各个具体的运算(以+为示例,其它类似)

    public class Plus : AbstractCalculation
{
public override int Calculation(int iInputLeft, int iInputRight)
{
return iInputLeft + iInputRight;
}
}

这样我们的抽象工作就完成了。

下面我们写上下文类(Context,包含业务处理的全部信息,变量以及操作)

   public class Context
{
private int LeftOperator = ;
private int RightOperator = ;
private AbstractCalculation calculation = null; public Context(AbstractCalculation calculation, int iInputLeft, int iInputRight)
{
this.calculation = calculation;
LeftOperator = iInputLeft;
RightOperator = iInputRight;
} public int Calculate()
{
Console.WriteLine("Start Calculate");
try
{
return calculation.Calculation(LeftOperator, RightOperator);
}
catch (Exception ex)
{
throw ex;
} }
}

我们为了简化客户端,采用简单工厂模式将选择的矛盾转义到SimpleFactory中

   public class SimpleFactory
{
public static AbstractCalculation CreateCalculation(string oper)
{
switch (oper)
{
case "+":
return new Plus();
case "-":
return new Minus();
case "*":
return new Mutiply();
case "/":
return new Division();
default:
throw new Exception("不支持的操作!"); }
} }

最后进行组合调用:

    class Program
{
static void Main(string[] args)
{
Console.WriteLine("策略模式Demo"); int intResult = ;
int leftOperator;
int rightOperator;
string oper; while (true)
{
Console.WriteLine("请输入第一个操作数:");
leftOperator = Convert.ToInt32( Console.ReadLine());
Console.WriteLine("请输入操作符:");
oper = Console.ReadLine();
Console.WriteLine("请输入第二个操作数:");
rightOperator = Convert.ToInt32(Console.ReadLine()); AbstractCalculation calculation = SimpleFactory.CreateCalculation(oper);
Context context = new Context(calculation, leftOperator, rightOperator);
intResult = context.Calculate(); Console.WriteLine("{0}{1}{2}={3}",leftOperator,oper,rightOperator,intResult);
} }
}

四、设计模式分析

优点:a、将与具体业务无关的算法分离,便于添加。通常的,因为面向对象语言的最小单位是类,我们最好是添加算法类,而不是修改算法类。

b、由于context层将算法分离,因此可以添加一些其他渠道的参数,或者添加特殊处理,或者添加日志等。

缺点:并没有解决需要选择算法的矛盾,因此需要结合其他的设计模式处理,就像本利中添加了一个简单工厂,将矛盾从客户端转移,如果需要进一步处理,可以采用反射+配置文件的方式,或者依赖注入。

代码链接

设计模式のStrategyPattern(策略模式)----行为模式的更多相关文章

  1. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  2. PHP设计模式之策略模式

    前提: 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查 找.排序等,一种常用的方法是硬编码(Hard Cod ...

  3. JavaScript设计模式之策略模式(学习笔记)

    在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选 ...

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

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

  5. JavaScript设计模式之策略模式

    所谓"条条道路通罗马",在现实中,为达到某种目的往往不是只有一种方法.比如挣钱养家:可以做点小生意,可以打分工,甚至还可以是偷.抢.赌等等各种手段.在程序语言设计中,也会遇到这种类 ...

  6. 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查

    原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...

  7. [design-patterns]设计模式之一策略模式

    设计模式 从今天开始开启设计模式专栏,我会系统的分析和总结每一个设计模式以及应用场景.那么首先,什么是设计模式呢,作为一个软件开发人员,程序人人都会写,但是写出一款逻辑清晰,扩展性强,可维护的程序就不 ...

  8. 设计模式之——浅谈strategy模式(策略模式)

    strategy模式,即策略模式.个人觉得吧,策略模式更多的是一种思维方式. 首先我们要知道,为什么需要策略模式.举个例子,比如用程序输出今天下午去玩什么. PlayGame 玩游戏 package ...

  9. 设计模式(Python)-策略模式

    本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...

  10. 设计模式入门,策略模式,c++代码实现

    // test01.cpp : Defines the entry point for the console application.////第一章,设计模式入门,策略模式#include &quo ...

随机推荐

  1. .net反编译的九款神器(转载)

    .net反编译的九款神器  转载来源: https://www.cnblogs.com/zsuxiong/p/5117465.html 本人搜集了下8款非常不错的.Net反编译利器: 1.Reflec ...

  2. [日常]总结2016年7月入职至2016年7月26号微盘所遇bug

    2016年刚入职后在新浪微盘项目上所遇到的问题: 1.前端接口的程序不同版本问题,版本号在程序路径中区分,比如2.4.2/lib/sdk/api/weipan/Client.php 2.文件夹接口的m ...

  3. mysql全文索引之模糊查询

    旧版的MySQL的全文索引只能用在MyISAM表格的char.varchar和text的字段上. 不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息大家可以随时关注官网, ...

  4. Josephu(约瑟夫)问题解析

    Josephu问题为: 设置编号为1,2,3,......n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1看是报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人出 ...

  5. crontab工具安装和检查

    什么是crontab?crontab 是一个用于设置周期性执行任务的工具 重启crond守护进程 systemctl restart crond 查看当前crond状态 systemctl statu ...

  6. babel在项目里的使用

    1.手动在项目里创建文件 .babelrc 2.安装 $ npm install --save-dev babel-cli # ES2015转码规则 $ npm install --save-dev ...

  7. 2016年 CodePen 最热门的前端代码 Top 100

    每年 Codepen 都会公布年度最热门的代码片段,这些片段有的技术超弦,有的超实用.有的超有创意,有空看看都能给我们带来灵感. 同时从 Codepen 的代码上也能学习一些牛人的写法,不管是设[…… ...

  8. POJ1275 Cashier Employment(差分约束)

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9078   Accepted: 3515 Description A sup ...

  9. 如何为你的 Vue 项目添加配置 Stylelint

    如何为你的 Vue 项目添加配置 Stylelint 现在已经是 9102 年了,网上许多教程和分享帖都已经过期,照着他们的步骤来会踩一些坑,如 stylelint-processor-html 已经 ...

  10. 2018-11-06 Visual Studio Code插件-英汉词典初版发布

    VS插件市场地址: 英汉词典 - Visual Studio Marketplace 开源在: program-in-chinese/vscode_english_chinese_dictionary ...