设计模式轻松学【六】静态代理

简介: 学习动态代理之前,我们先了解了解静态代理

静态代理通常用于对原有业务逻辑的扩充。比如你有一个已实现的功能类,并且调用了其中的某些方法。由于需求变更,你需要加入日志打印,但又不合适将逻辑 直接加入其中。所以可以创建一个代理类来实现。

实现步骤:

  • 创建代理类,实现和待扩展功能类一样的方法。
  • 通过代理类持有真实对象
  • 然后在源代码中调用代理类方法,来添加我们新加入的业务逻辑
  • 一个典型的代理模式通常有三个角色:

    • Subject:抽象主题角色,抽象主题类可以是抽象类,也可以是接口,是一个最普通的业务类型定义,无特殊要求。
    • RealSubject:具体主题角色,也叫被委托角色、被代理角色。是业务逻辑的具体执行者。
    • Proxy:代理主题角色,也叫委托类、代理类。它把所有抽象主题类定义的方法给具体主题角色实现,并且在具体主题角色处理完毕前后做预处理和善后工作。

共同接口

public interface Action {
    public void doSomething();
}

真实对象

public class RealObject implements Action{
 
    public void doSomething() {
        System.out.println("do something");
    }
}

代理对象

public class Proxy implements Action {
    private Action realObject;
 
    public Proxy(Action realObject) {
        this.realObject = realObject;
    }
    public void doSomething() {
        System.out.println("proxy do");
        realObject.doSomething();
    }
}

运行代码

    Proxy proxy = new Proxy(new RealObject());
    proxy.doSomething();

实现原理

image.png

优缺点

优点:不破坏原代码,不影响原来老的功能

缺点:如果有10个这样的功能类RealObject,而且我们要去代理的方法是不同的,比如代理:doSomething、doAnotherThing、doTwoAnotherThing等方法

realObject.doSomething();
realObject1.doAnotherThing();
realObject2.doTwoAnother();

缺点解决方案

  1. 为这些方法创建不同的代理类,使用不同的代理对象独自完成,代理后的代码如下

    //不同的代理对象,独自完成
    proxy.doSomething();
    proxy1.doAnotherThing();
    proxy2.doTwoAnother();
  2. 创建一个综合型的Proxy,实现Action1、Action2、Action3.....,并且持有不同的realObject实例,由一个proxy代理对象来调用其他方法,但这样会显得非常膨胀,非常臃肿

    //同一个代理对象,持有不同的realObject实例
    proxy.doSomething();
    proxy.doAnotherThing();
    proxy.doTwoAnother();

    你的类结构就变成了如下样子

    image.png

这种综合型的操作,非常难以维护,若出现方法名相同,仅参数不同的对象,调用的时候需要额外判断,否则容易出错

目录
相关文章
|
设计模式 缓存 安全
设计模式之代理模式的懂静态代理和动态代理
设计模式之代理模式的懂静态代理和动态代理
303 0
|
设计模式 XML JSON
二十三种设计模式全面解析-代理模式进阶篇:揭秘远程代理
二十三种设计模式全面解析-代理模式进阶篇:揭秘远程代理
331 0
|
9月前
|
设计模式
课时90:代理设计模式
课时90介绍了代理设计模式,该模式通过代理对象帮助用户专注于核心业务功能。代理模式中,客户端只关注核心业务(如“吃”),而代理对象负责准备、执行和清理工作。通过接口IEat、真实主题EatReal和服务代理EatProxy的实现,展示了如何在代码中应用代理模式。代理模式的特点是将业务逻辑与辅助操作分离,使代码更清晰且易于维护。
110 1
|
10月前
|
设计模式 中间件 Java
设计模式3:代理、适配器、装饰器模式
代理模式是一种结构型设计模式,通过中间件解耦服务提供者和使用者,使使用者间接访问服务提供者,便于封装和控制。
181 3
|
设计模式 网络协议 Java
05.静态代理设计模式
《静态代理设计模式》详细介绍了静态代理的基本概念、原理与实现、应用场景及优缺点。主要内容包括静态代理的由来、定义、使用场景、实现方式、结构图与时序图,以及其在降低耦合、保护对象权限等方面的优势。同时,文章也指出了静态代理的局限性,如缺乏灵活性、难以复用、难以动态添加功能等,并介绍了动态代理如何弥补这些不足。最后,通过多个实际案例和代码示例,帮助读者更好地理解和应用静态代理模式。
158 4
|
设计模式 Java Spring
spring源码设计模式分析-代理设计模式(二)
spring源码设计模式分析-代理设计模式(二)
|
设计模式 缓存 Java
代理设计模式解读(下)
代理设计模式解读(下)
|
数据安全/隐私保护 C# UED
利用 Xamarin 开展企业级移动应用开发:从用户登录到客户管理,全面演示C#与Xamarin.Forms构建跨平台CRM应用的实战技巧与代码示例
【8月更文挑战第31天】利用 Xamarin 进行企业级移动应用开发能显著提升效率并确保高质量和高性能。Xamarin 的跨平台特性使得开发者可以通过单一的 C# 代码库构建 iOS、Android 和 Windows 应用,帮助企业快速推出产品并保持一致的用户体验。本文通过一个简单的 CRM 示例应用演示 Xamarin 的使用方法,并提供了具体的代码示例。该应用包括用户登录、客户列表显示和添加新客户等功能。此外,还介绍了如何增强应用的安全性、数据持久化、性能优化及可扩展性,从而构建出功能全面且体验良好的移动应用。
206 0
|
设计模式 数据安全/隐私保护 C++
Ruby设计模式大揭秘!代理VS装饰器,你选对了让代码起舞的魔法棒吗?
【8月更文挑战第31天】在软件开发中,设计模式能够提升代码质量和团队协作效率。本文将介绍Ruby中的两种重要模式:代理(Proxy)和装饰器(Decorator)。代理模式通过中间对象控制对目标对象的访问,适用于访问控制、延迟加载等场景;装饰器模式则允许在不改变原对象结构的情况下动态添加新功能,比生成子类更灵活。通过具体示例代码,我们将深入理解这两种模式的实现和应用,帮助开发者更好地选择合适的模式解决问题。
146 0
|
设计模式 缓存 安全
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
192 1

热门文章

最新文章