《大话设计模式》java实现之策略模式

UML图
这里写图片描述
代码结构为了方便代码阅读,只写了折扣和满x减y员的策略类
这里写图片描述

public class CashContext {

    private CashSuper cashSuper;

    public CashContext(CashSuper cashSuper) {
        super();
        this.cashSuper = cashSuper;
    }

    public double getResult(double money) {
        return cashSuper.acceptCash(money);
    }
}
/** 折扣类 */
public class CashRebate extends CashSuper {

    private double moneyRebate;

    public CashRebate(double moneyRebate) {
        super();
        this.moneyRebate = moneyRebate;  //省略参数有效性验证
    }

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

    public double getMoneyRebate() {
        return moneyRebate;
    }

    public void setMoneyRebate(double moneyRebate) {
        this.moneyRebate = moneyRebate;
    }

}
/** 满x减y类 */
public class CashReturn extends CashSuper {

    private double moneyCondition;
    private double moneyReturn;

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

    @Override
    public double acceptCash(double money) {
        double result = money;
        if(money > moneyCondition) {
            result = money - Math.floor((money / moneyCondition)) * moneyReturn;
        }
        return result;
    }

    public double getMoneyCondition() {
        return moneyCondition;
    }

    public void setMoneyCondition(double moneyCondition) {
        this.moneyCondition = moneyCondition;
    }

    public double getMoneyReturn() {
        return moneyReturn;
    }

    public void setMoneyReturn(double moneyReturn) {
        this.moneyReturn = moneyReturn;
    }

}
public abstract class CashSuper {
    public abstract double acceptCash(double money);
}
public class Client {
    public static void main(String[] args) {
        double originPrice = 500;   //假设未打折前总价500

        CashContext context = null;
        String type = "满300减100";   //也可以由用户输入
        switch (type) {
        case "满300减100":
            context = new CashContext(new CashReturn(300, 100));
            break;
        case "打8折":
            context = new CashContext(new CashRebate(0.8));
            break;
        default:
            break;
        }

        double realPrice = context.getResult(originPrice);
        System.out.println("realPrice: " + realPrice);
    }
}

个人总结:
1.策略模式与代理模式、命令模式的区别
策略模式:context类只将策略的行为抽取出来进行统一实现,并不知道策略内部详细信息,一个context统一了多个策略
代理模式:一个Proxy只对应一个被代理对象,Proxy与被代理对象实现的是同一个接口,从代码看,被代理队形(书中的Persuit类)中还包含了一个SchoolGirl对象。参考:http://zyslovely.iteye.com/blog/1283846
命令模式:命令模式含有不同的请求做不同的事,隐藏接收者的执行细节,常见菜单事件,策略模式含有不同的算法做相同的事,区别在于时候含有接收者,命令模式有,策略模式没有。命令模式中的命令可以单独运行。参考http://blog.csdn.net/jiafu1115/article/details/6980423

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值