你的位置:首页 > Java教程

[Java教程]策略模式(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.0VIP客户:8折优惠,购买的商品名称:  DVD    数量:  2   单价:50.0   应付金额:80.0