JAVA 设计模式 职责链模式

用途

职责链模式 (Chain Of Responsibility)

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

职责链模式是一种行为型模式

结构

图-职责链模式

Handler : 定义一个处理请求的接口。(可选的)实现设置后继者的方法。

abstract class Handler {
 protected Handler successor;
 public void SetSuccesssor(Handler successor) {
 this.successor = successor;
     }
 
 public abstract void HandlerRequest(int request);
 }

ConcreteHandler : 处理它所负责的请求,可以访问它的后继者,如果可处理该请求,就处理之,否则就将请求转发给它的后继者。

class ConcreteHandler1 extends Handler {
     @Override
 public void HandlerRequest(int request) {
 if (request >= 0 && request < 10) {
             System.out.println("ConcreteHandler1 处理请求 " + request);
         } else if (null != successor) {
             successor.HandlerRequest(request);
         }
     }
 }
 
 class ConcreteHandler2 extends Handler {
     @Override
 public void HandlerRequest(int request) {
 if (request >= 10 && request < 20) {
             System.out.println("ConcreteHandler2 处理请求 " + request);
         } else if (null != successor) {
             successor.HandlerRequest(request);
         }
     }
 }
 
 class ConcreteHandler3 extends Handler {
     @Override
 public void HandlerRequest(int request) {
 if (request >= 20 && request < 30) {
             System.out.println("ConcreteHandler3 处理请求 " + request);
         } else if (null != successor) {
             successor.HandlerRequest(request);
         }
     }
 }

Client : 需要设置一个职责链的各环节对象串联起来。

public class ChainOfResponsibilityPattern {
 public static void main(String[] args) {
         Handler h1 = new ConcreteHandler1();
         Handler h2 = new ConcreteHandler2();
         Handler h3 = new ConcreteHandler3();
         h1.SetSuccesssor(h2);
         h2.SetSuccesssor(h3);
 
 int[] requests = {2, 29, 9, 15, 4, 19};
 for (int i : requests) {
             h1.HandlerRequest(i);
         }
     }
 }

推荐

本文属于 JAVA设计模式系列

参考资料

《大话设计模式》《HeadFirst设计模式》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏盛国存的专栏

A Bite of GoLang(下)

上面这段代码有问题么? 这就是一个从 0 到 10 的调用,但是匿名函数内部没有中止条件,所以会进入一个死循环。要是我们在匿名函数前加上 go 关键字,就不是刚...

4718
来自专栏后端之路

基于j2cache实现的redis分布式锁

系统现状: 由于系统目前提醒是在公共模块,对于提醒的数目实时计算。对于db的压力较大。因此采用J2cache的两级缓存。关于两级缓存的说明 但是当部分业务更新...

3078
来自专栏技术博客

MVC项目开发中那些用到的知识点(WCF Rest在MVC项目中的两种调用方式)

 接口的实现还添加[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibility...

852
来自专栏菜鸟计划

webpack学习(六)打包压缩js和css

打包压缩js与css 由于webpack本身集成了UglifyJS插件(webpack.optimize.UglifyJsPlugin)来完成对JS与CSS的压...

5476
来自专栏我爱编程

运维开发笔试

all(iterable) and any(iterable) all(x)如果all(x)参数x对象的所有元素不为0、''、False或者x为空对象(即所有...

1643
来自专栏阮一峰的网络日志

MIME笔记

MIME的全称是"Multipurpose Internet Mail Extensions",中译为"多用途互联网邮件扩展",指的是一系列的电子邮件技术规范,...

1044
来自专栏JAVA技术站

Struts2.3的简单配置使用 原

一、下载Struts2,http://struts.apache.org/development/2.x/

581
来自专栏从零开始学自动化测试

selenium+python自动化88-用例不通过的时候发送邮件

前言 实现需求:当测试用例全部通过的时候,不发邮件,当用例出现Error或Failure的时候发送邮件 解决思路:生成html测试报告后,用bs4解析html页...

3595
来自专栏前端侠2.0

自己用的空气指数实时图的爬虫 原

代码很简单,不解释!从air-level.com上爬下来图片,保存于本地文件夹,效果如下:

882
来自专栏haifeiWu与他朋友们的专栏

TCP 粘包问题浅析及其解决方案

最近一直在做中间件相关的东西,所以接触到的各种协议比较多,总的来说有TCP,UDP,HTTP等各种网络传输协议,因此楼主想先从协议最基本的TCP粘包问题搞起,把...

3312

扫码关注云+社区