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

本文涉及的产品
应用实时监控服务-用户体验监控,每月100OCU免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
简介: 代理模式是一种结构型设计模式,通过中间件解耦服务提供者和使用者,使使用者间接访问服务提供者,便于封装和控制。

代理模式(Proxy Pattern)

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

静态代理和动态代理区别

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

代理模式应用场景

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

代理模式.png

适配器模式

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

适配器模式.png

分为两类:

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

以下是对象适配器的示例代码,将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());
    }
}
AI 代码解读

装饰器模式

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

核心角色有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);
AI 代码解读
目录
打赏
0
2
2
0
446
分享
相关文章
课时90:代理设计模式
课时90介绍了代理设计模式,该模式通过代理对象帮助用户专注于核心业务功能。代理模式中,客户端只关注核心业务(如“吃”),而代理对象负责准备、执行和清理工作。通过接口IEat、真实主题EatReal和服务代理EatProxy的实现,展示了如何在代码中应用代理模式。代理模式的特点是将业务逻辑与辅助操作分离,使代码更清晰且易于维护。
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
62 0
前端必须掌握的设计模式——装饰器模式
装饰器模式是一种结构型设计模式,通过创建新类来包装原始对象,实现在不修改原有结构的前提下扩展新行为。其核心在于“组合”思想,使新功能可“即插即拔”。该模式具有解耦性、灵活性和动态性等特点,广泛应用于类的面向对象编程语言中,如JavaScript的注解和TypeScript的写法。示例中,通过装饰器模式为游戏角色动态添加装备,展示了其强大的扩展性和灵活性。
|
10月前
|
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
90 1
05.静态代理设计模式
《静态代理设计模式》详细介绍了静态代理的基本概念、原理与实现、应用场景及优缺点。主要内容包括静态代理的由来、定义、使用场景、实现方式、结构图与时序图,以及其在降低耦合、保护对象权限等方面的优势。同时,文章也指出了静态代理的局限性,如缺乏灵活性、难以复用、难以动态添加功能等,并介绍了动态代理如何弥补这些不足。最后,通过多个实际案例和代码示例,帮助读者更好地理解和应用静态代理模式。
65 4
spring源码设计模式分析-代理设计模式(二)
spring源码设计模式分析-代理设计模式(二)
Java设计模式-装饰器模式(10)
Java设计模式-装饰器模式(10)
利用 Xamarin 开展企业级移动应用开发:从用户登录到客户管理,全面演示C#与Xamarin.Forms构建跨平台CRM应用的实战技巧与代码示例
【8月更文挑战第31天】利用 Xamarin 进行企业级移动应用开发能显著提升效率并确保高质量和高性能。Xamarin 的跨平台特性使得开发者可以通过单一的 C# 代码库构建 iOS、Android 和 Windows 应用,帮助企业快速推出产品并保持一致的用户体验。本文通过一个简单的 CRM 示例应用演示 Xamarin 的使用方法,并提供了具体的代码示例。该应用包括用户登录、客户列表显示和添加新客户等功能。此外,还介绍了如何增强应用的安全性、数据持久化、性能优化及可扩展性,从而构建出功能全面且体验良好的移动应用。
88 0
Ruby设计模式大揭秘!代理VS装饰器,你选对了让代码起舞的魔法棒吗?
【8月更文挑战第31天】在软件开发中,设计模式能够提升代码质量和团队协作效率。本文将介绍Ruby中的两种重要模式:代理(Proxy)和装饰器(Decorator)。代理模式通过中间对象控制对目标对象的访问,适用于访问控制、延迟加载等场景;装饰器模式则允许在不改变原对象结构的情况下动态添加新功能,比生成子类更灵活。通过具体示例代码,我们将深入理解这两种模式的实现和应用,帮助开发者更好地选择合适的模式解决问题。
63 0
Java设计模式:深入装饰器模式的三种写法(六)
Java设计模式:深入装饰器模式的三种写法(六)

云原生

+关注
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等