Java实现设计模式之责任链模式
作者:niuyongzhi 发布时间:2023-12-09 21:02:12
标签:Java,设计模式,责任链模式
1.什么是责任链模式
当一个请求可能需要多个对象中的某个进行处理时,将这些对象连成一条链,并沿者这条链传递该请求,知道有一个对象处理它为止。这样的情况或需求时,可以采用责任链模式。
2.如何实现
1)处理者接口(Handler),负责定义处理请求的抽象方法,并设置下一个处理着的方法。
2)具体处理者,实现Handler接口中定义的方法。实现处理用户请求的逻辑,并设置下一个处理请求的对象。如果能够处理用户求情就处理,如果不能处理,交给下一个对象进行处理。
3)封装类。对以上的具体处理者进行封装,使它们形成一个处理链条。
3.代码实现
以一个资金审批举例
1)处理者接口
/**
* 处理者接口
* 定义处理请求的方法
* 设置下一个处理者
*/
public interface Handler {
public void handleRequest(int money);
public void setNextHandler(Handler handler);
}
2)处理者1
/**
* 具体处理者--经理
*/
public class Manager implements Handler {
Handler handler;
@Override
public boolean handleRequest(int money) {
boolean result = false;
if(money<1000){
System.out.println("同意");
result = true;
}else{
//超出处理范围,交给下一个处理着
if(handler!=null){
result = handler.handleRequest(money);
}
}
return result;
}
@Override
public void setNextHandler(Handler handler) {
this.handler = handler;
}
}
3)处理着2
/**
* 具体处理者--总经理
*/
public class GeneralManager implements Handler {
Handler handler;
@Override
public boolean handleRequest(int money) {
boolean result = false;
if(money<10000){
System.out.println("同意");
result = true;
}else{
//超出处理范围,交给下一个处理着
if(handler!=null){
result = handler.handleRequest(money);
}
}
return result;
}
@Override
public void setNextHandler(Handler handler) {
this.handler = handler;
}
}
4)封装类
/**
* 封装类
* 将所有的具体处理者封装成一条处理链
*/
public class Contxt {
private Handler handler1,handler2;
public Contxt(){
}
public void createHandlerChain(){
handler1 = new Manager();
handler2 = new GeneralManager();
handler1.setNextHandler(handler2);
}
public void responseRequest(int request){
handler1.handleRequest(request);
}
}
5)测试类
public class TestMain {
public static void main(String args []){
int meney = 500;
Contxt context = new Contxt();
//创建处理链
context.createHandlerChain();
//相应请求
boolean result = context.responseRequest(meney);
System.out.println(result);
}
}
4.总结
责任链模式的优点
1)责任链中的对象只和自己的后继是低耦合关系,和其他对象毫无关联,是程序更加的灵活。
2)程序可以动态的增加、删除处理者的关系,或重新委派新的处理者
来源:https://blog.csdn.net/niuyongzhi/article/details/123291023


猜你喜欢
- 需要导入ant.jar包,apache网站(http://ant.apache.org/bindownload.cgi)下载即可。impor
- 本文实例为大家分享了Java实现二分查找的变种,供大家参考,具体内容如下普通二分查找:先回顾一下普通的二分查找注意:二分查找有这样一个问题:
- 本文实例讲述了C#多线程与跨线程访问界面控件的方法。分享给大家供大家参考。具体分析如下:在编写WinForm访问WebService时,常会
- java类型转换 Integer String Long Float Double Date1如何将字串 String 转换成整数 int?
- 1、异常分类通常分为三类:系统异常(SystemException),业务异常(BusinessException)和其他异常(Except
- 学习要求:知道一点儿函数式接口和Lambda表达式的基础知识,有利于更好的学习。1.先体验一下Stream的好处需求:给你一个ArrayLi
- Q 1: 指定 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 好像并不能隐藏导航栏和状态栏?A: 您需要告诉系
- JAVA 枚举单例模式及源码分析的实例详解 单例模式的实现有很多种,网上也分析了
- 在用java的io流读写文件时,总是被它的各种流能得很混乱,有40多个类,理清啦,过一段时间又混乱啦,决定整理一下!以防再忘Java输入/输
- 简介Maven为我们封装了很多构建中非常有用的操作,我们只需要执行简单的几个mvn命令即可。今天我们要讨论一下mvn命令之下的生命周期的构建
- 概述什么是 Spring WebFlux, 它是一种异步的, 非阻塞的, 支持背压(Back pressure)机制的Web 开发框架. 要
- 这篇文章主要介绍了SpringBoot+SpringCloud实现登录用户信息在微服务之间的传递,文中通过示例代码介绍的非常详细,对大家的学
- 前面已经把java io的主要操作讲完了 这一节我们来说说关于java io的其他内容 Serializable序列化 实例1:对象的序列化
- 一.并行LINQSystem.Linq名称空间中包含的类ParallelEnumerable可以分解查询的工作,使其分布在多个线程上。尽管E
- 字符串的拼接,常使用到的大概有4种方式:1.直接使用"+"号2.使用String的concat方法3.使用StringB
- 基于servlet+jsp+jdbc的后台管理系统,包含5个模块:汽车账户部管理、租车账户部管理、汽车信息管理表、租车记录表、租车租聘表。功
- 元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种。1. Annotation型
- cookies的创建:在客户端创建一个username的cookies,其值为oneday,有效期为1天.方法1:Response.Cook
- 访问权限符:(1)public:对于成员来说:任何其他类都可以访问它们,不管在同一个包中还是在另外的包中。对于类来说:
- 一般都在windows下开发的,现在部署到linux下:1,将项目达成war包(用eclipse,项目右键-->Export-->