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:面向对象编程并不是类越多越好,类的划分是为了封装,但是分类的基础是抽象,具有相同属性和功能的对象的抽象集合 才是 类。

《大话设计模式》num02---策略模式的更多相关文章

  1. 大话设计模式之策略模式(strategy)

    策略模式:它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响使用算法的用户. 针对商城收银模式,打折,返现促销等的例子: 打折还是促销其实都是一些算法,可以用工厂模式来 ...

  2. JavaScript设计模式之策略模式(学习笔记)

    在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选 ...

  3. [design-patterns]设计模式之一策略模式

    设计模式 从今天开始开启设计模式专栏,我会系统的分析和总结每一个设计模式以及应用场景.那么首先,什么是设计模式呢,作为一个软件开发人员,程序人人都会写,但是写出一款逻辑清晰,扩展性强,可维护的程序就不 ...

  4. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  5. PHP设计模式之策略模式

    前提: 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查 找.排序等,一种常用的方法是硬编码(Hard Cod ...

  6. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  7. JavaScript设计模式之策略模式

    所谓"条条道路通罗马",在现实中,为达到某种目的往往不是只有一种方法.比如挣钱养家:可以做点小生意,可以打分工,甚至还可以是偷.抢.赌等等各种手段.在程序语言设计中,也会遇到这种类 ...

  8. 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查

    原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...

  9. 大话设计模式之模板模式 C#

    学无止境,精益求精 十年河东,十年河西,莫欺少年穷 今天一起探讨模板模式,如下: 一.概念 上一篇文章讲了大话设计模式:原型模式,原型模式主要是通过Clone()方法<深浅复制>,创建新的 ...

  10. 设计模式入门,策略模式,c++代码实现

    // test01.cpp : Defines the entry point for the console application.////第一章,设计模式入门,策略模式#include &quo ...

随机推荐

  1. Tiny4412 LED 硬件服务

    1.Android系统中启动框架 2.首先实现驱动程序 #include <linux/kernel.h> #include <linux/module.h> #include ...

  2. struts2 json返回试验

    <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-/ ...

  3. Linux下UDP发送大量请求导致Operation not permitted的问题探讨

    一.问题背景目前公司准备上微服务的架构模式,在对比大量的API网关之后,最后选中了Kong作为我们的API网关,在经过大量的研究之后,啊呸,踩坑之后,终于跑起来了,简直是普天同庆,撒花祝贺. 但是在美 ...

  4. CentOS7下源码安装5.6.23

    清理CentOS7下的MariaDB. [root@localhost ~]#rpm -qa | gremp mariadb     [root@localhost ~]# rpm -e --node ...

  5. AngularJs(Part 6)

    Overcomming same-origin policy restrictions with JSONP. AJAX has a restriction that it can only retr ...

  6. CentOS 6.5 and Ubuntu 14.04 使用外部邮箱发送邮件

    我们可以使用外部邮箱(163,126,gmail,139等等)为我们发邮件 for CentOS 6.5 yum -y install mailx vi /etc/mail.rc 在文件的末行添加以下 ...

  7. 《精通Spring4.X企业应用开发实战》读后感第七章(创建增强类)

  8. hdu1058

    #include<iostream> #include<string> using namespace std; int const N = 4; int map[N] = { ...

  9. How to generate rtabmap with a Realsense D435 or Xtion Pro Live?(如何使用Realsense D435或者Xtion Pro Live生成rtabmap?)

    Ubuntu16.04,ROS kinetic 1.在ROS中安装rtabmap_ros包 sudo apt-get install ros-kinetic-rtabmap-ros 2. RGB-D相 ...

  10. Spring是一个分层的Java

    Spring简介 Spring是一个分层的Java SE/EE应用一站式的轻量级开源框架.Spring核心是IOC和AOP. Spring优点 -方便解耦,简化开发,通过Spring提供的IoC容器, ...