设计模式 - 浅谈代理模式

代理模式

模式功能说明:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。

模式思路与原理

在代理模式中,一个类代表另一个类的功能。在代理中,我们创建具有现有对象的对象,以便向外界提供功能接口。

代码示例


interface Image {
    void display();
}

class RealImage implements Image {
    private String filename;
    public RealImage(String filename) {
        this.filename = filename;
        loadFromDisk();
    }
    private void loadFromDisk() {
        System.out.println("Loading " + filename);
    }
    public void display() {
        System.out.println("Displaying " + filename);
    }
}

class ProxyImage implements Image {
    private RealImage realImage;
    private String filename;
    public ProxyImage(String filename) {
        this.filename = filename;
    }
    public void display() {
        if (realImage == null) {
            realImage = new RealImage(filename);
        }
        realImage.display();
    }
}

public class ProxyPatternDemo {
    public static void main(String[] args) {
        Image image = new ProxyImage("test.jpg");
        image.display();
        System.out.println("");
        image.display();
    }
}

新建了一个Image接口和实现了Image接口的实体类。ProxyImage是一个代理类,减少RealImage对象加载的内存占用。

使用场景:

  • 远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实。
  • 虚拟代理,这种方式通常是为了完成在需要的时候创建大型对象。
  • 安全代理,这种方式通常是为了控制真实对象访问时的权限。
  • 智能指引,这是一种当调用真实的对象时,代理处理另外一些事。

优缺点

优点

  1. 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
  2. 代理对象在客户端和目标对象之间起到中介的作用,这样可以起到保护目标对象的作用。

缺点

  1. 由于在客户端和真实主题之间增加了代理对象,因此会造成请求的处理速度变慢。
  2. 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

总结

代理模式使用了设计原则有:开闭原则(对扩展开放,对修改关闭)和单一职责原则(一个类只做一件事情)。 它在需要控制对原始对象的访问时非常有用,它可以作为一个层或接口以支持分布式访问,控制访问,或添加特殊的方式(如:记录日志,检查权限等)。


本文链接:

https://pugqq.com/archives/proxy-pattern.html
设计模式 - 浅谈代理模式 - I/O
快来做第一个评论的人吧~

# 最近更新

Nginx的proxy_pass指令完全拆解2021-03-21

Nginx配置Jenkins域名访问2021-01-03

设计模式 - 浅谈备忘录模式2020-12-02

设计模式 - 浅谈中介者模式2020-11-23

设计模式 - 浅谈迭代器模式2020-11-02

MySQL5.7 字符集设置2020-10-26

设计模式 - 浅谈状态模式2020-10-23

设计模式 - 浅谈访问者模式2020-10-13

设计模式 - 浅谈观察者模式2020-10-12

设计模式 - 浅谈命令模式2020-09-21