最近一直在学习设计模式,参考资料主要是程杰老师的大化设计模式,这本书真的很好,通俗易懂,道理深刻,适合设计模式的初学者去学习。
今天让我们认识一种新的设计模式——策略模式
策略模式的定义是这样的,它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。
下面让我们来看看策略模式的结构图:
namespace 策略模式之计算器 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { cmbSym.Items.AddRange(new object[]{"+","-","*","/"}); } private void btnEqual_Click(object sender, EventArgs e) { CashContext cashContext=null; switch (cmbSym.SelectedItem.ToString()) { case "+": cashContext = new CashContext(new Add()); break; case "-": cashContext = new CashContext(new Sub()); break; case "*": cashContext = new CashContext(new Mul()); break; case "/": cashContext = new CashContext(new Div()); break; } double number1 = Convert.ToDouble(txtNumber1.Text); double number2 = Convert.ToDouble(txtNumber2.Text); double result = cashContext.getResult(number1,number2); txtResult.Text = Convert.ToString(result); } } public abstract class opration { public abstract double GetResult(double NumberA,double NumberB); } class Add : opration { public override double GetResult(double NumberA,double NumberB) { double result = 0; result = NumberA + NumberB; return result; } } class Sub : opration { public override double GetResult(double NumberA,double NumberB) { double result = 0; result = NumberA - NumberB; return result; } } class Mul : opration { public override double GetResult(double NumberA,double NumberB) { double result = 0; result = NumberA * NumberB; return result; } } class Div : opration { public override double GetResult(double NumberA,double NumberB) { double result = 0; if (NumberB == 0) { throw new Exception("除数不能为零"); } result = NumberA / NumberB; return result; } } class CashContext { opration op; public CashContext(opration op) { this.op = op; } public double getResult(double NumberA,double NumberB) { return op.GetResult(NumberA, NumberB); } } }
当你看完这段代码的时候肯定会说这个例子在简单工厂模式中实现的不是挺好的吗,为什么又用策略模式来实现,而且这两个模式之间到底有什么不同呢?
下面是我自己总结的几点简单工厂模式和策略模式各自的特点:
1、在简单工厂模式中客户端只需传递相应的条件就能得到想要的对象,然后通过这个对象实现算法的操作(根据条件得到对象,利用对象调用方法)
2、在策略模式中,使用时必须首先创建一个想使用的具体算法的类对象,然后将该对象作为参数传入CashContext类中,通过这个参数对象调用自己的方法来实现(使用着自己决定使用哪个对象)
两者最大的区别就是:简单工厂模式如果增加了新类,那么工厂也要随之动动,在策略模式中,如果增加一个新类,Context类中不用改动,但客户端代码需要改动
在简单工厂中的客户端,客户需要认识两个类即工厂类和各算法类的基类,而在策略模式中客户只需认识一个类CashContext就可以了,所以这也进一步降低了耦合度。
在具体的系统中常常将两者结合使用
原文:http://www.cnblogs.com/woshilulin/p/3729043.html