策略模式

什么是策略模式

策略模式: 定义一系列的算法,这些算法完成的都是相同的工作,调用的方式相同,只是实现不同

好处:

  • 封装了算法(变化),减少了算法类与使用算法类之间的耦合(简单工厂中对不同的场景,使用相应的算法)

  • 此模式让算法的变化,不会影响到使用算法的客户。

使用场景: 只要在分析需求的过程中,需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

缺点: 策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。这会造成客户端选择判断的压力,而策略模式与简单工厂模式的结合,选择具体实现的职责也可以由Context承担,这就最大化地减轻了客户端的职责。

类图:

交互方式: 客户端访问context,context决定使用哪个strategy
在这里插入图片描述
在这里插入图片描述

实例

CashSuper类

/*
 * @Description: 收费超类,抽象类
 */
public abstract class CashSuper {
    public abstract double getResult(double money);
}

CashNormal类

public class CashNormal extends CashSuper {
    @Override
    public double getResult(double money) {
        return money;
    }
}

CashReturn类

public class CashReturn extends CashSuper {

    private double moneyCondition=0.0d;
    private double moneyReturn=0.0d;

    public CashReturn(double moneyCondition,double moneyReturn){
        this.moneyCondition=moneyCondition;
        this.moneyReturn=moneyReturn;
    }

    @Override
    public double getResult(double money) {
        if(money>moneyCondition){
            money-=money/moneyCondition*moneyReturn;
        }
        return money;
    }
}

CashRebate类

public class CashRebate extends CashSuper {

    private double moneyRebate=1d;

    public CashRebate(double moneyRebate){
        this.moneyRebate=moneyRebate;
    }

    @Override
    public double getResult(double money) {
        return money*moneyRebate;
    }
}

CashContext类(策略模式和简单工厂模式的结合使用),如果只是单纯的策略模式的Context的话,构造函数是这样的,其中:参数CashSuper 的实例化,在客户端完成。

public CashContext(CashSuper cashSuper){
	cashSuper=cashSuper;
}
public class CashContext {
    private CashSuper cashSuper =null;
    public CashContext(String str){
        switch (str){
            case "正常收费":
                cashSuper=new CashNormal();
            case "满300返100":
                cashSuper=new CashReturn(300,100);
            case "打8折":
                cashSuper=new CashRebate(0.8);
        }
    }

    public double getResult(double money){
        return cashSuper.getResult(money);
    }
}

简单工厂模式和策略模式的对比

简单工厂模式让客户端认识2个类,CashSuper和CashFactory。而策略模式与工厂模式的结合的用法,客户端只需要认识一个类CashContext就可以了。耦合更加降低。这使得具体的收费算法彻底与客户端分离。

参考:
程杰. 《大话设计模式》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值