设计模式-行为型模式-责任链模式

设计模式-行为型模式-责任链模式

定义

将请求沿着链传递,然后直到对象处理即可。

UML图

代码

基本的责任链

public class Test{
	public void test(int i, Request request){
		if(i == 1){
			Hander1.response(request);
		}
		
		if(i == 2){
			Hander2.response(request);
		}
		
		if(i == 3){
			Hander3.requese(request);
		}
	}
}

代码逻辑如上,只处理1,2,3情况,其余的情况都不处理。

责任链

// 对象
public class Level{
	private int level = 0;
	public Level(int level){
		this.level = level;
	}
	public boolean above(Level level){
		if(this.level >= level.level)
			return true;
		else
			return false;
	}
}

// 将对象进行封装
public class Request{
	Level level;
	public Request(Level level){
		this.level = level;
	}
	public Level getLevel(){
		return level;
	}
}

// 返回消息
public class Response{}

public abstract class Handler{
	private Handler nextHandler;
	public final Response handleRequest(Request request){
		Response response = null;
		// 根据处理器的优先级处理,如果优先级高,处理
		if(this.getHandlerLevel().above(request.getLevel())){
			// 如果寻找到处理器,进行处理
			response = this.response(request);
		}else{
			// 否则,进入下一个处理器
			if(this.nextHandler != null){
				this.nextHandler.handleRequest(request);
			}else{
				System.out.println("没有合适的处理器");
			}
		}
		return response;
	}
	// 设置下一个处理器
	public void setNextHandler(Handler handler){
		this.nextHandler = handler;
	}
	// 当前处理器
	protected abstract Level getHandlerLvel();
	// 进入处理器处理
	public abstract Response response(Request request);
}

// 第一个处理器
public class ConcreteHandler1 extends Handler{
	protected Level getHandlerLevel(){
		return new Level(1);
	}
	public Response response(Request request){
		System.out.println("处理1处理");
		return null;	// 下一个处理器为空
	}
}

// 第二个处理器
public class ConcreteHandler2 extends Handler{
	protected Level getHandlerLevel(){
		return new Level(3);
	}
	public Response response(Request request){
		System.out.println("处理1处理");
		return null;	// 下一个处理器为空
	}
}

// 第三个处理器
public class ConcreteHandler3 extends Handler{
	protected Level getHandlerLevel(){
		return new Level(5);
	}
	public Response response(Request request){
		System.out.println("处理1处理");
		return null;	// 下一个处理器为空
	}
}

// 最后定义场景
public class Client{
	public static void main(String[] args){
		// 新建处理器
		Handler handler1 = new ConcreteHandler1();
		Handler handler2 = new ConcreteHandler2();
		Handler handler3 = new ConcreteHandler3();
		
		// 设置下一个处理器
		// 处理器处理逻辑为先处理1,再处理2,再处理3
		handler1.setNextHandler(handler2);
		handler2.setNextHandler(handler3);
		
		// 进行处理
		Response response = handler1.handlerRequest(new Request(new Level(4)));
	}
}

总结

责任链模式核心在处理流,让对象在类之间流动,直到合适进行对象处理,并把下一个设置为空。

写法,当然就是新建几个处理器类,然后要处理的对象,处理类之间用next指向下一个,然后把处理的对象传入进去,如果找到合适的处理器,进行处理,并将下一个设置为空,完成责任链。

其中,几个处理器类可以抽象出一个抽象类,并把对象进行封装成一个类,以上为上方代码的设计思路。

应用

开发一个电商网站,支付过500元定金的用户,收到100元优惠卷,200元收到50元,没有支付过的,进入普通模式购买。

如果不用职责链,需要写入一大堆if语句。

将if语句拆分,使用职责链,将处理器类抽象出来,然后将购买的用户传入处理器,然后如果处理完成,下一个设置为空,返回结果。

另外一个应用,文件上传,使用的也是职责链。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SDNLAB

ONOS集群原理及流程分析

一、ONOS集群原理简介 ONOS是一个分布式的控制器,为了提高数据的读写效率,采用自实现的基于In-Memory的Key-Value数据存储系统。针对实际的需...

39880
来自专栏上善若水

016 进程内缓存和进程外缓存的对比

在java应用中,对于访问频率比较高,又不怎么变化的数据,常用的解决方案是把这些数据加入缓存。相比DB,缓存的读取效率快好不少。java应用缓存一般分两种,一是...

23830
来自专栏逆向技术

逆向实战第一讲,寻找OllyDbg调试工具的Bug并修复

           逆向实战第一讲,寻找OllyDbg调试工具的Bug并修复 首先我们要知道这个OD的Bug是什么. 我们调试一个UNICODE的窗口,看下其...

25470
来自专栏24K纯开源

使用Qt installer framework制作安装包

一、介绍     使用Qt库开发的应用程序,一般有两种发布方式: (1)静态编译发布。这种方式使得程序在编译的时候会将Qt核心库全部编译到一个可执行文件中。其优...

34280
来自专栏陈树义

1.Redis 的安装

一、Redis 介绍 Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。...

30490
来自专栏coder修行路

Python爬虫番外篇之Cookie和Session

关于cookie和session估计很多程序员面试的时候都会被问到,这两个概念在写web以及爬虫中都会涉及,并且两者可能很多人直接回答也不好说的特别清楚,所以整...

24370
来自专栏Aloys的开发之路

屏幕输出VS文件输出

问题1:我们在编写程序时经常需要数一些数据到屏幕,来查看我们的结果是否正确,虽然直接输出到屏幕,查看起来呢很方便,但当数据量很大时,需要耗费大量的时间。于是我...

192100
来自专栏北京马哥教育

一周文章推送:

文章名称:nginx + php-fpm fastcgi防止跨站、跨目录的安全设置 我们知道apache php mod的方式可以很方便的配置 open_bas...

30670
来自专栏云霄雨霁

Java--五态模型&控制线程

21850
来自专栏LanceToBigData

linux(三)之linux常用命令二

今天就是星期五了,又可以休息两天了。有点小激动,开心。不过还是要加油,因为还有很多东西等着我去学习呢! 七、chmod  作用:修改文件的权限 7.1、命令...

23480

扫码关注云+社区

领取腾讯云代金券