美文网首页
策略模式

策略模式

作者: 紫雨杰 | 来源:发表于2018-06-11 11:26 被阅读0次
    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折
        }
    }
    

    相关文章

      网友评论

          本文标题:策略模式

          本文链接:https://www.haomeiwen.com/subject/htxwrftx.html