策略模式(Strategy Pattern)也称作政策模式(Policy Pattern)。
定义:Define a family of algorithms ,encapsulat each one ,and make them interchangeable.(定义一组算法,将每个算法封装起来,并且使他们之间可以互换。)
通用类图:
策略模式的三个角色:
Context封装角色: 起承上启下的封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
Strategy抽象策略角色:定义每个策略或算法必须具有的方法和属性
ConcreteStrategy具体策略角色:实现抽象策略中的操作,该类含有具体的算法。
优点:
1、算法可以自由切换;
2、避免了使用多重条件判断;
3、扩展性好;
缺点:
1 、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。2、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。
实现:
/// <summary>
/// 抽象的策略角色
/// </summary>
public interface Strategy
{
//策略模式的运算法则
public void doSomething();
}
/// <summary>
/// 具体的策略角色1
/// </summary>
public class ConcreteStrategy1 : Strategy
{
public void doSomething()
{
}
}
/// <summary>
/// 具体的策略角色2
/// </summary>
public class ConcreteStrategy2 : Strategy
{
public void doSomething()
{
}
}
public class Context
{
private Strategy strategy = null;
public Context(Strategy _strategy)
{
strategy = _strategy;
}
/// <summary>
/// 封装后的策略方法
/// </summary>
public void doAnything()
{
strategy.doSomething();
}
}
public class Client
{
public static void main(String[] args)
{
//声明一个具体的策略
Strategy strategy = new ConcreteStrategy1();
//声明上下文对象
Context context = new Context(strategy);
//执行封装后的方法
context.doAnything();
}
}
好了,这一章就写到这,欢迎大家加入QQ群:280993838 。或者关注我的公众号: