将同一行为,不同的处理算法分别封装起来。让它们之间可以互相替换
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)模式具体介绍的详细内容。
