策略模式:行為型模式
將相同行為,不同的處理演算法分別封裝起來。讓它們之間可以互相替換
1. 定義一個超類型接口,及行為方法
##2. 定義不同的實作類,實作該行為的不同的演算法
/** * 策略模式:针对同一命令(或行为),不同的策略做不同的动作 * 商品促销 * 本类为:收取现金的类 * * @author stone */ public interface ICashSuper { double acceptCash(double money); }
/** * 正常收取现金 * @author stone * */ public class CashNormal implements ICashSuper { @Override public double acceptCash(double money) { return money; } }
/** * 打折收取现金 * @author stone * */ public class CashRebate implements ICashSuper { private double rebate; //折扣 public CashRebate (double rebate) { this.rebate = rebate; } @Override public double acceptCash(double money) { return new BigDecimal(money * rebate / 10).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } }
/** * 让利返现 收取现金 * @author stone * */ public class CashReturn implements ICashSuper { private double moneyCondition; //返现底限金额 private double returnMoney; //返还金额 public CashReturn(double moneyCondition, double returnMoney) { this.moneyCondition = moneyCondition; this.returnMoney = returnMoney; } @Override public double acceptCash(double money) {//多重返利 if (money >= moneyCondition) { return money - Math.floor(money / moneyCondition) * returnMoney; } else { return money; } } }
/** * 根据传递的的策略类,执行相应的行为 * @author stone * */ public class CashContext { private ICashSuper casher; public CashContext() { } public CashContext(ICashSuper casher) { this.casher = casher; } public void setCasher(ICashSuper casher) { this.casher = casher; } //根据具体的策略对象,调用它的算法行为 public double acceptCash(double money) { return this.casher.acceptCash(money); } }
/* * 策略(Strategy)模式 关注:行为的选择 * 封装了一系列策略对象,用户来选择使用哪种策略对象 * 与简单工厂的区别: * 策略模式,传入策略对象给Context,由Context封装策略对象的方法调用,对外公开Context的方法接口 * 简单工厂模式,传入一个简单参数,创建对象,然后调用出厂对象的方法 * 与装饰模式的区别: * 很明显,Context无需实现(implements)业务接口,不需要增强已有的策略对象的功能 * 策略模式多用在算法决策系统中, 比如工资结算 */ public class Test { public static void main(String[] args) { double money = 998; //原价 CashContext cashContext = new CashContext(new CashNormal()); System.out.println("原价:" + cashContext.acceptCash(money)); //通常 策略 cashContext.setCasher(new CashRebate(8.5)); System.out.println("打85折:" + cashContext.acceptCash(money)); //折扣 策略 85折 cashContext.setCasher(new CashReturn(300, 50)); System.out.println("满300 返50:" + cashContext.acceptCash(money)); //返现 策略 满300 返50 } }列印
原价:998.0 打85折:848.3 满300 返50:848.0
以上是Java實作策略(Strategy)模式具體介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!