设计模式(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设计模式《一》的更多相关文章

  1. Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)

    1     概念定义 1.1   定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2   类型 创建类模式 2     原理特征 2.1   类 ...

  2. Java 设计模式系列(十四)命令模式(Command)

    Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...

  3. Java 设计模式之建造者模式(四)

    原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...

  4. 深入探索Java设计模式(四)之享元模式

    享元模式适用于需要大量相同类型对象的情况.在此,设计布局可以减少创建多个对象的方式.对象在运行时会消耗资源,因此最好在内存中使用较少的对象.它减少了内存占用并利用了程序的整体性能.本文是在学习完优锐课 ...

  5. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

  6. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  7. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  8. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  9. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  10. Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章

    原创文章,转载请务注明出处 OOP三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...

随机推荐

  1. 结对项目——高级四则运算检验器记录(168 & 187)

    首先,上图(*+﹏+*)~@ 1.如何看待结对编程 结对编程优点: 1.两个人能够相互支持,相互监督,客服编程过程中可能出现的烦躁的情况0_0. 2.在开发功能的同时,伴随了UnitTest的进行,可 ...

  2. 完美获取N卡A卡的显存大小(使用OpenGL)

    // 基于扩展NVX_gpu_memory_info extension UINT      QueryNVidiaCardMemory() { __try { int iVal = 0; glGet ...

  3. 解决Win7下VC++6.0与Office不兼容的问题

    在Windows7下安装Visual C++ 6.0后,如果同时安装了Microsoft Office就会出现打开文件的时候出现异常,而导致VC6崩溃. 微软已经为我们解决了问题,开发出一个插件(Fi ...

  4. ELb表达式

    主要用于servlet的4个作用域取值:pageScope.requestScope.sessionScope.applicationScope 取值顺序依次从小到大.取值方式如:操作javabean ...

  5. Linux终端杀手、程序员利器-Tmux

        Send article as PDF      SA.Coder.经常远程.还在开一堆终端?试试 Tmux 吧,一个窗口就搞定. 目录 0.0.0.1 Tmux ? Tmux 是一个终端复用 ...

  6. Linux内核--网络栈实现分析(十)--网络层之IP协议(下)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7552455 更多请查看专栏,地 ...

  7. (转C#中Enum用法小结)

    enums枚举是值类型,数据直接存储在栈中,而不是使用引用和真实数据的隔离方式来存储. (1)默认情况下,枚举中的第一个变量被赋值为0,其他的变量的值按定义的顺序来递增(0,12,3...),因此以下 ...

  8. step by step设置postgresql用户密码并配置远程连接

    设置pgsql默认用户posgres的密码 1.确认pgsql是开启的 /etc/init.d/postgresql status 2.使用默认用户登录 sudo su postgres 3.进入ps ...

  9. MVC使用ASP.NET Identity 2.0实现用户身份安全相关功能,比如通过短信或邮件发送安全码,账户锁定等

    本文体验在MVC中使用ASP.NET Identity 2.0,体验与用户身份安全有关的功能: →install-package Microsoft.AspNet.Identity.Samples - ...

  10. AIX 文件 打包 与 压缩 tar gzip compress 的使用

    今天在Aix用tar -cvf 备份,打成tar包,占有硬盘空间过大,没有压缩比, 尝试使用tar -zcvf  linux系统下可以用-z 命令 (z 用gzip来压缩/解压缩文件,加上该选项后可以 ...