设计模式之十一:策略模式

       策略模式(Strategy Pattern)也称作政策模式(Policy Pattern)。

       定义:Define a family of algorithms ,encapsulat each one ,and make them interchangeable.(定义一组算法,将每个算法封装起来,并且使他们之间可以互换。)

       通用类图:

       

       策略模式的三个角色:

        Context封装角色: 起承上启下的封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。

        Strategy抽象策略角色:定义每个策略或算法必须具有的方法和属性

        ConcreteStrategy具体策略角色:实现抽象策略中的操作,该类含有具体的算法。

        优点:

        1、算法可以自由切换;

        2、避免了使用多重条件判断;

扫描二维码关注公众号,回复: 14818925 查看本文章

        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 。或者关注我的公众号:

猜你喜欢

转载自blog.csdn.net/zjw1349547081/article/details/54922907