SSMSSM
首页
  • 我的博客
  • 我的Github
首页
  • 我的博客
  • 我的Github
  • Java反射技术
  • 动态代理模式
  • 设计模式简介
  • 责任链模式
  • 观察者模式
  • 工厂模式与抽象工厂模式
  • 建造者模式
  • Web开发历史
  • Mybatis核心组件
  • Mybatis的反射
  • Mybatis配置

责任链模式

  • 拦截器1
  • 拦截器2
  • 拦截器3
  • 主程序
  • 总结

拦截器1

package com.learn.ssm.chapter2.reflect.response;

import com.learn.ssm.chapter2.reflect.Interceptor;

import java.lang.reflect.Method;

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

package com.learn.ssm.chapter2.reflect.response;

import com.learn.ssm.chapter2.reflect.Interceptor;

import java.lang.reflect.Method;

public class Interceptor2 implements Interceptor {

    @Override
    public boolean before(Object proxy, Object target, Method method, Object[] args) {
        System.out.println("【拦截器2】的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("【拦截器2】的after方法");
    }
}

拦截器3

package com.learn.ssm.chapter2.reflect.response;

import com.learn.ssm.chapter2.reflect.Interceptor;

import java.lang.reflect.Method;

public class Interceptor3 implements Interceptor {
    @Override
    public boolean before(Object proxy, Object target, Method method, Object[] args) {
        System.out.println("【拦截器3】的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("【拦截器3】的after方法");
    }
}

主程序

package com.learn.ssm.chapter2.reflect.response;

import com.learn.ssm.chapter2.reflect.HelloWorld;
import com.learn.ssm.chapter2.reflect.HelloWorldImpl;
import com.learn.ssm.chapter2.reflect.InterceptorJdkProxy;

public class Main {
    public static void main(String[] args) {
        HelloWorld proxy1 = (HelloWorld) InterceptorJdkProxy.bind(new HelloWorldImpl(),
                "com.learn.ssm.chapter2.reflect.response.Interceptor1");
        HelloWorld proxy2 = (HelloWorld) InterceptorJdkProxy.bind(proxy1,
                "com.learn.ssm.chapter2.reflect.response.Interceptor2");
        HelloWorld proxy3 = (HelloWorld) InterceptorJdkProxy.bind(proxy2,
                "com.learn.ssm.chapter2.reflect.response.Interceptor3");
        proxy3.sayHelloWorld();
        /**
         * 【拦截器3】的before方法
         * 【拦截器2】的before方法
         * 【拦截器1】的before方法
         * Hello World
         * 【拦截器1】的after方法
         * 【拦截器2】的after方法
         * 【拦截器3】的after方法
         */
      }
}

总结

// Web请求处理链
class 请求过滤器 {
    public void 处理请求(HTTP请求 请求) {
        // 自动经过一系列过滤器:
        // 1. 身份认证过滤器 → 检查登录状态
        // 2. 权限检查过滤器 → 检查用户权限
        // 3. 参数验证过滤器 → 验证请求参数
        // 4. 业务处理过滤器 → 实际处理业务
        // 5. 日志记录过滤器 → 记录操作日志
        
        // 任何一个过滤器都可以决定是否继续传递
    }
}

// 使用时:
请求过滤器链.处理请求(用户请求);
// 用户不用关心经过了多少层过滤

其他例子:

  • 客服电话

    // 你打客服电话
    客服系统.处理问题(我的问题);
    
    // 自动转接:
    // 1级客服:处理简单问题(查询余额)
    // 2级客服:处理中等问题(业务办理)  
    // 3级客服:处理复杂问题(投诉建议)
    // 专家客服:处理疑难问题(技术故障)
    // 你不需要知道该找谁,系统自动找合适的人
    
  • 垃圾邮件

    // 收到一封邮件
    邮件过滤器.处理邮件(新邮件);
    
    // 层层过滤:
    // 规则1:黑名单过滤 → 直接删除
    // 规则2:关键词过滤 → 标记为垃圾邮件
    // 规则3:发件人验证 → 正常邮件
    // 规则4:内容分析 → 智能分类
    // 只要有一个过滤器处理了,流程就结束
    
  • 游戏伤害

    // 玩家受到攻击
    玩家.受到伤害(100点伤害);
    
    // 伤害经过层层减免:
    // 头盔:减免20点 → 剩余80点
    // 盔甲:减免30点 → 剩余50点  
    // 护盾:吸收40点 → 剩余10点
    // 最终:生命值减少10点
    
最近更新:: 2025/10/16 08:05
Contributors: fireworks99
Prev
设计模式简介
Next
观察者模式