java设计模式学习之策略模式

策略模式:策略模式是一种定义一系列算法的方法,算法完成的工作都是相同的工作,但是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

Java实现一个策略模式:

需求:商场收银系统,收银方式为正常收费,打八折,满300返100,这三种收费方式。

1:创建一个超类。即收费的抽象方法。

public abstract class CashSuper {
  public abstract double acceptCash(double money);
}

2:创建实现此超类的类。

public class CashNormal extends CashSuper {

  @Override
  public double acceptCash(double money) {
    return money;
  }

}

3:根据商场收费方式的不同,创建三种收费方式的具体实现算法类

/**打折子类
 * 获取打折折扣,使用应付金额乘以折扣
 * @author 我不是张英俊
 *
 */
public class CashRebate extends CashSuper {

  private double moneyRebate=1;

  public CashRebate(String moneyRebate){
    this.moneyRebate=Double.parseDouble(moneyRebate);
  }
  @Override
  public double acceptCash(double money) {

    return money*moneyRebate;
  }

}
/**返利收费子类,例如,满三百减一百
 * @author 我不是张英俊
 *
 */
public class CashReturn extends CashSuper {

  /**
   * 返利收费,初始化时必须要输入返利条件和返利值,比如慢300时返100,
   * 则moneyCondition为300,moneyRetrun 为100
   */
  private double moneyCondition=0;
  private double moneyReturn=0;

  public CashReturn(String moneyCondition,String moneyReturn){
    this.moneyCondition=Double.parseDouble(moneyCondition);
    this.moneyReturn=Double.parseDouble(moneyReturn);
  }

  @Override
  public double acceptCash(double money) {

    double result=money;
    if(money>=moneyCondition){
      result=money-Math.floor(money/moneyCondition)*moneyReturn;
    }

    return result;
  }

}
/**
 *正常收费的,原价返回
 * @author 我不是张英俊
 *
 */
public class CashNormal extends CashSuper {

  @Override
  public double acceptCash(double money) {
    return money;
  }

}

4:写一个Context来通过同一个方法进行 不同付费方式的实现。因为需要创建不同的对象,所以需要结合简单工厂模式来实现。

public class CashContext {

  private CashSuper cs=null;

  public CashContext(String type){
    switch (type) {
    case "正常收费":
      CashNormal cs0=new CashNormal();
      cs=cs0;
      break;
    case "满300返100":
      CashReturn cr1=new CashReturn("300", "100");
      cs=cr1;
      break;
    case "打八折":
      CashRebate cr2=new CashRebate("0.8");
      cs=cr2;
      break;

    }
  }

  public double GetResult(double money){
    return cs.acceptCash(money);
  }

}

5:测试类

public class Test {

  public static void main(String[] args) {

    double a=new CashContext("打八折").GetResult(300);
    System.out.println(a);
    double b=new CashContext("正常收费").GetResult(300);
    System.out.println(b);
    double c=new CashContext("满300返100").GetResult(300);
    System.out.println(c);
  }

}

6:控制台。

240.0
300.0
200.0

总结:策略模式简化了单元测试,因为每个算法都是自己的类,可以通过自己的接口单独测试。

策略模式是用来封装算法的,但是在实际使用过程中,可以用他来封装几所任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

