策略模式

69 阅读1分钟

商场有打折、满减、积分、送卷等促销手段,可以用简单工厂模式创建一个收费对象生产工厂,分门别类的创建不同的促销实例,但是商场可能经常性的更改各种促销策略,使用每次改动都要维护改动对应的工厂,以至于代码需要重新编译部署,这是很糟糕的处理方式,所以它不是最好的办法。面对算法的时常变动可以使用策略模式,根据配置类型来改变应当使用哪种策略避免每次改变都需要修改重新部署。

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

image.png

//  现金收费抽象类
public abstract class CashSuper {
	public abstract double acceptCash (Double money);
}
//	此类是正常付款,没有任何折扣返利。。。。
public class CashNormal extends CashSuper {
	
	public double acceptCash(Double money) {
		return money;
	}

}
// 此类是对各种打折抽象
public class CashRebate  extends CashSuper{
	
	private String moneyRebate;
	
	double moneyRebate_d;
	public CashRebate(String moneyRebate) {
		 moneyRebate_d = Double.parseDouble(moneyRebate);
	}

	
	public double acceptCash(Double money) {
		
		return money * moneyRebate_d;
	}

}
// 满减
public class CashReturn extends CashSuper{
	// 300 -100
	private  double moneyCondition;
	private  double moenyReturn;
	
	public CashReturn(String moneyCondition, String moenyReturn) {
		super();
		this.moneyCondition = Double.parseDouble(moneyCondition);
		this.moenyReturn = Double.parseDouble(moenyReturn) ;
	}

	public double acceptCash(Double money) {
		
		if(money>moneyCondition) {
			return money-Math.floor(money/moneyCondition)*moenyReturn;
		}
		return money;
	}
}
// 策略模式与工厂模式的相结合
public class CashContext {
	
	CashSuper cashSuper;
	
	private String type;
	
	public CashContext(String type) {
		this.type=type;
		
		switch (type) {
		case "正常":
			cashSuper=new CashNormal();
			break;
		case "三折":
			cashSuper=new CashRebate("0.8");
			break;
		case "返现金":
			cashSuper=new CashReturn("300","100");
			break;
			
		default:
			break;
		}
	}
	
	public double getResult(Double money) {
		return cashSuper.acceptCash(money);
	}
}