策略模式

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

2.策略模式结构图
这里写图片描述

这些算法随时都可能相互替换(变化点),封装变化点是我们面向对象的一种很重要的思维方式。

3.策略模式是一种定义一系列运算的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

4.策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。

4.商城收银系统
(1)具有三种优惠:打折,满返现,满积分返

(2)策略模式

//策略:抽象算法类          定义所有支持的算法的公共接口
//付款方式的超类
public abstract class CashSuper {
    public abstract double acceptCash(double money);
}


//策略:具体算法A
public class CashNormal extends CashSuper{

    @Override
    public double acceptCash(double money) {

        return money;
    }

}


//具体算法B
//打折优惠
public class CashRebate extends CashSuper{

    private double moneyRebate = 1.0d;

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

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

}


//具体算法C
//满300减100
public class CashReturn extends CashSuper{

    @Override
    public double acceptCash(double money) {
        //。。。省略。。。。。。。。。。
        return 0;
    }

}
public class CashContext {
    private CashSuper cs ;

    //通过构造方法,传入具体的收费策略
    public CashContext(CashSuper cashSuper){
        this.cs = cashSuper ;
    }

    //根据收费策略不同,获得计算结果
    public double getResult(double money){
        return cs.acceptCash(money);
    }
}





//策略模式
//客户端代码
public class MainTest {

    public static void main(String[] args) {
        CashContext c = null;
        String str = ""; // 选择
        switch (str) {
        case "正常收费":
            c = new CashContext(new CashNormal());
            break;

        case "满300返100":
            c = new CashContext(new CashReturn());
            break;

        case "打8折":
            c = new CashContext(new CashRebate(0.4));
            break; 

        default:
            break;
        }
        c.getResult(100);
    }

}

(3)将判断逻辑从客户端抽离,与工厂模式结合


//将判断代码从客户端移出
//策略与简单工厂结合
public class CashContext1 {
    CashSuper cs = null ;

    //参数不是具体的收费策略对象,而是一个对象,而是一个字符串,表示收费类型
    public CashContext1(String type){
        switch (type) {
        case "正常收费":
            CashNormal cs0 = new CashNormal();
            cs = cs0;
            break;

        case "满300返100":
            CashReturn cr1 = new CashReturn();
            cs = cr1 ;
            break;

        case "打8折":
            CashRebate cr2 = new CashRebate(0.9);
            cs = cr2;
            break; 

        }
    }

    public double getResult(double money){
        return cs.acceptCash(money);
    }
}
public class MainTest2 {

    public static void main(String[] args) {
         CashContext1 csuper = new CashContext1("打8折");
         csuper.getResult(100);
    }

}

5.
(1)策略模式的strategy类层次为context定义了一系列的可供重用的算法或行为,而且简化了单元测试,因为每个算法都有自己的类

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值