设计模式—策略模式

什么是策略模式?

    策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化不会影响到使用算法

的客户。

    策略模式是一种定义一系列算法的方法,从概念上看所有这些算法完成的都是相同的工作,只是实现不同,它可

以以相同的方式调用所有的算法,减少了各种算法类与使用算法之间的耦合。

策略模式的优点?

    (1)策略模式的Strategy类层为Context类定义了一系列的可供重用的算法和行为。继承有助于析取出这些算法

的公共功能。

    (2)简化了单元测试(每个算法都有自己的类,可以通过自己的接口单独测试)

策略模式的不足?

    Context中包含了switch语句,修改需求时需要改Context中的代码。(解决办法,反射技术)

策略模式的使用条件?

    策略模式是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听

到要在不同时间应用不同的业务规则,就可以考虑利用策略模式处理这种变化的可能性。

    Eg:

    (1)产品之于加减乘除,水果之于苹果梨橘子香蕉,文具之于笔尺刀,这时产品比较具体、有限和没有多个算

法重叠,这时实用简单工厂模式。

    (2)产品之于商场促销中的返利(可为300返100、500返200、10000返500等等无数)、折扣(2折、2.5折、6

折、9折、9.1折等等无数)、正常购买、消费积分(100元10积分、200元30积分等等无数),这时产品构造又多次重

叠,且有在不同时刻应用不同的规则时使用策略模式。

策略模式的结构图?



简单工厂与策略模式的区别与联系?

    简单工厂模式只是解决了对象的创建问题,工厂需要包括所有的产品对象的创建,如果产品对象形式经常变化,

就需要经常改动工厂,以致代码重新编译。所以策略模式就诞生了,策略模式---它定义了算法家族,分别封装起

来,而不是像简单产品模式一样定义所有的产品类,让他们之间可以互相替换,此模式让算法的变化,不会影响到使

用算法的客户,使客户拥有相同的访问过程。

简单工厂和策略模式两个核心?

    简单工厂的核心:封装所有的产品对象

    策略模式的核心:封装算法

实战:商场促销系统结构图与代码展示 

    (1)商场促销UML图



    (2)CashContext类中的代码

                        

<span style="font-family:KaiTi_GB2312;font-size:18px;">class CashContext
{
    CashSuper cs = null;           //声明一个CashSuper变量
    
    public CashContext(string type)
    {
        switch (type)                //将实例化集体策略的过程由客户端转移到Context类中,简单工厂的应用
        {
            case "正常收费":
                CashNomal cs0 = new CashNomal();
                cs=cs0;
                break;
            case "满300返100":
                CashReturn cr1 = new CashReturn("300","100");
                cs = cr1;
                break;
            case "打8折";
                CashRebate cr2 = new CashRebate("0.8");
                cs = cr2;
                break;
        }
        
        public dopuble GetResult(double money)
        {
            return cs.acceptCash(money);
        }
    }
}</span>


  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值