【设计模式】Java设计模式 - 责任链模式

不断学习才是王道

继续踏上学习之路,学之分享笔记

总有一天我也能像各位大佬一样

一个有梦有戏的人 @怒放吧德德

拦截器

拦截器可以拦截目标方法,进行一系列的操作。也可以取代代理对象的方法等功能。以下代码用JDK动态代理来实现一个拦截器的逻辑。

1、接口提供

首先提供方法接口和实现类作为动态代理拦截的方法

package com.lyd.demo.service;

/**
* @Author: lyd
* @Description: 普通的接口
* @Date: 2022-08-19
*/
public interface HelloWorldService {
public void sayHelloWorld(String name);
}

实现类

package com.lyd.demo.service.impl;

import com.lyd.demo.service.HelloWorldService;

/**
* @Author: lyd
* @Description: 接口实现
* @Date: 2022-08-19
*/
public class HelloWorldServiceImpl implements HelloWorldService {
@Override
public void sayHelloWorld(String name) {
System.out.println("Hello World! " + name);
}
}

2、定义拦截器接口Interceptor

这里定义了三个方法:before、around、after,都有:代理对象 proxy, 真实对象 target, 方法 method, 参数 args

  • before方法返回的是Boolean,在真实对象前调用。
  • 返回true时,反射真实对象的方法,false时,调用around方法

    最后执行after方法
package com.lyd.demo.interceptor;

import java.lang.reflect.Method;

/**
* @Author: lyd
* @Description: 拦截器接口
* @Date: 2022-08-17
*/
public interface Interceptor {
public boolean before(Object proxy, Object target, Method method, Object[] args); public void around(Object proxy, Object target, Method method, Object[] args); public void after(Object proxy, Object target, Method method, Object[] args);
}

3、定义拦截器实现类

package com.lyd.demo.impl;

import com.lyd.demo.interceptor.Interceptor;

import java.lang.reflect.Method;

/**
* @Author: lyd
* @Description: 实现拦截接口
* @Date: 2022-08-17
*/
public class MyInterceptor implements Interceptor {
public boolean before(Object proxy, Object target, Method method, Object[] args) {
System.out.println("反射方法前逻辑");
return false; // 不反射被代理对象原有方法
} public void around(Object proxy, Object target, Method method, Object[] args) {
System.out.println("取代了代理对象的方法");
} public void after(Object proxy, Object target, Method method, Object[] args) {
System.out.println("反射方法后逻辑");
}
}

4、采用JDK动态代理的方式使用拦截器

构建jdk代理:

package com.lyd.demo.jdk;

import com.lyd.demo.interceptor.Interceptor;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; /**
* @Author: lyd
* @Description: JDK动态代理使用拦截器
* @Date: 2022-08-17
*/
public class InterceptorJdkProxy implements InvocationHandler { private Object target; // 真实对象
private String interceptorClass = null; // 拦截器全限定名 public InterceptorJdkProxy(Object target, String interceptorClass) {
this.target = target;
this.interceptorClass = interceptorClass;
} /**
* 绑定委托对象并返回一个【代理占位】
* @param target 真实对象
* @return 代理对象
*/
public static Object bind(Object target, String interceptorClass) {
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InterceptorJdkProxy(target, interceptorClass));
} public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (interceptorClass == null) {
// 没有设置拦截器则直接反射原有方法
return method.invoke(proxy, args);
}
Object result = null;
// 通过反射生成拦截器
Interceptor interceptor = (Interceptor) Class.forName(interceptorClass).newInstance();
// 调用前置方法
if (interceptor.before(proxy, target, method, args)) {
//反射原有方法
return method.invoke(target, args);
} else { // 返回false方法执行around方法
interceptor.around(proxy, target, method, args);
}
// 调用后置方法
interceptor.after(proxy, target, method, args);
return result;
}
}

5、实例

测试:

package com.lyd.demo.test;

import com.lyd.demo.jdk.InterceptorJdkProxy;
import com.lyd.demo.service.HelloWorldService;
import com.lyd.demo.service.impl.HelloWorldServiceImpl; /**
* @Author: lyd
* @Description: 测试类
* @Date: 2022-08-19
*/
public class InterceptorTest {
public static void main(String[] args) {
HelloWorldService proxy = (HelloWorldService) InterceptorJdkProxy.bind(new HelloWorldServiceImpl(), "com.lyd.demo.impl.MyInterceptor");
proxy.sayHelloWorld("lyd"); }
}

结果:

责任链模式

当一个对象在一条链上被多个拦截器拦截处理,当然也可以不拦截处理,这种的设计模式就是责任链模式。可以在这被拦截的期间进行加工处理。就好比如,我们申请请假,需要经过项目经理,再到部门经理,最后到人事。在这期间,经理审批时候可以修改请假天数。本次实验用以上部分代码。

1、定义拦截器

这里定义三个拦截器分别是三个类

package com.lyd.demo.impl;

import com.lyd.demo.interceptor.Interceptor;

import java.lang.reflect.Method;

/**
* @Author: lyd
* @Description: 责任链 - 拦截器1
* @Date: 2022-08-20
*/
public class Interceptor1 implements Interceptor {
@Override
public boolean before(Object proxy, Object target, Method method, Object[] args) {
System.out.println("拦截器1的before");
return true;
} @Override
public void around(Object proxy, Object target, Method method, Object[] args) { } @Override
public void after(Object proxy, Object target, Method method, Object[] args) {
System.out.println("拦截器1的after");
}
}

拦截器2,3也是如此就不粘贴代码了。

2、责任链上使用拦截器实例

测试:

package com.lyd.demo.test;

