大话设计模式之策略模式-------商场收费系统

该博客介绍了如何运用设计模式中的策略模式来设计一个商场收费系统,包括正常收费、打折和返利三种策略。通过创建收费的抽象父类CashSuper及其实现的子类,再结合工厂模式创建具体收费策略,实现了收费策略的动态选择和切换。在客户端,通过CashContext类调用不同策略下的收费计算方法,降低了系统各部分之间的耦合。
摘要由CSDN通过智能技术生成

设计一个商场收费系统,可能搞活动的时候会打折,或者满多少减多少等。

1。设计收费的父类
package com.dahua.cash;

/**
* Created by walle
* 2017/10/12.10:17
* good good study!
* 收费的父类
*/
public abstract class CashSuper {
public abstract double acceptCash(double money);
}

2。正常收费的子类

package com.dahua.cash;

/**
* Created by walle
* 2017/10/12.10:20
* good good study!
* 正常收费子类
*/
public class CashNormal extends CashSuper {
@Override
public double acceptCash(double money) {
return money;
}
}

3。打折的子类
package com.dahua.cash;

/**
* Created by walle
* 2017/10/12.10:23
* good good study!
*/
public class CashRebate extends CashSuper {
private double cashRebate;

public CashRebate(String cashRebate) {
    this.cashRebate = Double.parseDouble(cashRebate);
}

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

}
4。返利的子类
package com.dahua.cash;

/**
* Created by walle
* 2017/10/12.10:29
* good good study!
* 返利收费子类 例如满三百反一百
*/
public class CashReturn extends CashSuper {
private double moneyCondition;
private double moneyReturn;

public CashReturn(String moneyCondition, String moneyReturn) {
    this.moneyCondition = Double.parseDouble(moneyCondition);
    this.moneyReturn = Double.parseDouble(moneyReturn);
}

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


public static void main(String[] args) {
    double result = 340-Math.floor(340/300)*100;
    System.out.println(Math.floor(340/300));
    //floor 返回不大于的最大整数 round 四舍五入 ceil返回大于的最大整数
    System.out.println(result);

}

}
5。工厂模式
package com.dahua.cash;

/**
* Created by walle
* 2017/10/12.10:46
* good good study!
* 收费工厂类
*/
public class CashFactory {
public static CashSuper createCashAccept(String type) {
CashSuper cashSuper = null;
switch (type) {
case “normal”:
cashSuper = new CashNormal();
break;
case “打8折”:
cashSuper = new CashRebate(“0.8”);
break;
case “满300反一百”:
cashSuper = new CashReturn(“300”, “100”);
break;
}
return cashSuper;
}
}
6。策略模式
package com.dahua.cash;

/**
* Created by walle
* 2017/10/12.11:23
* good good study!
*/
public class CashContext {
CashSuper cashSuper = null;
public CashContext(String type){
switch (type) {
case “normal”:
cashSuper = new CashNormal();
break;
case “打8折”:
cashSuper = new CashRebate(“0.8”);
break;
case “满300反一百”:
cashSuper = new CashReturn(“300”, “100”);
break;
}
}
public double getResult(double money){
return cashSuper.acceptCash(money);
}
}
7。客户端
package com.dahua.cash;

/**
* Created by walle
* 2017/10/12.10:53
* good good study!
* 收费客户端
*/

/**
* 策略模式和工厂模式的区别在于
* 简单工厂模式要识别两个类CashSuper和CashFactory
* 而策略模式只需要识别一个CashContext就行 ,耦合更低
* 让具体的算法和客户端分离。
*
* 策略模式减少了各种算法类和使用算法之间的耦合,把他们的公共的功能写到一个getResult方法
* 使得算法间有了公共的父类CashSuper
*/
public class CashClient {

public static void main(String args[]) {
    double total = 0.00d;
    //此处type可以根据下拉框来选择

// CashSuper cashSuper = CashFactory.createCashAccept(“打8折”);
// double totalPrices = cashSuper.acceptCash(200);
// total = total + totalPrices;
// System.out.println(total);
CashContext cashContext = new CashContext(“打8折”);
double totalPrices = cashContext.getResult(2 * 300);
total = total + totalPrices;
System.out.println(total);
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值