设计模式之第13章-职责链模式(Java实现)

  “请假都那么麻烦,至于么。”“咋的了?”“这不快过年了么,所以我想早两天回去,准备一下,买买东西什么的,然后去给项目经理请假,但是他说快过年了,所以这个事儿他没法决定,所以只能找总经理了,你说麻不麻烦。”“这不是很正常么,现在好多事不都是这样的,尤其是那些大公司,制度完善,分工更加细致,层级多,更麻烦。不过这就牵扯到今天的职责链模式了。”“什么?这都能扯到传说中的职责链模式?”

职责链模式之自我介绍

  当当当当~我就是人见人耐,花见花开,车见车爆胎的职责链是也。人们都我的定义是:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.意思是:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。职责链重点在“链”上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果,它的通用类图是:

  至于类图的含义么,讲的这么清楚的图我就不再赘述了。(作者按:挺好,颇有我的风格。众人:被作者带坏的某人。)

职责链模式之自我分析

  我呢,比他们差远了,因为印象中我好像全是缺点的说。(场下响起热烈的掌声。众人:看看,人家多谦虚,哪像前面几个,都声称自己毫无缺点,谁信啊,哪有那么完美的存在,俗话说:不存在银弹的好吗。躺枪的某些模式们。)我的缺点嘛,如下:

  • 性能不是很好,由于从链头开始遍历,因此链比较长的时候性能问题将会暴漏。
  • 调试不便。链长后所带来的问题。
  • 不保证被接受。若无明确的接受者,无法保证一定被处理。

  突然想起来貌似还是有那么一丢丢优点的:

  • 降低耦合度。
  • 增强了给对象指派职责的灵活性。

职责链之实现

  我们就以大家常见的请假来具体实现一下职责链模式。首先是员工,也就是程序员的接口:

 public interface IEmployee{
//获取请求级别
public int getType();
//获取个人请示
public String getRequest();
}

  接下来是员工的具体实现类:  

 public class Employee implements IEmployee{
//请假
private String request = "";
//请求级别
private int type = 0; public Employee(String req, int type){
this.req = request;
this.type = type;
} public int getType(){
return this.type;
} public String getRequest(){
return this.request;
}
}

  员工请假总要找人请示,而管理层的人的接口Handler代码如下:

 public abstract class Handler{
public final static int MANAGER_REQUEST = 1;
public final static int PROJECT_MANAGER = 2; //能处理的级别
private int level = 0;
//责任传递给下一个负责人
private Handler nextHandler;
//每个类说明一下自己能处理的请求
public Handler(int lev)
{
this.lev = level;
}
//处理请求
public final void HandleMessage(IEmployee emp){
if (emp.getType() == this.level) {
this.response(emp);
}
else{
if(this.nextHandler != null){
//处理不了请求,将请求上报给上层
this.nextHandler.HandleMessage(emp);
}
else{
//无上层领导了
System.out.println("默认好不好了");
}
}
}
//不归你管的请求,不能僭越,要找下一层
public void setNext(Handler han){
this.nextHandler = han;
} //对于请求的回应
protected abstract void response(IEmployee emp);
}

  下面是具有管理权限的第一层项目经理的实现类,实现类中首先确定自己能处理的级别,然后就是对于请求作出回应。

 public class ProjectManager extends Handler{
//只能处理部分员工的请求:
public ProjectManager(){
super(Handler.PROJECT_MANAGER);
}
//答复
protected void response(IEmployee emp){
System.out.println("员工要请假");
System.out.println(emp.getRequest());
System.out.println("我管不了啊,要问领导了");
}
}

  接下来是总经理类,同样是确定能处理事情的级别以及作出回应。

 public class Manager extends Handler{
//请求级别
public Manager(){
super(Handler.MANAGER_REQUEST);
}
//回复
protected void response(IEmployee emp){
System.out.println("员工要请假");
System.out.println(emp.getRequest());
System.out.println("准!");
}
}

  好了,以上就是其具体的实现了。

职责链模式之应用场景

  应用场景还是蛮多的,以下情况就可以用到:

  • 有多个对象可以处理一个请求的时候。
  • 可处理一个请求的对象集合应被动态的指定。
  • 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

  好了。That‘s all。下面由鱼哥讲话。(我勒个去,这孩子好有眼力劲儿。)那个,我也没什么可说的了。吃饭去了。

  PS:本博客欢迎转发,但请注明博客地址及作者~

  博客地址:http://www.cnblogs.com/voidy/

  博客新址:http://voidy.net

  <。)#)))≦

