- 浏览: 496436 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (329)
- [发布至博客园首页] (12)
- [随笔分类][01] .Net X (59)
- [随笔分类][20] Architecture (16)
- [随笔分类][21] Developer Logs (13)
- [网站分类]Windows 7 (1)
- [随笔分类][13] Oracle & .Net (7)
- [随笔分类][16] Love in China (14)
- [随笔分类][15] Development Tools (20)
- [随笔分类][18] Windows Phone (12)
- [随笔分类][12] Design & Pattern (17)
- [网站分类].NET新手区 (22)
- [网站分类]首页候选区 (2)
- [随笔分类][08] Windows (Server) (13)
- [随笔分类][02] CSLA.Net (3)
- [随笔分类][10] jQuery & javaScript (10)
- [随笔分类][11] SQL Server (4)
- [随笔分类][22] Enterprise Logs (3)
- [随笔分类][03] News (9)
- [随笔分类][19] Quality Assurance (2)
- [随笔分类][05] Silverlight (20)
- [随笔分类][14] Google Earth & .Net (6)
- [网站分类]非技术区 (9)
- [随笔分类][07] WWF (2)
- [随笔分类][04] SharePoint (1)
- [随笔分类][20] Analysis & Design (36)
- [随笔分类][06] WCF (5)
- [随笔分类][12] Architecture (1)
- [随笔分类][09] WPF (0)
- [随笔分类][17] VStudio & Expression (5)
最新评论
-
zhangyy130:
你好,我关于第二段的那个表视图、模型与图这三者的关系我没有看明 ...
UML模型的组成 -
guji528:
谢谢分享!
Enterprise Architect 基础应用 -
studentsky:
好文章,图文并茂!
WCF 第一个用 Visual Studio 2010 创建的WCF服务 -
chen975311486:
用哪个工具画的????
UML中对关系的描述 (二) -
frankies:
继续学习中。。
UML 交互概述图
策略模式定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的用户。
说明:
1.通过继承抽象策略实现多个具体策略方法处理,在一个类中传递不同的具体实例做为参数,获得不同的对象的算法,封装在同一个方法中,当这个类的实例调用这个封装了算法的方法时,因传入的对象参数的不同,获得的处理结果也不同。
2.通过传入的对象参数获得操作,改变一个方法的不同处理结果。
3.工厂方法是通过条件,建什么对象,策略模式是根据条件获得不同的算法。
3.每种算法单独维护即维护的查找,也简单了测试,不影响其他算法。
策略模式解析
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
策略模式可以为一些列相同的算法,提取一个公共的功能,通过参数,获得所需的算法执行。
例题中的打折、返利,都是实际收费其中的一种方式
策略模式+简单工厂模式,组合使用
书中商场管理软件(反射)
配置文件
<?xml version="1.0" encoding="utf-8" ?> <CashAcceptType> <type> <name>正常收费</name> <class>CashNormal</class> <para></para> </type> <type> <name>满300返100</name> <class>CashReturn</class> <para>300,100</para> </type> <type> <name>满200返50</name> <class>CashReturn</class> <para>200,50</para> </type> <type> <name>打8折</name> <class>CashRebate</class> <para>0.8</para> </type> <type> <name>打7折</name> <class>CashRebate</class> <para>0.7</para> </type> </CashAcceptType>
工厂超类
using System; using System.Collections.Generic; using System.Text; namespace 商场管理软件 { abstract class CashSuper { public abstract double acceptCash(double money);//用来定义一个支付接口 } }
using System; using System.Collections.Generic; using System.Text; namespace 商场管理软件 { class CashContext { private CashSuper cs; /// <summary> /// 设置策略类 /// </summary> /// <param name="csuper"></param> public void setBehavior(CashSuper csuper) { this.cs = csuper; } public double GetResult(double money) { return cs.acceptCash(money); } } }
算法实现类
using System; using System.Collections.Generic; using System.Text; namespace 商场管理软件 { /// <summary> /// 打折算法 /// </summary> class CashRebate : CashSuper { private double moneyRebate = 1d; public CashRebate(string moneyRebate) { this.moneyRebate = double.Parse(moneyRebate); } public override double acceptCash(double money) { return money * moneyRebate; } } }
Form用户界面
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Reflection; namespace 商场管理软件 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } DataSet ds;//用于存放配置文件信息 double total = 0.0d;//用于总计 private void Form1_Load(object sender, EventArgs e) { //读配置文件 ds = new DataSet(); ds.ReadXml(Application.StartupPath + "\\CashAcceptType.xml"); //将读取到的记录绑定到下拉列表框中 foreach (DataRowView dr in ds.Tables[0].DefaultView) { cbxType.Items.Add(dr["name"].ToString()); } cbxType.SelectedIndex = 0; } private void btnOk_Click(object sender, EventArgs e) { CashContext cc = new CashContext(); //根据用户的选项,查询用户选择项的相关行 DataRow dr = ((DataRow[])ds.Tables[0].Select("name='" + cbxType.SelectedItem.ToString()+"'"))[0]; //声明一个参数的对象数组 object[] args =null; //若有参数,则将其分割成字符串数组,用于实例化时所用的参数 if (dr["para"].ToString() != "") args = dr["para"].ToString().Split(','); //通过反射实例化出相应的算法对象,调用策略类的设置策略方法,要注意一下反射实例化一个算法对象的时候 Object[] 的参数在此使用了 //上一个实例没有使用反射的这里是通过判断来硬编码选择实例化制定的算法实例 cc.setBehavior((CashSuper)Assembly.Load("商场管理软件").CreateInstance("商场管理软件." + dr["class"].ToString(), false, BindingFlags.Default, null, args, null, null)); double totalPrices = 0d; totalPrices = cc.GetResult(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text)); total = total + totalPrices; lbxList.Items.Add("单价:" + txtPrice.Text + " 数量:" + txtNum.Text + " "+cbxType.SelectedItem+ " 合计:" + totalPrices.ToString()); lblResult.Text = total.ToString(); } /// <summary> /// 清空控件信息 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnClear_Click(object sender, EventArgs e) { total = 0d; txtPrice.Text = "0.00"; txtNum.Text = "1"; lbxList.Items.Clear(); lblResult.Text = "0.00"; } } }
结果显示
发表评论
-
享元模式(Flyweight)
2009-12-13 19:26 750重点概念 1. 这个模式相对简单。享元模式,就是在工厂 ... -
理解软件外包的种类
2009-12-17 21:11 513包项目 包人 包时间 -
解释器模式(Interpreter)
2009-12-20 14:02 594重要概念 1. 给定一个语言,定义它的文法的一种表示,并定义 ... -
访问者模式(Visitor)
2009-12-20 16:13 738重点概念 1. 双分派:得到执行的操作决定于请求的种类和接收 ... -
观察者(发布订阅)模式 与 委托事件
2009-12-02 17:07 975多一些宽容 重点概念 1. 开放封闭原则,修改原有代码就说 ... -
抽象工厂模式(Abstract Factory)
2009-12-02 22:20 1025开闭原则和依赖倒置原则是面向对象设计的重点,编程是一门艺术,大 ... -
状态模式(State)
2009-12-03 17:53 656重点概念 1. 方法内容如果过长其实就有可能出了问题。 2. ... -
适配器模式(Adapter)
2009-12-03 22:59 699适配器模式比较简单常 ... -
备忘录模式(Memento)
2009-12-06 10:59 690重点概念 1. 希望把存取状态的细节封装起来,而且最好是封装 ... -
组合模式(Composite)
2009-12-06 15:39 601重要概念 1. 将对象组合成树形结构以表示‘部分-整体’的层 ... -
迭代器模式(Iterator)
2009-12-06 16:48 875C# 中已经实现了迭代器功能, foreach in 和 IE ... -
单例模式(Singleton)
2009-12-06 19:55 758重点概念 1. 所有类都有构造方法,不编码则系统默认生成空的 ... -
大型网站性能优化的通用方法
2009-12-10 12:56 7551、HTML静态化其实大家 ... -
桥接模式(Bridge)与合成/聚合复用原则(CARP)
2009-12-13 12:40 1027重要概念 1.合成/聚合 ... -
命令模式(Command)
2009-12-13 14:16 732重要概念 1.命令抽象类,也是命令模式的核心理解 2. ... -
职责链模式(Chain of Responsibility)
2009-12-13 16:13 1073重要概念 1. 使多个对象都有机会处理请求,从而避免请求的发 ... -
依赖倒转(依赖倒置)原则
2009-11-30 15:23 7561. 抽象不应该依赖细节,细节应该依赖于抽象(接口,抽象类)。 ... -
装饰模式(Decorator)
2009-11-30 18:32 757重点概念 1. 把所需的功能按正确的顺序串联起来进行控制。 ... -
代理模式(Proxy)
2009-11-30 21:55 688大话设计模式讲的和连环画一样,还可以接上,作者真用心,看起来很 ... -
工厂方法模式(Factory Method)
2009-12-01 10:57 884重要概念 本章内容围绕简单工厂与工厂方法的比较很好的说明了工 ...
相关推荐
【Java设计模式】(2)策略模式Strategy
2009-03-9 策略模式Strategy:当解决一个问题的途径(策略)有很多种的时候,每一种处理方式都可以做为一种处理策略,通过管理类来切换调用不同的策略。
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。...
C#面向对象设计模式 (行为型模式) Strategy 策略模式 视频讲座下载
使用Java实现不同排序算法的策略模式的代码。
主要介绍了PHP设计模式之 策略模式Strategy,结合实例形式详细分析了PHP基于对象行为型的策略模式Strategy具体原理、实现技巧与相关操作注意事项,需要的朋友可以参考下
走进设计模式之 策略模式(Strategy) 代码
设计模式C++学习之策略模式(Strategy)
策略模式思想简单实现,初学者可看看。 设计模式 策略模式 Strategy
设计模式 策略模式。金典模式之策略模式代码。
strategy策略模式源码 策略模式源码 策略模式源码 策略模式源码
设计模式-策略模式(Strategy)结合Android小知识讲解,简单明了
1、策略模式STRATEGY PATTERN 2、代理模式PROXY PATTERN 3、单例模式SINGLETON PATTERN 4、多例模式MULTITION PATTERN 5、工厂方法模式FACTORY METHOD PATTERN 6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式...
这种设计模式比较常用,希望能够帮助到大家。
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each ...
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第23节:行为型模式Strategy策略模式
Factory:在JDK中遍地都是,比如JDBC、JNDI等,是学习Spring的基础 命令模式 Command:Struts框架的基石 单例模式 Singleton:最简单的设计模式,大量框架都使用了它 策略模式 Strategy:java.util....
C#面向对象设计模式纵横谈(23):(行为型模式) Strategy 策略模式
一个把数组导出为表格的算法,输入一个数组,导出一个表格,当用户想改变导出的表格时,便可以通过改变输出的算法改变输出的结果。如果输出的内容用以网页显示,则输出 <table><tr><td>Jack</td></tr><tr><td>Maya...