本例中描述了三种商场促销的方式
类图
此图结合了策略模式和简单工厂,单纯的策略模式不需要在CashContext中生成具体策略的对象,可以作为构造函数的参数传入即可
工程目录
代码
AbstractCash.java
package com.company.pattern.demo02;
/**
* AbstractCash是抽象的策略,它的实现类是具体的策略
* @author blazar
*/
public abstract class AbstractCash {
/**
* 现金收取抽象类的抽象方法,收取现金,参数为原件,返回为当前价格
* @param money
* @return
*/
public abstract double acceptCash(double money);
}
CashNormal.java
package com.company.pattern.demo02;
/**
* 正常收费子类
* @author blazar
*/
public class CashNormal extends AbstractCash{
@Override
public double acceptCash(double money) {
return money;
}
}
CashRebate.java
package com.company.pattern.demo02;
/**
* 打折收费子类
* @author blazar
*/
public class CashRebate extends AbstractCash{
private double moneyRebate;
public CashRebate(String moneyRebate){
this.moneyRebate = Double.valueOf(moneyRebate);
}
@Override
public double acceptCash(double money) {
return money * moneyRebate;
}
}
CashReturn.java
package com.company.pattern.demo02;
/**
* 返利收费子类(比如:满300返100)
* @author blazar
*/
public class CashReturn extends AbstractCash{
private double moneyCondition;
private double moneyReturn;
public CashReturn(String moneyCondition, String moneyReturn){
this.moneyCondition = Double.valueOf(moneyCondition);
this.moneyReturn = Double.valueOf(moneyReturn);
}
@Override
public double acceptCash(double money) {
double result = money;
//若大于返利条件,则需要减去返利值
if(money >= moneyCondition){
result = money - Math.floor(money / moneyCondition) * moneyReturn;
}
return result;
}
}
CashContext.java
package com.company.pattern.demo02;
/**
* @author blazar
*/
public class CashContext {
private AbstractCash cash;
/**
* 根据传入字符串,创建对应的收费对象
* @param type 表示收费类型
*/
public CashContext(String type){
/**
* 将实例化具体策略的过程放到了简单工厂中
*/
switch(type){
case "正常收费":
cash = new CashNormal();
break;
case "满300返100":
cash = new CashReturn("300","100");
break;
case "打8折":
cash = new CashRebate("0.8");
break;
}
}
public double getResult(double money){
return cash.acceptCash(money);
}
}
Main.java
package com.company.pattern.demo02;
/**
* @author blazar
*/
public class Main {
/**
* 策略模式
*/
public static void main(String[] args) {
CashContext cashContext = new CashContext("打8折");
System.out.println(cashContext.getResult(300));
}
}
变化点
修改
修改具体策略的实现类即可;
增加
如果需要增加具体策略,需要两步骤:先增加具体策略的实现类;然后在简单工厂中增加switch;
参考《大话设计模式》