拦截过滤器模式
什么是拦截过滤器模式?
Interceptor(拦截过滤器)模式 是一种结构型设计模式。
它用于在请求处理流程中动态添加预处理(如验证、日志)和后处理逻辑。 它通过可插拔的过滤器链在核心业务逻辑执行前后拦截请求/响应,实现横切关注点(Cross-Cutting Concerns)的解耦。
它主要由 四个部分 组成:
过滤器(Filter)
执行具体拦截任务的独立模块(如身份验证、日志记录)。
过滤器链(Filter Chain)
管理过滤器的有序执行,控制流程传递。
目标对象(Target)
核心业务逻辑(如 API 处理器)。
过滤器管理器(Filter Manager)
创建和组装过滤器链(可选)。
实现拦截过滤器模式
创建过滤器接口
class Filter { execute(request, response, chain) { throw new Error('execute() must be implemented') } }
实现具体过滤器
// 身份验证过滤器 class AuthFilter extends Filter { execute(request, response, chain) { console.log('AuthFilter: Checking authentication') if (!request.headers.token) { throw new Error('Unauthorized!') } chain.execute(request, response) // 传递到下一个过滤器 } } // 日志过滤器 class LogFilter extends Filter { execute(request, response, chain) { console.log(`LogFilter: ${request.url} at ${new Date()}`) chainexecute(request, response) consolelog('LogFilter: Response sent') } }
创建过滤器链
class FilterChain { constructor() { this.filters = [] this.target = null } addFilter(filter) { this.filters.push(filter) return this // 支持链式调用 } setTarget(target) { this.target = target } execute(request, response) { if (this.filters.length === 0) { this.target?.execute(request, response) return } const [currentFilter, ...remainingFilters] = this.filters const nextChain = new FilterChain() nextChain.filters = remainingFilters nextChain.target = this.target currentFilter.execute(request, response, nextChain) } }
目标对象(业务逻辑)
class ApiHandler { execute(request, response) { console.log('Processing API request') response.status = 200 response.body = { data: 'Success' } } }
客户端使用
// 组装过滤器链 const chain = new FilterChain() chain .addFilter(new AuthFilter()) .addFilter(new LogFilter()) .setTarget(new ApiHandler()) // 模拟请求 const request = { url: '/api/data', headers: { token: 'abc123' } } const response = {} try { chain.execute(request, response) console.log('Response:', response) } catch (err) { console.error('Error:', err.message) } // 输出顺序: // AuthFilter: Checking authentication // LogFilter: /api/data at [timestamp] // Processing API request // LogFilter: Response sent // Response: { status: 200, body: { data: "Success" } }
优点
解耦性
业务逻辑与横切关注点(如日志、安全)分离。
可复用性
过滤器可在不同场景重复使用。
灵活扩展
动态增删过滤器,无需修改核心代码。
职责清晰
每个过滤器专注单一任务。
缺点
性能开销
链式调用增加额外处理时间。
调试复杂度
多级过滤增加调试难度。
过度设计风险
简单场景可能引入不必要的复杂性。