小编对策略模式还是比较熟悉的,因为用到了几次,下面我给大家说说策略模式吧!
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、适用条件不同