《大话设计模式》num02---策略模式


2018年01月22日 22:04:57 独行侠的守望 阅读数:72更多
个人分类: 设计模式
编辑
版权声明:本文为博主原创文章,转载请注明文章链接。 https://blog.csdn.net/xiaoanzi123/article/details/79133768
今天继续设计模式的回顾:第二篇策略模式:
只听名字总没有什么头绪,什么策略?
情景: 超市活动,有满减,有打折,有正常收费,求 不同情况下的付款额。
①创建 付款基类抽象类,有一个抽象方法apply用于计算活动后实际付款额

//付款 基类
public abstract class CashSuper {
  //计算付款额
  public abstract double apply(double money);
}


② 创建正常付费、打折付费、满减付费 三种付费方式类,分别继承付费基类。各自重写自己的apply方法。
// 满A返现(B) 方式
public class CashReturn extends CashSuper {
  private double A;
  private double B;
  public CashReturn(String a, String b) {
    super();
    A = Double.valueOf(a.toString());
    B = Double.valueOf(b.toString());
  }
  @Override
  public double apply(double money) {
    if(money >= A){
      return money - B;
    }else{
      return money;
    }
  }
}


package num02_策略模式;
// 打折方式 付费
public class CashRebate extends CashSuper {

  private double zhekou;// 打几折
  public CashRebate(String zhekou){
    this.zhekou = Double.valueOf(zhekou.toString());
  }
  @Override
  public double apply(double money) {
    return money * zhekou;
  }

}


package num02_策略模式;

//正常付费无活动 付款方式类
public class CashNormal extends CashSuper{
  @Override
  public double apply(double money) {
    return money;
  }

}


③创建付费工厂类,用于根据不同的情景创建不同付款方式的 具体类对象


package num02_策略模式;

//付款 工厂类,用于创建 不同付款方式 具体类对象
public class Context {
  CashSuper cs;
  //返现方式
  public Context(String high,String low){
    cs = new CashReturn(high,low);
  }
  public Context(String type) {
    switch(type){
      case "normal":
        cs = new CashNormal();
        break;
      case "0.8": //这里直接写死,用于说明折扣问题即可。
        cs = new CashRebate("0.8");
        break;
    }
  }
  //用于接受活动前初始金额,调用apply方法计算实际付款额
  public double getResult(double money){
    return cs.apply(money);
  }
}


④ main方法测试:


package num02_策略模式;
public class Main {
  public static void main(String[] args) {
    Context context = new Context("normal");
    double result = context.getResult(200);
    System.out.println(result); // 正常付款 200.0

    context = new Context("0.8");
    double result2 = context.getResult(200);
    System.out.println(result2); // 折扣付款 160.0

    context = new Context("500","50"); //满500减50
    double result3 = context.getResult(600);
    System.out.println(result3); // 满减付款 550.0
    double result4 = context.getResult(300);
    System.out.println(result4); // 满减付款 300.0
  }
}

策略模式:定义 了算法家族,分别封装起来,让他们之间可以互相替换。从而使算法的变化不会影响到使用算法的用户。算法本身只是一种策略,他是随时会变化的,比如超时又搞一个加多少元减多少元的活动,这是变化点。

就例子而言:不管打折还是返利,都是具体的付费算法。他们继承于抽象算法类CashSuper。在工厂类中有一个对CashSuper的引用,

利用多态在工厂类中创建具体付费方式对象。由于实例化不同的策略,所以最终在调用context.getResult时就会调用不同付费类的apply方法。


如果只用简单工厂模式,客户端需要认识CashSuper和Context两个类,现在采用策略模式结合简单工厂模式,只需要让客户端认识一个Context类即可,耦合度更加降低了【策略模式减少了 定义算法类 与 使用算法类 之间的耦合】。
ps:面向对象编程并不是类越多越好,类的划分是为了封装,但是分类的基础是抽象,具有相同属性和功能的对象的抽象集合 才是 类。

猜你喜欢

转载自www.cnblogs.com/dxxdsw/p/10644991.html
今日推荐