设计模式-代理模式

代理模式(Proxy Pattern)是一种结构型设计模式,它通过引入一个代理对象来控制对原始对象的访问。代理对象和原始对象具有相同的接口,客户端无需知道实际的对象是代理对象还是原始对象,可以通过代理对象来间接地访问原始对象。

 

代理模式的核心思想是在访问对象时引入一层间接性,以便在访问前后进行一些额外的操作。代理对象可以用于实现对原始对象的访问控制、延迟加载、缓存、日志记录等功能。

 

以下是代理模式的几个关键角色:

  1. 抽象主题(Subject):定义了代理和真实主题(原始对象)的共同接口,客户端通过抽象主题来访问对象。
  2. 真实主题(Real Subject):定义了真正的对象,是代理对象所代表的对象。
  3. 代理(Proxy):持有对真实主题的引用,并实现了与抽象主题相同的接口,可以在访问前后进行一些额外的操作。代理对象可以决定是否需要创建、控制或延迟加载真实主题的对象。

 

代理模式的优点包括:

  1. 可以通过代理对象在不修改原始对象代码的情况下,增加额外的功能和行为。
  2. 可以隐藏真实对象的实现细节,对客户端透明,增加了代码的安全性。
  3. 可以实现对原始对象的访问控制,限制客户端对真实对象的直接访问。
  4. 可以实现延迟加载,在需要时才创建真实对象,提高了系统的性能和效率。

 

然而,代理模式也存在一些缺点:

  1. 引入代理对象会增加系统的复杂性。
  2. 代理模式在一些情况下可能会降低系统的性能,因为需要通过代理对象间接访问真实对象。

 

总结来说,代理模式允许通过代理对象来控制对原始对象的访问,它可以实现额外的功能和行为,并对客户端隐藏真实对象的实现细节。代理模式可用于访问控制、延迟加载、缓存、日志记录等场景,提高了系统的灵活性和可扩展性。

 

以下是一个代理模式的示例代码:

// 主题接口
interface Subject {
    void request();
}

// 真实主题类
class RealSubject implements Subject {
    public void request() {
        System.out.println("执行真实主题的请求");
    }
}

// 代理类
class Proxy implements Subject {
    private RealSubject realSubject;

    public Proxy() {
        this.realSubject = new RealSubject();
    }

    public void request() {
        beforeRequest();
        realSubject.request();
        afterRequest();
    }

    public void beforeRequest() {
        System.out.println("在真实主题请求之前的操作");
    }

    public void afterRequest() {
        System.out.println("在真实主题请求之后的操作");
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.request();
    }
}

在上述示例中,主题接口 Subject定义了一个请求方法 request()

真实主题类 RealSubject 实现了主题接口,并实现了具体的请求方法。

代理类 Proxy 实现了主题接口,并持有一个真实主题对象的引用。在代理类的请求方法中,我们可以在调用真实主题对象的方法之前和之后执行额外的操作。

在客户端代码中,我们创建了代理对象,并通过代理对象来进行请求。代理对象控制了对真实主题对象的访问,并可以在访问前后进行相应的操作。

通过代理模式,我们可以在访问对象时增加额外的逻辑,如权限控制、缓存控制、日志记录等。代理模式还可以实现延迟加载,只在需要时创建真实对象,提高了系统的性能。

需要注意的是,代理模式可以分为静态代理和动态代理两种实现方式。在上述示例中,我们使用的是静态代理,即在编译时就确定了代理对象。而动态代理是在运行时动态生成代理对象,根据需要对方法进行拦截和增强。

 

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值