小编对策略模式还是比较熟悉的,因为用到了几次,下面我给大家说说策略模式吧!
what
官方定义:定义算法家族,分别封装起来,让他们之间可以相互替换,,此模式让算法的变化不会影响到十四用算法的客户
自己总结:封装策略,让策略根据要求相互替换
when
需要不同时间应用不同的业务规则,就可以考苏使用策略模式应对变化(和状态模式蛮像的)
why
和状态模式一样,这个模式限消除了条件语句,而且把变化的部分抽离出来——一系列算法,我们可以根据需求来使用对应的算法。
demo
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 策略模式 { //定义一系列算法,把他们一个个封装起来,并且使他们可以相互替换,是的算法独立于使用他们的客户而变化 class Program { static void Main(string[] args) { Content content; content = new Content(new ConcreteStrategyA()); content.ContextInterface(); content = new Content(new ConcreteStrategyB()); content.ContextInterface(); content = new Content(new ConcreteStrategyC()); content.ContextInterface(); Console.Read(); } abstract class Strategy { public abstract void AlgorithmlImterfaca(); } class ConcreteStrategyA:Strategy { public override void AlgorithmlImterfaca() { Console.WriteLine("算法A实现"); } } class ConcreteStrategyB : Strategy { public override void AlgorithmlImterfaca() { Console.WriteLine("算法B实现"); } } class ConcreteStrategyC : Strategy { public override void AlgorithmlImterfaca() { Console.WriteLine("算法C实现"); } } class Content { Strategy strategy; public Content(Strategy strategy) { this.strategy = strategy;//体现聚合关系,初始化时,传入具体的策略对象 } public void ContextInterface() { strategy.AlgorithmlImterfaca();//根据具体的策略对象,调用其算法的方法 } //问题:出现基类比子类的可访问性低 原因:基类的访问修饰符比子类要低,因为C# 默认访问修饰符是private } } }
UML 图
这个模式和状态模式的相同点:
1、消除条件语句
2、UML图类似
3、封装变化部分,都用聚合模式
4、状态模式运行时由状态改变,引发行为改变;策略模式运行时由需求不同,引发算法不同
不同点:
1、代码不同,为什么不同还没有清晰地认识
2、适用条件不同