写点什么

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

作者:卷福同学
  • 2025-02-17
    湖北
  • 本文字数:1397 字

    阅读完需:约 5 分钟

代理模式(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);
复制代码


发布于: 刚刚阅读数: 3
用户头像

卷福同学

关注

一个在福报厂修福报的程序员 2020-04-30 加入

阿里巴巴Java资深开发,终身学习者,持续文章撰写者,福报厂卷着。目前主要从事地图领域相关业务,负责100万QPS的系统,有丰富的高并发高可用经验

评论

发布
暂无评论
设计模式3:代理、适配器、装饰器模式_设计模式_卷福同学_InfoQ写作社区