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

来源:互联网 发布:淘宝gxg代购是正品吗 编辑:程序博客网 时间:2024/06/05 05:24

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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 两岁的宝宝不爱喝水怎么办 宝宝不爱吃饭不爱喝水怎么办 一多半宝宝爱喝水 不爱吃饭怎么办 1岁宝宝不爱吃饭喝水怎么办 两岁小宝宝不爱吃饭怎么办 4个月小宝宝咳嗽怎么办 3个月小宝宝咳嗽怎么办 2个月小宝宝咳嗽怎么办 8的岁儿童腿不直怎么办 作业盒子选错年级怎么办 两岁x型腿怎么办 绿萝叶子有水滴怎么办 打游戏变菜了怎么办 车被记号笔画了怎么办 水溶性彩铅受潮了怎么办 马克笔颜色涂深了怎么办 染发膏染眉毛了怎么办 用电容笔画画手有触感怎么办 CAD画图线性数字不居中怎么办 3d立体画笔堵塞怎么办 龋齿树脂填充老化后怎么办 小孩补过的牙疼怎么办 颜料弄到墙纸上怎么办 4岁的宝宝不爱涂色怎么办 oppo手机截图存不到相册怎么办 做的ih5保存不了怎么办 小偷偷东西发现后逃跑了怎么办? 网上有人传迷信诅咒怎么办 颜料粘在衣服上怎么办 家里有小偷撬锁怎么办 在家有人在撬门怎么办 6个月的宝宝腹泻怎么办 六个月大的宝宝拉肚子怎么办 六个月宝宝着凉拉肚子怎么办 六个月婴儿着凉拉肚子怎么办 怀孕六个月着凉拉肚子怎么办 六个月的婴儿消化不好怎么办 六个月婴儿不好好吃奶怎么办 六个月婴儿消化不好怎么办 六个月婴儿肠胃不好怎么办 受了惊吓后睡眠不好怎么办