设计模式----策略模式

今天,我来说说策略模式,看着网上那些策略模式要么是看不懂要么就是其他语言,要么就是一些零散的片段,看的人头晕眼花的,实在是不敢恭维

今天,我们就完完整整的来说说策略模式。

首先,策略模式的应用场景:例如在一个商城系统中,针对商品我们会定义不同的策略去改变商品的价格或者优惠,此时,当我们写完代码了,过一段时间,十一大酬宾,老板希望让部分商品进行降价促销处理,这个时候,当你接到这个需求的时候会怎么做呢?肯定是找到那段逻辑代码,然后夜以继日的改改改,然后测试,写了N多个BUG(哈哈哈),这个时候又要返工重做,这里如果是别人的代码的话你还要花点功夫去琢磨别人写的代码,这个时候你的感觉(你们懂的)。如果你恰好在工作中碰到这类问题,你应该立刻想起“策略模式”。当然,如果你的系统策略用的比较少,建议还是一个类搞定,毕竟过度的优化也是一种灾难(个人见解),好了,废话就说到这,接下来就让我们进入策略模式。

首先,策略模式,我们有N多个策略,面向对象三大特性,第一步,我们先抽象一个策略基类出来,代码如下:

/// <summary>
    /// 定义所有支持的算法的公共接口
    /// </summary>
    public abstract class Strategy
    {
        public abstract void AlgorithmInterface();
    }

这个Strategy就是我们抽象出来的策略类,然后这个AlgorithmInterface方法就是我们的执行策略逻辑的方法,好了,定义好了抽象基类,接下来我们当然就是要去继承它了,不然怎么后代昌盛呢(^_^)

我们新建一个ConcreteStrategyA子类,这里就是我们具体实现策略的地方,我们让它继承我们上面的抽象的Strategy类,代码如下:

 public class ConcreteStrategyA : Strategy
    {
        //算法A实现方法
        public override void AlgorithmInterface()
        {
            Console.WriteLine("算法A实现");
        }
    }

上面代码就是ConcreteStrategyA策略类继承抽象基类然后重写基类方法AlgorithmInterface,不知道到这里各位是否看懂,如果此时还需要加策略或者修改策略的话,我们还可以继续创建子类,如下:

public class ConcreteStrategyB : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("算法B实现");
        }
    }

上面的ConcreteStrategyB类同样是继承了Strategy基类,也同样是实现了方法AlgorithmInterface,唯一不同的就是两个类中AlgorithmInterface方法中的逻辑不同。以后如果有不同的策略或者修改以前的策略,我们完全都可以去创建一个全新的策略子类去完成,这也符合六大原则中的开闭原则,即:支持扩展,避免修改。

看到这里,有人疑惑了,难道每次我都要去new一个新的对象,然后去执行方法吗,这貌似没什么改变啊,哈哈哈,下面就是策略模式的精髓所在了,请看下面代码:

 public class Context
    {
        Strategy strategy;
        /// <summary>
        /// 初始化时,传入具体的策略对象
        /// </summary>
        /// <param name="strategy"></param>
        public Context(Strategy strategy)
        {
            this.strategy = strategy;
        }
        /// <summary>
        /// 上下文接口
        /// </summary>
        public void ContextInterface()
        {
            strategy.AlgorithmInterface();
        }
    }

这个Context类就是用来配置,维护一个对Strategy对象的引用的,Context构造函数用来注入一个Strategy对象,然后ContextInterface方法里就是用来执行Strategy对象中的AlgorithmInterface方法,Context类就介绍完了,我们再来看看上端如何调用的,一切的奥妙就要揭晓了,请看代码:

 class Program
    {
        static void Main(string[] args)
        {
            Context context;
            context = new Context(new ConcreteStrategyA());
            context.ContextInterface();
        }
    }

好,我们一步一步的来解析,刚刚我们是从底层一步一步的往上,接下来,我们一步一步的从上往下看看策略模式的全貌。首先,我们实例化了一个Context类,然后注意,我们实例化Context的时候传给它的对象是ConcreteStrategyA,为什么呢,我们之前说了Context构造函数里不应该是Strategy对象吗?这里有个小知识点,老司机们应该都知道了(哈哈),父类出现过的地方都可以用子类来替代,反之的话,如果子类是刚出生就可以(开玩笑的),意思就是如果子类的所有方法属性都是继承自父类的话那反之就成立,否则就不行了。所以我们这里ConcreteStrategyA传入是没问题的,因为它继承了Strategy。然后我们看后面的代码,它执行了ContextInterface方法,我们知道,这个ContextInterface方法里面又执行方法AlgorithmInterface的,有些人就蒙了,它不是应该执行Strategy类中的AlgorithmInterface方法吗?没错,它的确是先执行了Strategy类中的AlgorithmInterface方法,因为里面什么逻辑代码都没有,只有一个孤零零的方法体,当它执行完基类中的AlgorithmInterface方法后,会接着执行子类中的AlgorithmInterface方法,所以,代码的执行顺序清楚,策略模式的逻辑思维也应该清楚了。好了,今天的设计模式就分享到这,感谢捧场,如果有不足的地方欢迎交流!!!!!!

 

posted @ 2019-03-16 17:19  守望阳光01  阅读(177)  评论(1)    收藏  举报