Java描述设计模式(22):策略模式

  

本文源码:GitHub·点这里| | GitEE·点这里

  

一、生活场景

  

每年双十一,各大电商平台会推出不同的满减策略,当用户的消费金额满一定额度后,会进行减去一定的优惠额度,从而来一波清仓甩卖,使用策略模式来描述该流程。

  
 <代码类="语言java ">公共类C01_InScene {
  公共静态void main (String [] args) {//选择满减策略,走相应的计算方式
  FullReduce策略=new Full100 ();
  支付价格=new支付(策略);
  双引号=price.payment (300);
  system . out。println(“最终价格为:" + ");
  }
  }/* *
  *付款
  */类支付{
  私人FullReduce FullReduce;
  公共支付(FullReduce FullReduce) {
  这一点。fullReduce=fullReduce;
  }
  公共支付两倍(双totalPrice) {
  返回this.fullReduce.getPayMoney (totalPrice);
  }
  }/* *
  *金额满减接口
  */接口FullReduce {
  双getPayMoney(双totalPrice);
  }/* *
  *不同的满减策略
  */类Full100实现FullReduce {
  @Override
  公共双getPayMoney(双totalPrice) {
  如果(totalPrice祝辞=100){
  totalPrice=totalPrice - 20.0;
  }
  返回totalPrice;
  }
  }
  类Full500实现FullReduce {
  @Override
  公共双getPayMoney(双totalPrice) {
  如果(totalPrice祝辞=500){
  totalPrice=totalPrice - 120.0;
  }
  返回totalPrice;
  }
  } 
  

二、策略模式

  

1,基础概念

  
  

策略模式属于对象的行为模式。策略模式中定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户端。

     

2,模式图解

  

 Java描述设计模式(22):策略模式

  

3,核心角色

  
      <李>环境角色李   
  
  

持有一个战略策略接口角色的引用。

     
      <李>抽象策略角色李   
  
  

通常由一个接口或抽象类实现。此角色给出所有的具体策略类要实现的接口。

     
      <李>具体策略角色李   
  
  

包装相关的算法或业务流程。

     

4,源码实现

  
 <代码类="语言java ">公共类C02_Strategy {
  公共静态void main (String [] args) {
  战略策略=new ConcreteStrategyB ();
  上下文语境=new上下文(策略);
  context.userMethod ();
  }
  }/* *环境角色类*/类上下文{//持有一个具体策略的对象
  私人战略策略;/* *
  *构造函数,传入一个具体策略对象
  * @param策略具体策略对象
  */公共环境(战略策略){
  这一点。策略=策略;
  }
  公共空间userMethod () {
  this.strategy.strategyMethod ();
  }
  }/* *抽象策略类*/接口策略{//策略方法
  空白strategyMethod ();
  }/* *具体策略类*/类ConcreteStrategyA实现策略{
  @Override
  公共空间strategyMethod () {
  System.out.println(“策略一方法”);
  }
  }
  类ConcreteStrategyB实现策略{
  @Override
  公共空间strategyMethod () {
  System.out.println(“策略B方法”);
  }
  } 
  

三、策略模式总结

  
  

策略模式的关键是:变化的与不变分离,体现了“对修改关闭,对扩展开放“原则。客户端增加行为不用修改原有代码,只要添加一种策略即可,易于切换,易于理解,易于扩展。策略过多是会导致类数目庞大,变得难以维护。

     

四、源代码地址

  
 <代码> GitHub·地址
  https://github.com/cicadasmile/model-arithmetic-parent
  GitEE·地址
  https://gitee.com/cicadasmile/model-arithmetic-parent  
  

 Java描述设计模式(22):策略模式

Java描述设计模式(22):策略模式