JAVA设计模式《一》
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
本篇将为大家介绍JAVA中的设计模式的第一种:责任链模式。
什么是责任链模式呢?举一个例子:由于目前的房价持续上涨,我们这群小青年,经过无数年打拼,总算攒够了买房的钱,于是乎你高高兴兴的来到售房处,准备买一套3居室,这是一位售楼小姐走过了问:先生你需要买房吗?你很高兴的对她说是的。经过精挑细选,你看中了一套,这是你对售楼小姐说,你能给我个5%的折扣吗?给的话立马全款。这是售楼小姐一想5%的折扣在我的决定权之内,于是乎她很高兴的说:好的先生,那您付款吧。第二天又来了一个买房的人,这个人呢?是个钻石王老五,他呢对售楼小姐说:给我10%的折扣我就买3套。售楼小姐一想,10%的折扣超出了我的权限范围,于是他就对王老五说:先生请稍等,我请示一下我们的经理。然后售楼小姐就找经理去了,把情况都报告给了经理,经理一想,10%的权限我有,于是对售楼小姐说可以。然后售楼小姐就回来对王老五说:先生我们经理已经同意给你10%的折扣,你到这边付一下款吧。讲到这里大家是不是已经对责任链有了一定的认识呢?下面我们就用代码具体实现一下这个过程。
1、创建处理折扣处理人对象:
- /**
- * @价格处理人,负责处理客户的折扣申请
- */
- public abstract class PriceHandler {
- //直接后继,用于传递请求
- protected PriceHandler successor;
- public void setSuccessor(PriceHandler successor){
- this.successor = successor;
- }
- //处理折扣申请
- public abstract void processDiscount(float discount);
- }
2、创建一个销售类对象:
- /*
- * 销售,可以批准5%以内的折扣
- */
- public class Sales extends PriceHandler {
- public void processDiscount(float discount) {
- if(discount<=0.05){
- System.out.println("销售批准");
- //System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(), discount);
- }else{
- successor.processDiscount(discount);
- }
- }
- }
3、创建一个销售经理对象:
- /*
- * 销售经理,可以批准30%以内的折扣
- */
- public class Manager extends PriceHandler {
- public void processDiscount(float discount) {
- if(discount<=0.3){
- System.out.println("销售经理批准");
- //System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(), discount);
- }else{
- successor.processDiscount(discount);
- }
- }
- }
4、创建一个销售副总裁对象:
- /*
- * 销售副总裁,可以批准50%以内的折扣
- */
- public class Director extends PriceHandler {
- public void processDiscount(float discount) {
- if(discount<=0.5){
- System.out.println("销售副总裁批准");
- //System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(), discount);
- }else{
- successor.processDiscount(discount);
- }
- }
- }
5、创建一个销售总监对象:
- /*
- * 销售总监,可以批准40%以内的折扣
- */
- public class VicePresident extends PriceHandler {
- public void processDiscount(float discount) {
- if(discount<=0.4){
- System.out.println("销售总监批准");
- //System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(), discount);
- }else{
- successor.processDiscount(discount);
- }
- }
- }
6、创建一个CEO对象:
- /*
- * 总裁,可以批准55%以内的折扣
- */
- public class CEO extends PriceHandler {
- public void processDiscount(float discount) {
- if(discount<=0.55){
- System.out.println("总裁批准");
- //System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(), discount);
- }else{
- System.out.println("总裁拒绝批准");
- //System.out.format("%s拒绝了折扣:%.2f%n", this.getClass().getName(), discount);
- }
- }
- }
7、创建PriceHandler的工厂方法:
- public class PriceHandlerFactory {
- //创建PriceHandler的工厂方法
- public static PriceHandler createPriceHandler() {
- PriceHandler sales = new Sales();
- PriceHandler man = new Manager();
- PriceHandler dir = new Director();
- PriceHandler vp = new VicePresident();
- PriceHandler ceo = new CEO();
- sales.setSuccessor(man);
- man.setSuccessor(dir);
- dir.setSuccessor(vp);
- vp.setSuccessor(ceo);
- return sales;
- }
- }
8、编写我们的测试类:
- /*
- * 客户,请求折扣
- */
- public class Customer {
- private static PriceHandler priceHandler;
- public void setPriceHandler(PriceHandler priceHandler){
- this.priceHandler = priceHandler;
- }
- public void requestDiscount(float discount){
- priceHandler.processDiscount(discount);
- }
- public static void main(String[] args) {
- Customer customer = new Customer();
- customer.setPriceHandler(PriceHandlerFactory.createPriceHandler());
- Random random = new Random();
- for(int i = 0; i<=100; i++){
- System.out.print(i+":");
- customer.requestDiscount(random.nextFloat());
- }
- }
- }
9、代码运行测试:
10、添加销售小组长对象:
- /*
- * 销售小组长拥有15%的批准权限
- */
- public class Group extends PriceHandler {
- public void processDiscount(float discount) {
- if(discount < 0.15){
- System.out.println("销售小组长长批准");
- }else{
- successor.processDiscount(discount);
- }
- }
- }
11、把小组长添加到责任链中:
- public class PriceHandlerFactory {
- //创建PriceHandler的工厂方法
- public static PriceHandler createPriceHandler() {
- PriceHandler sales = new Sales();
- //创建销售小组长对象
- PriceHandler group = new Group();
- PriceHandler man = new Manager();
- PriceHandler dir = new Director();
- PriceHandler vp = new VicePresident();
- PriceHandler ceo = new CEO();
- sales.setSuccessor(group);
- //把销售小组长添加到责任链当中
- group.setSuccessor(man);
- man.setSuccessor(dir);
- dir.setSuccessor(vp);
- vp.setSuccessor(ceo);
- return sales;
- }
- }
12、代码测试:
对于责任链模式,就为大家介绍完毕。下一篇:单例模式与模板方法模式
JAVA设计模式《一》的更多相关文章
- Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)
1 概念定义 1.1 定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2 类型 创建类模式 2 原理特征 2.1 类 ...
- Java 设计模式系列(十四)命令模式(Command)
Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...
- Java 设计模式之建造者模式(四)
原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...
- 深入探索Java设计模式(四)之享元模式
享元模式适用于需要大量相同类型对象的情况.在此,设计布局可以减少创建多个对象的方式.对象在运行时会消耗资源,因此最好在内存中使用较少的对象.它减少了内存占用并利用了程序的整体性能.本文是在学习完优锐课 ...
- 【白话设计模式四】单例模式(Singleton)
转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
- Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章
原创文章,转载请务注明出处 OOP三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...
随机推荐
- 使用Xcode6创建EmptyProject
多年不写文章,今天突然准备好好写一些博客,以记录自己在编程这条道路上的成长,与所学所悟.提起笔来,才发现,自己的语言之匮乏,思虑再三,始觉不顺.也罢,从头开始慢慢训练吧. 自Xcode6更新之后,默认 ...
- [置顶]PADS PCB功能使用技巧系列之NO.002- 如何走差分线?
差分信号在高速电路设计中应用越来越广泛,如USB.HDMI.PCI.DDR*等,承载差分信号的差分线主要优势有:抗干扰能力强,能有效抑制EMI.时序定位精确等,对于PCB工程师来说,最关注的是如何确保 ...
- java基础1_Java数据类型
一 . Java的数据类型分为 1.原生数据类型 也叫基本数据类型,分为整形,浮点型,字符型,布尔型.整形有 byte,short,int,long:浮点型有float,double;字符型有 cha ...
- SAP HANA企业级培训系列课程<第一部分>
No. 课程 备注 1 HANA概述 HANA 特点 2 HANA Server & Studio & Client 认识HANA Server \Client\ Studio, 熟悉 ...
- 百度地图API多个点聚合时,标注添加的标签label地图刷新就丢失的问题解决
当将自定义的Marker(含有Label)通过MarkerClusterer 管理的时候,当地图发生任何移动.缩放 的时候,Marker 的Label 就会自动消失. 这个问题主要是由于百度的点聚合A ...
- 用Navicat Premium 远程连接oracle数据库
1.安装Navicat Premium软件(我的是11.0.7版本)(假设安装路径为D:\NavicatLite\Navicat Premium) 2.下载 instantclient-basic-n ...
- PHP路径常量和函数解释
文件目录:
- linux延时关机
04.shutdown +2 "The machine will shutdown" # 2min 后关机,并通知在线者 05.shutdown -h now 立刻关机,其中now ...
- Rubinius 2.0 发布,Ruby 虚拟机
Rubinius 2.0 发布了,官方发行说明请看这里. Rubinius是一个运行Ruby程序的虚拟机,其带有Ruby的核心库. Rubinius的设计决定了其调试功能的强大,使得在运行时常规的Ru ...
- 【TypeScript】如何在TypeScript中使用async/await,让你的代码更像C#。
[TypeScript]如何在TypeScript中使用async/await,让你的代码更像C#. async/await 提到这个东西,大家应该都很熟悉.最出名的可能就是C#中的,但也有其它语言也 ...