import com.lyd.demo.jdk.InterceptorJdkProxy;
import com.lyd.demo.service.HelloWorldService;
import com.lyd.demo.service.impl.HelloWorldServiceImpl; /**
* @Author: lyd
* @Description: 责任链模式测试
* @Date: 2022-08-20
*/
public class ResponsibilityChainTest {
public static void main(String[] args) {
HelloWorldService proxy1 = (HelloWorldService) InterceptorJdkProxy.bind(new HelloWorldServiceImpl(), "com.lyd.demo.impl.Interceptor1"); HelloWorldService proxy2 = (HelloWorldService) InterceptorJdkProxy.bind(proxy1, "com.lyd.demo.impl.Interceptor2"); HelloWorldService proxy3 = (HelloWorldService) InterceptorJdkProxy.bind(proxy2, "com.lyd.demo.impl.Interceptor3"); proxy3.sayHelloWorld("怒放吧德德");
}
}

运行结果:

【设计模式】Java设计模式 - 责任链模式的更多相关文章

  1. Python使用设计模式中的责任链模式与迭代器模式的示例

    Python使用设计模式中的责任链模式与迭代器模式的示例 这篇文章主要介绍了Python使用设计模式中的责任链模式与迭代器模式的示例,责任链模式与迭代器模式都可以被看作为行为型的设计模式,需要的朋友可 ...

  2. 《java设计模式》之责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  3. 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击

  4. Java设计模式学习记录-责任链模式

    前言 已经把五个创建型设计模式和七个结构型设计模式介绍完了,从这篇开始要介绍行为型设计模式了,第一个要介绍的行为型设计模式就是责任链模式(又称职责链模式). 责任链模式 概念介绍 责任链模式是为了避免 ...

  5. Java设计模式系列之责任链模式

    责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道 ...

  6. Java描述设计模式(15):责任链模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景描述 1.请假审批流程 公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批 当 3<day<= ...

  7. 《JAVA设计模式》之责任链模式(Chain of Responsibility)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  8. Java设计模式十九——责任链模式

    责任链模式 老李的苦恼 每个人在出生的时候,都早已在暗中被标好了三六九等. 老李是一名建筑工地的木匠,和大多数生活在社会最底层的农民工一样,一辈子老实本分,胆小怕事.在他们的心中,谁当老爷都没有区别, ...

  9. Java设计模式13:责任链模式

    前言 来菜鸟这个大家庭10个月了,总得来说比较融入了环境,同时在忙碌的工作中也深感技术积累不够,在优秀的人身边工作必须更加花时间去提升自己的技术能力.技术视野,所以开一个系列文章,标题就轻松一点叫做最 ...

  10. 设计模式之GOF23责任链模式

    责任链模式chain of responsibility 将能够处理同一类请求的对象连成一条链,所提交的请求依次在链上传递,直到传递至有能力处理该请求的对象,不能则传给链上下一个 场景: -打牌时 - ...

随机推荐

  1. 方法(method)

    方法是可以完成某个特定的功能,并且可以重复利用的代码片段...C中叫为函数 方法定义在类体中,不可定义在主方法下. 一个方法执行完就会被释放, 提高代码的复用性 相同的业务逻辑就可以不用重复,,,,因 ...

  2. Vue开发组件之替代marquee标签,超出宽度文字横向滚动效果

    一.npm 安装 如果你想安装插件(自己写的)安装 install dependencies npm i marquee-components 使用 在main.js引入 import marquee ...

  3. 03 转换css元素的类别

    03 转换css元素的类别 通过设置display属性 属性 作用 block 块级 inline 行内 inline-block 行内块级 接来下 就跟着小demo来学习吧! 不懂可以看看!!!什么 ...

  4. UiPath鼠标操作图像的介绍和使用

    一.鼠标(mouse)操作的介绍 模拟用户使用鼠标操作的一种行为,例如单击,双击,悬浮.根据作用对象的不同我们可以分为对元素的操作.对文本的操作和对图像的操作 二.鼠标对图像的操作在UiPath中的使 ...

  5. cookie、session、tooken

    一.cookie 的诞生 首先需要知道Http协议的无状态连接的,即这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的. 服务端,既不知道上一次请求和这一次请求的关联,也无法知道哪一个客户 ...

  6. 程序分析与优化 - 9 附录 XLA的缓冲区指派

    本章是系列文章的案例学习,不属于正篇,主要介绍了TensorFlow引入的XLA的优化算法.XLA也有很多局限性,XLA更多的是进行合并,但有时候如果参数特别多的场景下,也需要进行分割.XLA没有数据 ...

  7. C#实现FFT(递归法)

    C#实现FFT(递归法) 1. C#实现复数类 我们在进行信号分析的时候,难免会使用到复数.但是遗憾的是,C#没有自带的复数类,以下提供了一种复数类的构建方法. 复数相比于实数,可以理解为一个二维数, ...

  8. 在 Windows 上使用压缩文件 安装 MySQL

    在 Windows 上使用压缩文件 安装 MySQL 1. 下载 MySQL mysql-5.7.27-win32.zip:二进制文件; 服务器类型: mysqld 2. 解压 mysql-5.7.2 ...

  9. APISpace 让你快速获取安徒生童话故事

    <安徒生童话>是丹麦作家安徒生创作的童话集,共由166篇故事组成.该作爱憎分明,热情歌颂劳动人民.赞美他们的善良和纯洁的优秀品德:无情地揭露和批判王公贵族们的愚蠢.无能.贪婪和残暴. 接口 ...

  10. day05 Java_循环_基本类型数组

    精华笔记: 循环结构: for结构:应用率高.与次数相关的循环 三种循环结构的选择规则: 先看循环是否与次数相关: 若相关----------------------------直接上for 若无关, ...