策略模式(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 。或者关注我的公众号:
新闻热点
疑难解答