首页 > 学院 > 开发设计 > 正文

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

2019-11-09 17:22:33
字体:
来源:转载
供稿:网友

       策略模式(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 。或者关注我的公众号:


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表