设计模式之第13章-职责链模式(Java实现)的更多相关文章

  1. 第22章 职责链模式(Chain of Responsibility)

    原文 第22章 职责链模式(Chain of Responsibility) 职责链模式 导读:职责链模式是一个既简单又复杂的设计模式,刚开始学习这个设计模式的时候光示例都看了好几遍.就为了理清里面的 ...

  2. 设计模式之第2章-抽象工厂模式(Java实现)

    设计模式之第2章-抽象工厂模式(Java实现) “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说 ...

  3. 设计模式之第19章-中介者模式(Java实现)

    设计模式之第19章-中介者模式(Java实现) “测试妹纸找你,你的代码出问题了.”“美工妹纸让你看看界面怎么样.”身为程序员总要和各种人打交道,但是如果再分为前端.后端工程师的话,那么关系就会错综复 ...

  4. 设计模式之第12章-享元模式(Java实现)

    设计模式之第12章-享元模式(Java实现) “怎么回事,竟然出现了OutOfMemory的错误.鱼哥,来帮我看看啊.”“有跟踪错误原因么?是内存泄露么?”“不是内存泄露啊,具体原因不知道啊.对了,有 ...

  5. 设计模式之第1章-工厂方法模式(Java实现)

    设计模式之第1章-工厂方法模式(Java实现) “我先来”,“不,老公,我先!”.远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~ ...

  6. 《javascript设计模式与开发实践》阅读笔记(13)—— 职责链模式

    职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 书里的订单的例子 假设我们负责一个售卖手机 ...

  7. 设计模式之职责链模式(JAVA实现)

    学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式. 主要场景: 小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没 ...

  8. C#设计模式学习笔记:(20)职责链模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8109100.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第八个模式--职 ...

  9. python设计模式第十九天【职责链模式】

    1.应用场景 (1)将一个任务拆分为具有顺序的多个部分,每个类完成相应的部分,并且顺序执行 (2)软件窗口的消息传播 (3)SERVLET容积的过滤器Filter的实现 2.代码实现 #!/usr/b ...

随机推荐

  1. 未整理js

    函数+对象=方法 方法是动作 有参数的函数=实例 使用new关键字和函数来创建一个实例 var p =new Point(1,1)//平面几何的点 表示遍历的语句样子: for(var i =0; i ...

  2. python3基础07(进程操作及执行系统级命令等)

    #subprocess 创建子进程 连接输入 输出 管道错误,及获取他们的状态,可执行操作系统级的命令# subprocess.run(args, *, stdin=None, input=None, ...

  3. 从.net到java,从基础架构到解决方案。

    这一年,职业生涯中的最大变化,是从.net到java的直接跨越,是从平台架构到解决方案的不断完善. 砥砺前行 初出茅庐,天下无敌.再学三年,寸步难行.很多时候不是别人太强,真的是自己太弱,却不自知. ...

  4. [VC]C++ operator 两种用法

    C++中的operator,有两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换).下面分别进行介绍:   1.operato ...

  5. World Wind Java开发之七——读取本地栅格文件(影像+高程)构建三维场景(转)

    http://blog.csdn.net/giser_whu/article/details/41679515 首先,看下本篇博客要达到的效果图: 下面逐步分析如何加载影像及高程文件. 1.World ...

  6. python剑指offer剪绳子

    题目 给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1)每段绳子的长度记为k[0],k[1],…,k[m].请问k[0]k[1]…*k[m]可能的最大乘积是多少 ...

  7. Java后台工程师的3次面试

    第一次面试 我面的是一个中小公司,在BOSS直聘上面找的,去之前看了看关于Java的一些基础知识,在牛客网上面看的,也做了一下牛客网的题目.然后跟HR约了一个时间就去面试了.因为第一次面试,一点经验都 ...

  8. 阿里云服务器下安装LAMP环境(CentOS Linux 6.3)(1)

    阿里的云服务器准备好以后,我们首先要做的就是把自己购买的磁盘空间挂载到系统里面,我们为服务器选择的是 Linux 系统,确切说的是 CentOS 系统. 默认阿里云服务器带了一个 20G 的空间,一般 ...

  9. 网络编程——网络模型和InetAddress类

    第1章 网络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和 ...

  10. 基于GMap.NET地图下载器的开发和研究

    基于GMap.NET地图下载器的开发和研究 软件下载地址:https://pan.baidu.com/s/1ay0aOm3fiZ35vlfD8kFYFw 1.地图浏览功能 可以浏览谷歌地图.百度.ar ...