策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

--《HeadFirst设计模式》

一般来说这些算法完成的工作都是一样的,只是它们的实现不一样而已,通过策略模式可以定义一个公共的接口去调用不同的算法类,从而降低了算法类和调用算法类的耦合度。

关键字:策略模式,接口,抽象类,继承

1        策略模式分析

策略模式是一种定义一系列算法的方法,定义一个公共的接口,然后使用不同的算法类实现不同的算法。 应用场合:只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

优点:通过抽象出公共的接口,从而降低算法类和调用算法类的耦合度(降低耦合度),每个算法都有自己的类,从而方便了每个算法类的单元测试。

不足:我们在策略类里面都直接实例化了各种算法的类,这大大提高了策略类和算法类的耦合度,而且每当我们修改策略类的时候我们都要重新编译程序(修改方法:反射)。

图1使用策略模式UML

 

2    代码

class StrategyA : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("算法A实现");
}
}
class StrategyB : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("算法B实现");
}
}
class StrategyC : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("算法C实现");
}
}
class Context
{
private Strategy strategy = null;

public Context(string type)
{
switch(type)
{
case "A":
this.strategy = new StrategyA(); //instance the object
break;
case "B":
this.strategy = new StrategyB();
break;
case "C":
this.strategy = new StrategyC();
break;
}
}

public void ContextInterface()
{
strategy.AlgorithmInterface();
}

}

3        优化

 

大家可能已经发现我是通过在策略类(Context)中实例化算法类的,这样加大了策略类和算法类之间的耦合度,好现在我就使用反射来解决这个问题。

首先我们要在项目中心机一个App.config文件然后我们只需在里面设置好要实例化的类的命名空间就好了。

接下来就像修改策略类(Context)的代码,这里我们是使用反射实例化算法类,使用泛型的优点就是每当我们调用不到的算法只需修改配置文件就OK了,不用重新编译程序(前提是算法类已经存在只是以前没有调用它)。

修改Context类之后的代码:

class Context
{
private Strategy strategy = null;
private static readonly string path = ConfigurationManager.AppSettings["Strategy"];
string className = string.Empty;

public Context(string type)
{

switch(type)
{
case "A":
//this.strategy = new StrategyA(); //instance the object
className = path + ".StrategyA";
this.strategy = (StrategyModel.StrategyA)Assembly.Load(path).CreateInstance(className);
break;
case "B":
//this.strategy = new StrategyB();
className = path + ".StrategyB";
this.strategy = (StrategyModel.StrategyB)Assembly.Load(path).CreateInstance(className);
break;
case "C":
//this.strategy = new StrategyC();
className = path + ".StrategyC";
this.strategy = (StrategyModel.StrategyC)Assembly.Load(path).CreateInstance(className);
break;
}
}

public void ContextInterface()
{
strategy.AlgorithmInterface();
}

}

转载于:https://www.cnblogs.com/rush/archive/2011/01/10/strategy.html

设计模式之策略模式学习相关推荐

  1. 设计模式之策略模式学习笔记

    前言 我想大家都加班写过"业务代码",一大堆的if else,甚至if里面套if-代码不得已变得十分臃肿,对应的维护成本也有所增加.而策略模式,就是为了解决违反了开放封闭原则的这一 ...

  2. Spring源码学习笔记:经典设计模式之策略模式

    1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 0.策略模式(Strategy pattern) 指定义了算法家族,分别封装起来,让它们之间可以互相替换,此模 ...

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

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

  4. 换个姿势学设计模式:策略模式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...

  5. 策略设计模式_设计模式之策略模式总结

    再上一篇文章<设计模式之策略模式>中,我们通过模拟鸭子项目,了解了什么是策略模式,怎么使用策略模式.本文将通过鸭子项目的学习,对策略模式进行总结. 策略模式: 分别封装行为接口,实现算法族 ...

  6. 揭秘设计模式:策略模式(Strategy)的枚举(Enum)实现

    2019独角兽企业重金招聘Python工程师标准>>> 链接地址:http://www.xx566.com/detail/120.html 上一篇:揭秘设计模式:策略模式(Strat ...

  7. 设计模式之策略模式+工厂模式+模板模式结合

    设计模式之策略模式+模板模式 为什么总是学不好设计模式 从"登录功能"中发现问题. 首先我们简单的了解功能需求: 于是你开始干活了: 1.控制层代码如下,根据不同的登录方式调用不同 ...

  8. 设计模式之策略模式(Java 实现)

    设计模式之策略模式(Java 实现) 大家一定都使用过电子地图.在地图中输入出发地和目的地,然后再选取你的出行方式,就可以计算出最优线路以及预估的时长.出行方式有驾车.公交.步行.骑行等.出行方式不同 ...

  9. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

最新文章

  1. python工程~多个python文件如何运行
  2. RPA+AI这个278亿市场规模的赛道,IDC的这份报告讲清楚了
  3. 对 带头结点的单链表 的操作
  4. Nmap源码分析(整体架构)
  5. Linux rpm命令详解
  6. 互联网时代的发展给实体业都造成了不小的冲击
  7. windows 2008 R2 如何更新SID
  8. 走过 Google 2005年[zt]
  9. 华为v9计算机在哪方面的应用,华为手机助手怎么用 HiSuite详细使用教程
  10. 第二章 人工智能专题之Python进阶 - Matplotlib库
  11. TFS2010中文版下载
  12. 网络管理工具IP-Tools的使用
  13. C++程序设计课程设计报告
  14. 如果把编程语言比作武器
  15. 电脑桌面老是弹出计算机,电脑桌面老是弹出游戏怎么解决
  16. 组态王——创建协议组件失败
  17. 计算机编程里面counter是什么意思,step在计算机编程中的意思是什么
  18. win10软件安装出现错误代码2503/2502,解决方案
  19. 软件内部更新,出现“解析包时出现问题”的错误后停止
  20. 马拉松赛跑(2019.8.19)

热门文章

  1. qt绘图事件(画刷的填充)
  2. mysql的安全管理_MySQL安全管理
  3. MLP多层感知机(人工神经网络)原理及代码实现
  4. VC 运行时库 /MD、/MDd 和 /MT、/MTd
  5. 【转】DLL中类的显式链接
  6. Excel进行粗糙的快速更换图片背景颜色
  7. 什么是fine-tuning
  8. Python自动化运维开发----基础(十二)函数
  9. RelativeLayout设置wrap_content无效
  10. 使用 TeamCity 实现持续集成(CI)