一 概要
1.1 行为型模式
- 特别关注对象之间的通信。描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。
1.2 定义
- 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
二 UML类图
三 例子
public abstract class Strategy
{
public abstract void Task();
}
public class ConcreteStrategyA : Strategy
{
public override void Task()
{
//todo;
}
}
public class ConcreteStrategyB : Strategy
{
public override void Task()
{
//todo;
}
}
public class Context
{
private Strategy strategy;
public Context(Strategy strategy)
{
this.strategy = strategy;
}
public void DoTask()
{
strategy.Task();
}
}
public class Test
{
public Test()
{
Context context = new Context(new ConcreteStrategyA());
context.DoTask();
}
}
四 策略与简单工厂结合
ConcreteStragegy封装在context内部,客户端不需要知道ConcreteStragegy
public class Context
{
private Strategy strategy;
public Context(string type)
{
switch (type)
{
case "strategyA":
strategy = new ConcreteStrategyA();
break;
default:
break;
}
}
public void DoTask()
{
strategy.Task();
}
}
public class Test
{
public Test()
{
Context context1 = new Context("strategyA");
context1.DoTask();
}
}
五 策略模式与简单工厂的区别
1.策略模式属于行为型模式,策略模式根据客户端传入的不同的对象来执行不同的行为,而简单工厂属于创建型模式,根据客户端传入的不同行为创建不同的对象。
2.策略模式,需要暴露context与具体的strategy类给客户端,而简单工厂需暴露BaseOperation与Factory类。
六 优缺点
6.1 优点
- 使用策略模式可以避免使用多重条件判断语句。
- 策略模式提供了统一管理所有策略的接口。
6.2 缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
七 使用场景
- 一个系统需要动态地在几种算法中选择一种时,可将每个算法封装到策略类中。
- 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支移入它们各自的策略类中以代替这些条件语句。
- 系统中各算法彼此完全独立,且要求对客户隐藏具体算法的实现细节时。
- 系统要求使用算法的客户不应该知道其操作的数据时,可使用策略模式来隐藏与算法相关的数据结构。
- 多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为。