职责链模式
来源:互联网 发布:js获取当前城市 编辑:程序博客网 时间:2024/06/04 23:25
职责链模式
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者直接的耦合关系。將这多个对象连城一个链,并且沿着这条链传递该请求,直到有一个对象处理它为止。
这样接收者和发送者都没有对方的明确信息,他们之间是没有直接的作用关系,且链中的对象也不知道链的结构。结果就是职责链可以简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接收者的引用。
对于我们使用者来说,我们可以随时增加或者修改处理一个请求的结构。增强了给对象指派职责的灵活性。不过一个请求极有可能在到达链的最末尾也没有得到处理,那么这个就需要在我们判断没有下一个节点的时候处理掉这个没有对应处理节点的请求。且如果是那种只要符合条件的都处理哈怎么办?(比如在一个请求中,如果你想修改的是服务器端的好几个数据库,那么在现有的每一个修改的数据库都有相应的节点,那么就应该按照最后一个的可处理节点来操作。{猜想,还没实验})
总的来说职责链模式是一个具有时间等级(请求的唯一标志),可以不断添加新的职责,且让请求者和接收者感觉不到对方存在从而达到解耦请求与处理的设计模式。例如传送带上的物品,放上去的人只需要把自己需要传递的东西放上去,而使用物品的人从传送带拿下自己需要使用的物品,他们并不清楚是谁放的或者谁拿走的。
以一个log工具为例,共有4个等级的log
public abstract class Logger {public static final int ERROR = 0;public static final int DEBUG = 1;public static final int INFO = 2;public static final int VERBOSE = 3;protected int level;protected Logger nextLogger;public void setNextLogger(Logger logger) {this.nextLogger = logger;}public void logMessage(int level , String message) {if (this.level == level) {printMsg(message);} else if (nextLogger!=null) {nextLogger.logMessage(level, message);;}else {System.err.println("Unknow Error");}}public abstract void printMsg(String msg) ;}具体实现每一个等级的log
public class VerboseLogger extends Logger{public VerboseLogger(int level) {this.level = level;}@Overridepublic void printMsg(String msg) {System.out.println("VERBOSE:"+msg);}}
public class InfoLogger extends Logger{public InfoLogger(int level) {this.level = level;}@Overridepublic void printMsg(String msg) {System.out.println("INFO:"+msg);}}
public class DebugLogger extends Logger{public DebugLogger(int level) {this.level = level;}@Overridepublic void printMsg(String msg) {System.out.println("DEBUG:"+msg);}}
public class ErrorLogger extends Logger{ public ErrorLogger(int level) {super();this.level = level;}@Overridepublic void printMsg(String msg) {System.err.println("ERROR:"+msg);}}
生成一个工具类来生成职责链,将四个等级的log串联起来
public class LogUtil {public static Logger getLogger() {Logger verboseLogger = new VerboseLogger(Logger.VERBOSE);Logger infoLogger = new InfoLogger(Logger.INFO);Logger debugLogger = new DebugLogger(Logger.DEBUG);Logger errorLogger = new ErrorLogger(Logger.ERROR);errorLogger.setNextLogger(debugLogger);debugLogger.setNextLogger(infoLogger);infoLogger.setNextLogger(verboseLogger);return errorLogger;}}
使用职责链输出我们的log
public staticvoid main(String[] args) {
Logger logger = LogUtil.getLogger();
logger.logMessage(Logger.ERROR,"Error Information");
logger.logMessage(Logger.DEBUG,"Debug Information");
logger.logMessage(Logger.INFO,"Info Information");
logger.logMessage(Logger.VERBOSE,"Verbose Information");
}
结果如下:ERROR:Error Information
DEBUG:Debug Information
INFO:Info Information
VERBOSE:Verbose Information
第二种
ERROR:Error InformationDEBUG:Debug Information
INFO:Info Information
VERBOSE:Verbose Information
现在还不清楚为什么会出现这个,需要等我重拾java来看看了。
由此可以看出:职责链是一个请求者的请求中转站,通过这个接口,我们可以将所有的请求都通过它前去寻找处理方法,从而不必要每一次请求都要找到对应的接收者,让请求者和接收者没有直接的相互关系,减少耦合,但是如果链比较长,势必影响性能。
阅读全文
0 0
- 职责链设计模式
- 职责链模式
- 职责链模式
- 职责链模式
- ChainOfResponsibility(职责链)模式
- 职责链模式ChainOfResponsibility
- 职责链模式
- 职责链模式 ResponsibilityChainPattern
- 【设计模式】职责链
- 职责链模式
- java职责链模式
- 职责链模式
- 职责链模式
- 职责链模式(python)
- 职责链模式
- 职责链模式
- 职责链模式
- 职责链模式
- session与cookie的区别与联系
- [Tensorflow]基于slim框架下inception模型的植物识别
- c++中非静态函数不能用类名调用,为什么CWnd的成员函数GetDC()可以直接调用啊?
- 反射获取属性值
- 版权声明:本文为博主原创文章,未经博主允许不得转载。 今天重写一个delphi7的CS架构的软件,原本自带的控件是Indy9。现在升级到Indy10,用delphi XE5开发。发现idTcpSer
- 职责链模式
- CSS合集
- 记录自己的学习历程---关于JSP的几个面试点(新手学习笔记,并不能保证内容正确性,如有误请指教)
- 基础错题集
- QByteArray储存二进制数据(包括结构体,自定义QT对象)
- 转载_CI 系统搭建:Git、Gerrit与Jenkins
- 互联网时代,我眼中的架构变迁
- http webservice socket的区别(转)
- ndy 10终于随着Delphi2005发布了,不过indy套件在我的印象中总是复杂并且BUG不断,说实话,不是看在他一整套组件的面子上,我还是喜欢VCL原生的Socket组件,简洁,清晰。Indy9