文档章节

策略模式

金馆长1
 金馆长1
发布于 2015/12/13 17:34
字数 320
阅读 66
收藏 4

实例:商场收银软件

先贴代码:

现金收费抽象类:

package strategy;

public abstract class CashSuper {

   public abstract double acceptCash(double money);
}



正常收费子类:

package strategy;

public class CashNormal extends CashSuper {

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

}



打折收费子类:

package strategy;

public class CashRebate extends CashSuper {
  private double rebate;

  public CashRebate(double rebate) {
    this.rebate = rebate;
  }

  public double getRebate() {
    return rebate;
  }

  public void setRebate(double rebate) {
    this.rebate = rebate;
  }

  @Override
  public double acceptCash(double money) {
    return money * rebate/10;
  }

}



返利收费子类:

package strategy;

public class CashReturn extends CashSuper {
  private double achieveNum;
  private double returnNum;

  public CashReturn(double achieveNum, double returnNum) {
    this.achieveNum = achieveNum;
    this.returnNum = returnNum;
  }

  @Override
  public double acceptCash(double money) {
    if(money>achieveNum){
      return money-Math.floor(money/this.achieveNum)*returnNum;  
    }
   return money;
  }

  public double getAchieveNum() {
    return achieveNum;
  }

  public void setAchieveNum(double achieveNum) {
    this.achieveNum = achieveNum;
  }

  public double getReturnNum() {
    return returnNum;
  }

  public void setReturnNum(double returnNum) {
    this.returnNum = returnNum;
  }

}



现金收费工厂类:

package strategy;

public class CashContext {
    private CashSuper cs;
    
    public CashContext(String type){
      if(type.equals("normal")){
        this.cs = new CashNormal();
      }else if(type.equals("debate")){
        this.cs = new CashRebate(8.0);
      }else{
        this.cs = new CashReturn(300.0,100.0);
      }
    }
    
    public CashSuper getCs() {
      return cs;
    }

    public void setCs(CashSuper cs) {
      this.cs = cs;
    }

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



策略模式:

商场收银的时候到底是采用正常收费还是打折还是返利,都是不同的算法,所以分别封装起来,

算法就是一种策略,重要的是这些算法是随时可能互相替换的。

案例中的CashSuper就是抽象策略,CashNormal CashRebate CashReturn 就是具体策略。





© 著作权归作者所有

上一篇: 单一职责原则
下一篇: 简单工厂模式
金馆长1
粉丝 17
博文 43
码字总数 29363
作品 0
海淀
程序员
私信 提问

暂无文章

家庭作业——苗钰婷

2 编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound, Sally shouted, "By the Great Pumpkin, what was that! #include<stdio.h>int main(){......

OSC_Okruuv
33分钟前
5
0
经典系统设计面试题解析:如何设计TinyURL(一)

原文链接: https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
34分钟前
4
0
2.面向对象设计原则(7条)

开闭原则 开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。 实现方法 可以通过“抽象约束、封装变化”来实...

Eappo_Geng
36分钟前
8
0
8086汇编基础 debug P命令 一步完成loop循环

    IDE : Masm for Windows 集成实验环境 2015     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   ......

志成就
41分钟前
7
0
使用nodeJS实现前端项目自动化之项目构建和文件合并

本文转载于:专业的前端网站➜使用nodeJS实现前端项目自动化之项目构建和文件合并 前面的话   一般地,我们使用构建工具来完成项目的自动化操作。本文主要介绍如何使用nodeJS来实现简单的项...

前端老手
54分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部