- 浏览: 191497 次
- 性别:
- 来自: 厦门
文章分类
最新评论
-
行者买刀:
qxpidt 写道楼主,我想问下,嵌套这些WEB应用后,如何操 ...
JDIC一个能够用java调用ie内核的包 -
qxpidt:
楼主,我想问下,嵌套这些WEB应用后,如何操作你登录的COOK ...
JDIC一个能够用java调用ie内核的包 -
lookforwarding:
...
java重写JSplitPane的UI,设置分隔条的颜色 -
v韧竹v:
最后那个抽象工厂模式,CarType是不是定义错了,应该abs ...
设计模式之略见一斑(工厂模式Factory) -
l7810:
这与模板模式有什么区别啊?
设计模式之略见一斑(建造模式builder)
设计模式 写道
面向对象开发人员通常希望明确和减少对象间的责任,从而降低对象之间的耦合程序。这样我们的系统更加容易修改,同时也可降低产生缺陷的风险。从某种程度上说,java语言本身能够帮助降低对象间的耦合度。客户端只能访问对象的接口,而不用关系其具体实现细节。借助于接口这种方式,客户端只需要了解方法的功能即可。如果我们按照某种层次结构进行组织,比如组织为类责任链,客户端代码就有可能不必事先了解自己将使用哪一个类。在这种情况下,链中的每个对象都有个方法,当客户端代码调用该方法的时候,这些对象要么执行该方法,要么沿着这条链转发该方法调用请求。
Chain of Responsibility模式可让每个对象都有一次机会决定自己是否处理请求,以便于避免请求的发送者与其接收者之间的耦合。
例子:
有一次我去公司报销一下车票,同事只跟我说在15楼,但具体在哪个地方他也不清楚。于是我上了15楼一进门就开始问了一下15前台,前台MM她说她也不清楚,可以问一下旁边的保险组,保险组是我们负责我们公司保险索赔的,其他车费报销他也不清楚。于是他就跟我们一直往前走问一下福利组,福利组知道后就告诉我说应该知财务组报销,地点就在我后面。于是我走过去把表格填了交下车票就走了。
这段事情看似简单其实就是一个责任链模式了,每个成员组都只负责自己范围内的工作。对于范围外的工作内容可能一概不知,或只知道一点点。于是当你找保险组时,他看到车票不是在他的工作范围内时。他会把你介绍到他旁边的福利组。下面我们就用代码来解释一下他们吧:
首先定义一个请求类,这个请求类就是我需要报销车票
public class Request { private String type;//请求类型 private boolean finished = false;//是否已经完成任务了 public Request(String type){ this.type = type; } public String getType() { return type; } public void setType(String type) { this.type = type; } public boolean isFinished() { return finished; } public void setFinished(boolean finished) { this.finished = finished; } }
同时建立一个处理类,这个类就是每个成员组必须实现的接口,这也是他的工作内容和工作方式:
public interface Handle { public void handleRequest(Request request); }
于是我们分别实现福利组,保险组跟财务组
/** * 福利组 * @author Administrator * */ public class HandleBoon implements Handle{ private Handle otherHandle; public void handleRequest(Request request) { System.out.println("............com to HandleBoon"); if(request.getType().indexOf("福利")>=0){ System.out.println("HandleBoon handle"); request.setFinished(true); }else{ System.out.println("............HandleBoon don't know,go to other"); if(otherHandle!=null) otherHandle.handleRequest(request); } } public void setOtherHandle(Handle otherHandle) { this.otherHandle = otherHandle; } }
/** * 保险医疗索赔组 * @author Administrator * */ public class HandleInsure implements Handle{ private Handle otherHandle; public void handleRequest(Request request) { System.out.println("............com to HandleInsure"); if(request.getType().indexOf("车票")>=0){ System.out.println("HandleInsure handle"); request.setFinished(true); }else{ System.out.println("............HandleInsure don't know,go to other"); if(otherHandle!=null) otherHandle.handleRequest(request); } } public void setOtherHandle(Handle otherHandle) { this.otherHandle = otherHandle; } }
/** * 财务组 * @author Administrator * */ public class HandleFinance implements Handle{ private Handle otherHandle; public void handleRequest(Request request) { System.out.println("............com to HandleFinance"); if(request.getType().indexOf("财务")>=0){ System.out.println("HandleFinance handle"); request.setFinished(true); }else{ System.out.println("............HandleFinance don't know,go to other"); if(otherHandle!=null) otherHandle.handleRequest(request); } } public void setOtherHandle(Handle otherHandle) { this.otherHandle = otherHandle; } }
实现完成之后我们写一个测试来实现我的报销流程吧:
public class Test { public static void main(String[] args) { HandleBoon hb = new HandleBoon(); HandleFinance hf = new HandleFinance(); HandleInsure hi = new HandleInsure(); hb.setOtherHandle(hf); hf.setOtherHandle(hi); List<Handle> list = new ArrayList<Handle>(); list.add(hb); list.add(hf); list.add(hi); Request request = new Request("车票"); for(Handle handle:list){ if(!request.isFinished()){ handle.handleRequest(request); }else{ break; } } } }
首先我知道是15楼,如果成员组他们彼此都不知道自己的话,那么我必须走遍15楼的去找财务组(假设当初我是不知道的)才能报销我的发票。
小结:
当应用了责任链模式之后,客户不必事先知道对象集合中哪些可提供自己所需要的服务。当客户发出请求调用之后,该请求会沿着责任链转发,直到找到提供该服务的对象为止。这样可大大降低客户端代码与提供服务的对象之间的耦合程序。
发表评论
-
UtilCommon
2016-08-16 07:23 0aaaaaa -
Java面试题全集(上)
2016-08-14 17:23 0版权声明:本文为博 ... -
设计模式之略见一斑(Visitor访问者模式)
2010-02-25 15:02 3193在开发中,我们可能会经常碰到客户提了一新的需求,那么在现 ... -
设计模式之略见一斑(Mediator中介者模式)
2010-02-25 10:07 1845设计模式 写道 通常,面向对象的软件开发要求尽可能 ... -
设计模式之略见一斑(Observer观察者模式)
2010-02-23 17:15 2181用户通常通过调用对象的方法来收集该对象的信息。但是当这 ... -
设计模式之略见一斑(Memento备忘录模式)
2010-02-23 11:46 1436有时候,我们需要 ... -
设计模式之略见一斑(Template Method模板方法模式)
2010-02-22 21:33 1412模板方法模式就是预 ... -
设计模式之略见一斑(策略模式strategy)
2010-02-22 17:56 1938java设计模式 写道 ... -
设计模式之略见一斑(状态模式State)
2010-02-22 15:42 1652设计模式中的状态模式相对比较简单,简单的说就是对某 ... -
设计模式之略见一斑(解释器模式Interpreter)
2010-02-22 10:27 3336解释器模式是 ... -
设计模式之略见一斑(命令模式Command)
2010-02-22 09:49 1526终于把构造模式的几种设计模式写完,接下来开始写的行为模 ... -
设计模式之略见一斑(享元模式flyweight)
2010-02-10 11:39 1410flyweight模式中文解释为轻量极模式,所以顾名 ... -
设计模式之略见一斑(代理模式Proxy)
2010-02-10 11:04 1924普通对象所需要完成的任务就是通过公共接口为外界提供自己所承诺的 ... -
设计模式之略见一斑(装饰模式decorator)
2010-02-09 11:08 1783标头:(引自设计模式 ... -
设计模式之略见一斑(组合模式Composite)
2010-02-08 14:45 1471定义: 将对象以树形结构组织起来,以达成"部 ... -
设计模式之略见一斑(外观模式Facade)
2010-02-07 09:30 1354外观模式又称门面模式,它是为了给子系统中提供一个一致的界面,从 ... -
设计模式之略见一斑(桥梁模式bridge)
2010-02-06 18:04 1521桥梁模式的宗旨就是将 ... -
设计模式之略见一斑(适配器模式Adapter)
2010-02-03 10:39 1573适配器模式就是基于客户提供的接口和功能,再此基础上实 ... -
设计模式之略见一斑(原型模式Prototype)
2010-02-01 17:15 1657原型模式允许一个对象 ... -
设计模式之略见一斑(建造模式builder)
2010-02-01 16:18 1731建造模式是将复杂的 ...
相关推荐
NULL 博文链接:https://lgh3292.iteye.com/blog/600905
NULL 博文链接:https://teddywang.iteye.com/blog/769122
CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。它是一类重要的线性分组码,...例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑。
CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。它是一类重要的线性分组码,编码...例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑
例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑。 差错控制理论是在代数理论基础上建立起来的。这里我们着眼于介绍CRC的算法与实现,对原理只能...