自己感悟:总的来说,策略模式对算法进行了封装,例如功夫熊猫,继承动物的超类之后,既需要有实现语言的功能,又需要实现功夫的功能,使用策略模式,将各个算法分开,在使用的时候可以很好的组合在一起。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java设计模式之策略模式详解

    本文实例为大家分享了Java策略模式,供大家参考,具体内容如下 1.策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern). 定义如下: Define a family of algorithms,encapsulate each one,and make them interchangeable.    (定义一组算法,将每个算法都封装起来,并且使它们之间可以互换.) 策略模式的通用类图如下所示: 策略模式的三个角色: ● Context

  • Java设计模式之策略模式(Strategy模式)介绍

    Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线,一个是框图(bar),这是两种算法,可以使用Strategy实现. 这里以字符串替代为例,有一个文件,我们需要读取后,希望替代其中相应的变量,然后输出.关于替代其中变量的方法可能有多种方法,这取决于用户的要求,所以我们要准备几套变量字符替代方案. 首先,我们建立一个抽象类RepTempRule 定义

  • Java设计模式之策略模式_动力节点Java学院整理

    定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 类图: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过的行为类模式中,有一种模式也是关注对算法的封装--模版方法模式,对照类图可以看到,策略模式与模版方法模式的区别仅仅是多了一个单独的封装类Context,它与模版方法模式的区别在于:在模版方法模式中,调用算法的主体在抽象的父类中,而在策略模式中,调用算法的主体则是封装到了封装类Context中

  • Java经典设计模式之策略模式原理与用法详解

    本文实例讲述了Java经典设计模式之策略模式.分享给大家供大家参考,具体如下: 策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式一般由下面三部分组成: 1. 抽象策略角色: 策略类,通常由一个接口或者抽象类实现. 2. 具体策略角色:包装了相关的算法和行为. 3. 环境角色:持有某一个策略类的引用,客户端调用. 策略模式设计原则: 1. 把程序中需要变化的部分抽离出来,独立于不变

  • 详解Java设计模式编程中的策略模式

    定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 类图: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过的行为类模式中,有一种模式也是关注对算法的封装--模版方法模式,对照类图可以看到,策略模式与模版方法模式的区别仅仅是多了一个单独的封装类Context,它与模版方法模式的区别在于:在模版方法模式中,调用算法的主体在抽象的父类中,而在策略模式中,调用算法的主体则是封装到了封装类Context中

  • 对比Java设计模式编程中的状态模式和策略模式

    为了能在Java应用程序中正确的使用状态模式和策略模式,开发人员需要清楚地知道这两种模式之间的区别.尽管状态模式和策略模式的结构非常相似,它们又同样遵循开闭原则,都代表着SOLID设计原则的'O',但它们的意图是完全不同的.Java中的策略模式是对一组相关的算法进行封装,给调用方提供了运行时的灵活性.调用方可以在运行时选择不同的算法,而不用修改使用策略的那个Context类.使用策略模式的经典例子包括实现加密算法,压缩算法,以及排序算法.另一方面,状态模式使用一个对象可以在不同的状态下表现出不同

  • java设计模式学习之策略模式

    策略模式:策略模式是一种定义一系列算法的方法,算法完成的工作都是相同的工作,但是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合. Java实现一个策略模式: 需求:商场收银系统,收银方式为正常收费,打八折,满300返100,这三种收费方式. 1:创建一个超类.即收费的抽象方法. public abstract class CashSuper { public abstract double acceptCash(double money); } 2:创建实现此

  • JAVA设计模式中的策略模式你了解吗

    目录 策略模式 策略模式是什么 策略模式的使用场景 策略模式实践 总结 策略模式 世界上本没有模式; 一些程序老鸟在长时间的编程工作总结出高效的代码写法被后世推崇; 并整理出固定的写法规范,这个写法规范目前收录有23种 这些规范被称之为 --> 设计模式 策略模式是什么 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 策略模式的使用场景 Q: 我们知道策略模式最重要的就是封装变化点,那边对于变化点我们一般用什么处理呢?

  • java设计模式学习之代理模式

    代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 代理模式结构图 模拟需求:3班小张喜欢1班小红,但是不认识小红,委托1班小明送给小红礼物. 1:创建一个小张和小明都能实现的接口. package ProxyModel; /** * 总的接口 * @author 我不是张英俊 * */ interface ISendGift { void GiveDolls(); void GiveFlowers(); void GiveChocolate(); } 2:实现小张送礼物.

  • Java深入讲解二十三种设计模式之中的策略模式

    目录 1 概述 2 策略模式 2.1 组成部分 2.2 代码示例 2.3 优缺点 1 概述 在平时开发中,往往会遇到这样一种情况,实现一种功能有很多种算法或者策略,我们可以根据不同的算法或者策略来实现这种功能.比如:想要计算一种计算物流的计算方式,都是计费,不同的快递有不同的计费方式,像京东快递.百世快递.圆通快递.它们之间计算运费的方式都是不同的.那我们怎么来实现呢?简单的就是if...else...或者switch...case....这两种实现方式被称之为硬编码.如果又新增了一种计费方式像

  • Java设计模式之抽象工厂模式

    一.场景描述 接<Java设计模式(一)工厂模式> 工厂模式有一缺点,就是破坏了类的封闭性原则.例如,如果需要增加Word文件的数据采集,此时按以下步骤操作: 创建Word文件数据采集类,实现仪器数据采集接口: 修改仪器数据采集工厂类,增加Word文件数据采集类的工厂方法: 调用工厂类的word文件方法: 步骤2修改了工厂类,如果每增加一实现类都需要修改工厂类,那么这样就不合理了. 解决办法是使用抽象工厂类,为每一个实现类都创建其工厂类,并增加工厂接口,使各工厂类实现该接口. 使用抽象工厂后,

  • Java设计模式之享元模式实例详解

    本文实例讲述了Java设计模式之享元模式.分享给大家供大家参考,具体如下: 解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象.比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象.如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了.那么如果要是每个字母都共享一个对象,那么就大大节约了资源. 在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweigh

  • Java设计模式之静态代理模式实例分析

    本文实例讲述了Java设计模式之静态代理模式.分享给大家供大家参考,具体如下: 代理模式,可以通过代理可以在原来的基础上附加一些其他的操作.静态代理模式相对比较简单无需再程序运行时动态的进行代理. 静态代理模式的角色: ① 抽象角色:真实对象和代理对象的共同接口.其中声明真实对象和代理对象需要做的事. ② 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用. ③ 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作. 下面提

  • Java设计模式之享元模式

    本文介绍了Java设计模式之享元模式,供大家参考,具体内容如下 1.关于享元模式 享元模式有点类似于单例模式,都是只生成一个对象被共享使用.享元模式主要目的就是让多个对象实现共享,减少不会要额内存消耗,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,以此来降低内存的消耗. 2.享元模式结构图 因为享元模式结构比较复杂,一般结合工厂模式一起使用,在它的结构图中包含了一个享元工厂类. 在享元模式结构图中包含如下几个角色: Flyweight(抽象享元类):通常是一个接口或抽象类,

  • Java设计模式之Builder建造者模式

    一.场景描述 建造者模式同工厂模式.抽象工厂模式一样,用于创建继承类对象. 工厂模式:Java设计模式之工厂模式 抽象工厂模式:Java设计模式之抽象工厂模式 所不同的是,工厂模式下,各子类实现接口,通过工厂类创建子类对象:而建造者模式下,各子类拥有其建造者类,通过它创建不同的父类对象,最终实现多态,实际上子类.父类在代码中是不存在的. 以仪器数据采集工具为例,工厂模式下,定义接口"仪器数据采集工具",定义子类"PDF文件数据采集工具"和"Excel文件数

  • Java设计模式之构建者模式知识总结

    一.构建者模式 1.1 定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 1.2 主要作用 在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象. 用户只需要给出指定复杂对象的类型和内容: 建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来) 1.3 解决的问题 方便用户创建复杂的对象(不需要知道实现过程) 代码复用性 & 封装性(将对象构建过程和细节进行封装 & 复用) 例子:造汽车 & 买汽车. 工厂(建造者模式):负责制

随机推荐