策略模式(Strategy)简介
一、策略模式(Strategy)简介
策略模式是行为模式.
行为模式:规定了各个对象应该具备的职责以及对象间的通信模式,它很好的规范了对象间调用和数据传递方式
策略模式适合于算法经常变化的情况
算法的变化不会影响到使用算法的客户,算法可以独立于使用它的客户所变化
二、简单例子
普通客户,会员,VIP会员购买商品价格不一样
抽象类
package strategy; /* * 计算商品价格的抽象类 */ public abstract class Account { abstract public double getPrice(int amount,double d); }
普通
package strategy; /** * 普通客户商品价格计算 */ public class CommonAccount extends Account { @Override public double getPrice(int amount, double price) { return amount*price; } }
会员
package strategy; /** * 普通会员商品价格计算打9折 */ public class InsiderAccount extends Account { @Override public double getPrice(int amount, double price) { return amount*price*9/10; } }
VIP
package strategy; /** * VIP会员商品价格计算打8折 */ public class VipAccount extends Account { @Override public double getPrice(int amount, double price) { return amount*price*8/10; } }
上下文类
package strategy; /** * 此类用于维护策略类的引用 */ public class Context { //引用 private Account account; //初始化 public Context(Account account){ this.account=account; } //调用计算方法 public double doAccount(int amount, double d){ return account.getPrice(amount, d); } }
测试类
package strategy; /** * 此策略模式测试类 */ public class Test { public static void main(String[] args) { // 声明商品 String name = "DVD"; int amount = 2; double price = 50; double sum = 0; // 声明对象 // 普通客户 Context context = new Context(new CommonAccount()); sum = context.doAccount(amount, price); System.out.println("普通客户:没有折扣,购买的商品名称: " + name + " 数量: " + amount + " 单价:" + price + " 应付金额:" + sum); // 普通会员 context = new Context(new InsiderAccount()); sum = context.doAccount(amount, price); System.out.println("普通会员:9折优惠,购买的商品名称: " + name + " 数量: " + amount + " 单价:" + price + " 应付金额:" + sum); // VIP context = new Context(new VipAccount()); sum = context.doAccount(amount, price);
System.out.println("VIP客户:8折优惠,购买的商品名称: " + name + " 数量: " + amount + " 单价:" + price + " 应付金额:" + sum); } }
结果:
普通客户:没有折扣,购买的商品名称: DVD 数量: 2 单价:50.0 应付金额:100.0 普通会员:9折优惠,购买的商品名称: DVD 数量: 2 单价:50.0 应付金额:90.0 VIP客户:8折优惠,购买的商品名称: DVD 数量: 2 单价:50.0 应付金额:80.0