【设计模式之策略模式】

来源:互联网 发布:慈溪行知职高罗老师 编辑:程序博客网 时间:2024/06/14 07:58

前言:

最近在学习设计模式,简单工厂是接触的第一个模式,后来,就遇到了策略模式,策略模式真是有谋略啊!定义了算法家族,有了算法家族,再难的计算都不在话下了!!!今天,我们一起来学习策略模式,看看这是一个怎样的设计模式?

中心:

(一)定义

官方:

它定义了算法家族,分别封装起来起来,让他们之间可以相互替代,此模式让算法的变化,不会影响到使用算法的用户。

个人理解:

定义了一系列的算法,将算法封装在独立的策略类中,既然独立,就可以相互替代,所有的算法完成的是相同的工作,只是实现不同,它以相同的方式调用所有的算法。

相比继承的优点:

继承提供了一种支持多种算法或行为的方法,而继承使得算法父类与子类混合,难以理解、维护、和扩展,还不同的动态的改变算法,这是继承的缺点,正是策略模式的优点。使用策略模式,使得易于切换理解、和扩展

(二)结构图

UML图:

例子:

以商场打折为例,可用下图来理解策略模式。

(三)主要代码

Strategy类,定义所有支持的算法的公共接口
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">//抽象算法类        abstract class Strategy        {            //算法方法            public abstract void AlgorithmInterface();        }</span></span></span>
ConcreteStrategy,封装了具体的算法或行为,继承于Strategy
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"> //具体算法A        class ConcreteStrategyA:Strategy        {            //算法A实现方法            public override void AlgorithmInterface()            {                Console.WriteLine("算法A实现");            }        }        //具体算法B        class ConcreteStrategyB : Strategy        {            //算法b实现方法            public override void AlgorithmInterface()            {                Console.WriteLine("算法B实现");            }        }        //具体算法C        class ConcreteStrategyC : Strategy        {            //算法A实现方法            public override void AlgorithmInterface()            {                Console.WriteLine("算法C实现");            }        }</span></span></span>
Context,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"> //上下文        class Context        {            Strategy strategy;            public Context (Strategy strategy)            {                this.strategy = strategy;            }            //上下文接口            public void ContextInterface()            {                strategy.AlgorithmInterface();            }        }</span></span></span>
客户端代码
<span style="font-size:18px;"><span style="font-size:18px;"> <span style="font-size:18px;">static void Main(string[] args)        {            Context context;            context = new Context(new ConcreteStrategyA());            context.ContextInterface();            context = new Context(new ConcreteStrategyB());            context.ContextInterface();            context = new Context(new ConcreteStrategyC());            context.ContextInterface();            Console.Read();        }</span></span></span>

(四)定位

策略模式,从字面可以理解“出谋划策”,是一种行为,故属于行为型模式。

(五)优缺点

优点:减少耦合,简化测试(单元测试)
缺点:客户端知道所有的类,任务重,造成很多策略类

(六)何时用

1. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为

2. 一个系统的算法使用的数据不可以让客户端知道。

3. 如果一个对象有很多的行为,


在实践中,只要分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式。

总结:

策略模式,你懂了吗?希望这篇博客,对大家有用!
0 0