大话设计模式之策略模式

策略,就是说我们根据不同的需要采用不同的方式,例如,机房收费系统中的收费,有固定和临户两种用户,我们采取的收费方式是不一样的。

那么什么是策略模式呢?

策略模式(Strategy):是指定义了一系列算法家族,并将每个算法分别封装起来,让它们之间可以互相替换。此模式让算法的变化,不会影响到使用算法的客户。看下面策略模式的结构图:


大话设计模式之策略模式_第1张图片

说明:

1.将所有的算法都抽象成了Strategy,可以将算法分离出来并且进行更换。

2.Context 中含有对Strategy的引用。

3通过contextInterface(),进行对算法的使用。


      从上面的结构图中,可以看出这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。换句话说,策略模式并不将算法“绑死”在具体的某个类中,而是将算法独立出来,可根据需要替换算法。例如:Context含有对 Straategy的引用。这里还用到了依赖倒转和里斯代换原则,即Context依赖于抽象,而没有依赖具体的子类,并且,子类可以替换父类。


优点简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。

下面我们从策略模式的代码来看,它是如何实现的:

首先,定义一个抽象类(Strategy),作为所有具体算法的公共接口。

namespace ConsoleApplication1
   abstract class Strategy         //将算法抽象成 Stragedy  
        {
           public override void AlgorithmInterface();       //算法方法
        }


次,定义具体的算法或行为,继承于Strategy。

class concreteStrategy : Strategy               // 定义一个具体算法  
       {
           public override void AlgorithmInterface()                //算法的实现方法
        {
            Console.WriteLine("算法实现");
        }
       }

最后,定义Context对象,通过其ContextInterface(),为其分配不同的算法。

 class Context                   // 将算法封装到Context中,通过传递对象生成相应子类对象,得到结果
  {
        Strategy strategy;                //Context 中含有 Strategy的引用

        public Context(Strategy strategy)    //初始化时,传入具体的Strategy 对象
        {
            this.strategy = strategy;

        }
        public void ContextInterface()       //根据传入的对象,调用Context 的ContextInterface 方法
        {
            strategy.AlgorithmInterface();
        }

客户端代码:实例化策略

	static void Main(string[] args)
        {
            {
                Context context;
                context = new Context(new concreteStrategy());
                context.ContextInterface();

                Console.Read();
            }

你可能感兴趣的:(大话设计模式之策略模式)