设计模式3:代理、适配器、装饰器模式

ops/2025/2/21 16:55:29/

在这里插入图片描述

代理模式(Proxy Pattern)

代理模式的本质是⼀个中间件,主要⽬的是解耦合服务提供者和使⽤者。使⽤者通过代理间接访问服务提供者,便于后者的封装和控制。是⼀种结构型设计模式

静态代理和动态代理区别

  • 静态代理:编译时生成代理类,需要手动编写代理逻辑,代理类和目标类实现同一接口。
  • 动态代理:运行时生成代理类,通过反射机制动态创建代理对象,无需手动编写代理类。如JDK的Proxy类,或CGLIB动态代理

代理模式应用场景

Spring AOP编程,通过动态代理实现切面编程(如事务管理、日志记录)。若目标类实现接口则用JDK代理,否则用CGLIB

在这里插入图片描述

适配器模式

应用程序中有两个不同接口的类进行通信,应用某个中间件来完成通信过程,中间件就是适配器。所谓适配器模式就是将⼀个类的接⼝,转换成客户期望的另⼀个接⼝。比如:插头转换器

在这里插入图片描述

分为两类:

  • 类适配器,通过类继承实现适配
  • 对象适配器,通过类对象组合来实现适配

以下是对象适配器的示例代码,将220V电压转为5V电压

// 目标接口,5V充电口
interface Target {int get5V();
}// 被适配的类,220V电源
class Adaptee220V {public int get220V() {return 220;}
}//对象适配器,通过组合实现
public class ObjectAdapter implements Target {private Adaptee220V adaptee;public ObjectAdapter(Adaptee220V adaptee) {this.adaptee = adaptee;}@Overridepublic int get5V() {return adaptee.get220V() / 44;}
}
//客户端代码使用
public class AdapterDemo {public static void main(String[] args) {Target objectAdapter = new ObjectAdapter(new Adaptee220V());System.out.println("对象适配器输出:" + objectAdapter.get5V());}
}

装饰器模式

装饰器模式主要对现有的类对象进⾏包裹和封装,以期望在不改变类对象及其类定义的情况下,为对象添加额外功能。是⼀种结构型模式。

核心角色有4类:

  • Component抽象组件:定义对象接口
  • ConcreteComponent:具体组件,被装饰对象的类定义;
  • Decorator:装饰对象的抽象类,继承/实现Component
  • ConcreteDecorator具体装饰器:添加具体额外功能

下面是开发一个权限校验装饰器的示例代码,根据不同接口动态添加权限校验

//核心接口
interface ApiHandler {String handle(String request);
}//具体API实现
class UserApiHandler implements ApiHandler {@Overridepublic String handle(String request) {return "User data";}
}//权限装饰器基类
abstract class AuthDecorator implements ApiHandler {protected ApiHandler wrapped;public AuthDecorator(ApiHandler wrapped) {this.wrapped = wrapped;}public abstract String handle(String request);
}//具体权限装饰器,管理员校验
public class AdminAuthDecorator extends AuthDecorator {public AdminAuthDecorator(ApiHandler wrapped) {super(wrapped);}@Overridepublic String handle(String request) {if ("管理员".equals(request)) {return "权限错误";}return wrapped.handle(request);}
}//客户端调用
ApiHandler handler = new AdminAuthDecorator(new UserApiHandler());
handler.handle(request);

http://www.ppmy.cn/ops/160291.html

相关文章

【核心算法篇十六】《DeepSeek强化学习:MuZero算法核心解析》

引言:当强化学习不再需要环境说明书 2016年AlphaGo击败李世石让世界认识了蒙特卡洛树搜索(MCTS)的威力,2017年AlphaZero用通用算法征服围棋、象棋、将棋三大棋类。但它们的共同局限在于:必须预先知道环境的完整规则(比如棋盘如何落子、得分如何计算)。而2019年DeepMind…

WPF7-数据绑定基础

1. WPF数据绑定试验 1.1. 数据绑定的核心实现1.2. {Binding}语法1.3. 理解 DataContext 1. WPF数据绑定试验 以下是一个简单的 WPF 数据绑定示例,使用两个TextBox控件分别表示Name和Age来进行进行数据绑定试验。 数据模型类 创建一个 Person 类,包含…

Android嵌套滑动造成的滑动冲突原理分析

嵌套滑动造成的滑动冲突原理分析 场景复现: CoordinatorLayout AppBarLayout Vertical RecyclerView Horizontal RecycleView Horizontal RecycleView 是Vertical RecyclerView的一个子view, CoordinatorLayout 实现了AppBarLayout 和 RecyclerView的协调联动…

光子神经网络:为人工智能注入 “光” 速动力

光子神经网络(Photonic Neural Networks, PNNs)是利用光子学技术实现的人工神经网络,旨在通过光的高速传输和并行处理能力,突破传统电子计算在速度和能效上的限制。以下是光子神经网络的关键内容: 1. 光子神经网络的优…

VSCode 中使用 Snippets 设置常用代码块

背景 在开发中,有很多代码片段是重复的,例如:vue文件中的模版,react 中的模版,打印的 log 等等,很多很多。对于这些重复性的工作,vscode 官方提供了解决方案-Snippets in Visual Studio Code&a…

【Java】详细讲解数据类型与运算符

🏠大家好,我是Yui_💬 🍑如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 🚀如有不懂,可以随时向我提问,我会全力讲解~ &#x1f52…

PHP+Apache+MySQL安装(Windows)

一、安装教程 参考链接1 参考链接2 二、问题描述 PHP安装目录下找不到php8apache2_4.dll PHP安装包下载错误 Apache Service Monitor: request operation has failed! 定位问题: 查看【事件查看器】 解决问题 安装或更新与PHP版本相对应的Visual C Redistribu…

分布式大语言模型服务引擎vLLM论文解读

论文地址:Efficient Memory Management for Large Language Model Serving with PagedAttention 摘要 大语言模型(LLMs)的高吞吐量服务需要一次对足够多的请求进行批处理。然而,现有系统面临困境,因为每个请求的键值…