设计模式之策略模式学习
摘 要
策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
--《HeadFirst设计模式》
一般来说这些算法完成的工作都是一样的,只是它们的实现不一样而已,通过策略模式可以定义一个公共的接口去调用不同的算法类,从而降低了算法类和调用算法类的耦合度。
关键字:策略模式,接口,抽象类,继承
1 策略模式分析
策略模式是一种定义一系列算法的方法,定义一个公共的接口,然后使用不同的算法类实现不同的算法。 应用场合:只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
优点:通过抽象出公共的接口,从而降低算法类和调用算法类的耦合度(降低耦合度),每个算法都有自己的类,从而方便了每个算法类的单元测试。
不足:我们在策略类里面都直接实例化了各种算法的类,这大大提高了策略类和算法类的耦合度,而且每当我们修改策略类的时候我们都要重新编译程序(修改方法:反射)。
图1使用策略模式UML
2 代码
{
public override void AlgorithmInterface()
{
Console.WriteLine("算法A实现");
}
}
{
public override void AlgorithmInterface()
{
Console.WriteLine("算法B实现");
}
}
{
public override void AlgorithmInterface()
{
Console.WriteLine("算法C实现");
}
}
{
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类之后的代码:
{
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
设计模式之策略模式学习相关推荐
- 设计模式之策略模式学习笔记
前言 我想大家都加班写过"业务代码",一大堆的if else,甚至if里面套if-代码不得已变得十分臃肿,对应的维护成本也有所增加.而策略模式,就是为了解决违反了开放封闭原则的这一 ...
- Spring源码学习笔记:经典设计模式之策略模式
1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 0.策略模式(Strategy pattern) 指定义了算法家族,分别封装起来,让它们之间可以互相替换,此模 ...
- JavaScript设计模式之策略模式(学习笔记)
在网上搜索"为什么MVC不是一种设计模式呢?"其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composi ...
- 换个姿势学设计模式:策略模式
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...
- 策略设计模式_设计模式之策略模式总结
再上一篇文章<设计模式之策略模式>中,我们通过模拟鸭子项目,了解了什么是策略模式,怎么使用策略模式.本文将通过鸭子项目的学习,对策略模式进行总结. 策略模式: 分别封装行为接口,实现算法族 ...
- 揭秘设计模式:策略模式(Strategy)的枚举(Enum)实现
2019独角兽企业重金招聘Python工程师标准>>> 链接地址:http://www.xx566.com/detail/120.html 上一篇:揭秘设计模式:策略模式(Strat ...
- 设计模式之策略模式+工厂模式+模板模式结合
设计模式之策略模式+模板模式 为什么总是学不好设计模式 从"登录功能"中发现问题. 首先我们简单的了解功能需求: 于是你开始干活了: 1.控制层代码如下,根据不同的登录方式调用不同 ...
- 设计模式之策略模式(Java 实现)
设计模式之策略模式(Java 实现) 大家一定都使用过电子地图.在地图中输入出发地和目的地,然后再选取你的出行方式,就可以计算出最优线路以及预估的时长.出行方式有驾车.公交.步行.骑行等.出行方式不同 ...
- Java设计模式之策略模式与状态模式
一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...
最新文章
- python工程~多个python文件如何运行
- RPA+AI这个278亿市场规模的赛道,IDC的这份报告讲清楚了
- 对 带头结点的单链表 的操作
- Nmap源码分析(整体架构)
- Linux rpm命令详解
- 互联网时代的发展给实体业都造成了不小的冲击
- windows 2008 R2 如何更新SID
- 走过 Google 2005年[zt]
- 华为v9计算机在哪方面的应用,华为手机助手怎么用 HiSuite详细使用教程
- 第二章 人工智能专题之Python进阶 - Matplotlib库
- TFS2010中文版下载
- 网络管理工具IP-Tools的使用
- C++程序设计课程设计报告
- 如果把编程语言比作武器
- 电脑桌面老是弹出计算机,电脑桌面老是弹出游戏怎么解决
- 组态王——创建协议组件失败
- 计算机编程里面counter是什么意思,step在计算机编程中的意思是什么
- win10软件安装出现错误代码2503/2502,解决方案
- 软件内部更新,出现“解析包时出现问题”的错误后停止
- 马拉松赛跑(2019.8.19)