策略模式

1、概念:
     策略模式就是定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。策略模式把对象本身和运算规则区分开来

2、优点:
     (1) 消除了代码中的一些if…else,或者case语句;

     (2) 可以提供相同行为的不同实现

3、缺点:
     (1) 客户端必须知道所有的策略类,并自行决定使用哪一个策略类

     (2) 策略模式将造成产生很多策略类

4、这个模式涉及到三个角色:

     (1) 环境(Context)角色:持有一个Strategy的引用。

     (2) 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

     (3) 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

     抽象策略类:
          public interface Strategy {
              /**
               * 策略方法
               */
              public void strategyInterface();
          }

     具体策略类:
          public class ConcreteStrategyA implements Strategy {
              @Override
              public void strategyInterface() {
                  //相关的业务
              }
          }

          public class ConcreteStrategyB implements Strategy {
              @Override
              public void strategyInterface() {
                  //相关的业务
              }
          }

     环境角色类:
          public class Context {
              //持有一个具体策略的对象
              private Strategy strategy;
              /**
               * 构造函数,传入一个具体策略对象
               * @param strategy    具体策略对象
               */
              public Context(Strategy strategy){
                  this.strategy = strategy;
              }
              /**
               * 策略方法
               */
              public void contextInterface(){
                  strategy.strategyInterface();
              }
          }
举例:
超市有三种会员,普通会员,银牌会员和金牌会员,每个级别的会员打折力度不同,普通会员按原价出售,银牌会员打9折,金牌会员打8折,并且一个顾客每
消费10000就增加一个级别,那么我们就可以使用策略模式,因为策略模式描述的就是算法的不同。

(1)、首先定义一个用于计算价格策略接口
public interface CalPrice {
    //根据原价返回一个最终的价格
    Double calPrice(Double orgnicPrice);
}

(2)、 具体策略类:
普通会员的价格计算:
public class Orgnic implements CalPrice {
    @Override
    public Double calPrice(Double orgnicPrice) {
        return orgnicPrice;
    }
}
银牌会员的价格计算:
public class SilverVip implements CalPrice {
    @Override
    public Double calPrice(Double orgnicPrice) {
        return orgnicPrice * 0.9;
    }
}
金牌会员的价格计算:
public class GoldVip implements CalPrice {
    @Override
    public Double calPrice(Double orgnicPrice) {
        return orgnicPrice * 0.8;
    }
}

(3)、客户类帮我们完成会员升级的功能。
public class Player {
    private Double totalAmount = 0D;//客户在超市消费的总额
    private Double amount = 0D;//客户单次消费金额
    private CalPrice calPrice = new Orgnic();//每个客户都有一个计算价格的策略,初始都是普通计算,即原价

    //客户购买商品,就会增加它的总额
    public void buy(Double amount) {
        this.amount = amount;
        totalAmount += amount;
        if (totalAmount > 20000) {//20000则改为金牌会员计算方式
            calPrice = new GoldVip();
        } else if (totalAmount > 10000) {//类似
            calPrice = new SilverVip();
        } 
    }

    //计算客户最终要付的钱
    public Double calLastAmount() {
        return calPrice.calPrice(amount);
    }
}
客户端调用,系统会帮我们自动调整收费策略。
public class Client {
    public static void main(String[] args) {
        Player player = new Player();
        player.buy(5000D);
        System.out.println("客户需要付钱:" + player.calLastAmount());    //原价
        player.buy(12000D);
        System.out.println("客户需要付钱:" + player.calLastAmount());   //9折
        player.buy(12000D);
        System.out.println("客户需要付钱:" + player.calLastAmount());   //8折
    }
}

你可能感兴趣的:(策略模式)