设计模式详解:代理、适配器与装饰器模式
创作时间:
作者:
@小白创作中心
设计模式详解:代理、适配器与装饰器模式
引用
1
来源
1.
https://www.cnblogs.com/dnboy/p/18720334
设计模式是软件工程中的重要概念,它提供了一套经过验证的解决方案,帮助开发者解决常见的设计问题。本文将介绍三种常用的设计模式:代理模式、适配器模式和装饰器模式,通过概念解释、应用场景和代码示例,帮助读者深入理解这些模式的核心思想和使用场景。
代理模式(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;
}
@Override
public 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 {
@Override
public 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);
}
@Override
public String handle(String request) {
if ("管理员".equals(request)) {
return "权限错误";
}
return wrapped.handle(request);
}
}
//客户端调用
ApiHandler handler = new AdminAuthDecorator(new UserApiHandler());
handler.handle(request);
热门推荐
部门助理绩效考核鱼骨图的构建与应用
《道德经》电子书多版本合集:深入探索道家哲学的精髓
科技分享:睡眠or休眠?系统待机S0-S5深度解析
做梦梦到拉屎是什么意思
北方适合种植紫竹吗?紫竹种植全攻略
农村自建房施工全过程详解:从准备到入住的九个关键阶段
“天价”动力电池维修如何破?
C罗闪耀利雅得胜利:进球、策划、争议与荣耀全记录
Excel快速筛选公式:多种方法与实用技巧详解
粤语词汇演变探究:语言融合现象
刑事申诉立案成功率:现状与对策
劳动合同解除中的证据收集与提交
让你的爱机焕然一新:笔记本电脑表面清洁指南
小虎战右手,小奶油战Faker!S14全球总决赛正赛正式打响
如何建立持续改善的执行力
长江文化研究|刘大禹:长江文化孕育和影响了近代江苏实业家群体
紫苏是什么 紫苏的功效与作用
刷屏的《黑神话:悟空》里,已发现山东的灵岩寺、四门塔!游戏场景与实景对比来了
如何理解保证利率与养老的关系?这种关系如何影响养老规划?
李龟年:盛唐之音的流亡者
检测到“问题基因”离预防出生缺陷有多远?遗传咨询师有话说
昆明至河口深度游攻略,探寻边陲风情与自然奇景
福建:科技赋能智慧养老 让“养老”变“享老”
基于CD4511的八路抢答器电路设计详解
苏州古城"细胞级"保护 让古建老宅"活"起来
彩金的价值由什么决定?这种决定因素如何影响其价格?
18k金是彩金吗?一文读懂18k金与彩金的区别
河北省中医院医疗美容科:专业团队,优质服务
乙肝抗体阴性,需要打疫苗吗?
乙肝表面抗体阳性:健康信号还是潜在风险?