Proxy pattern

GoF定义:为另一个对象提供一个代理(对象)来控制对这个对象的访问

概念

我们想让一个类中的操作来作为操作其它东西的接口

例子

现实世界:一个班级中,有一个同学不在,点名的时候,他的好朋友代替他答到,假装他在
代码世界:一个银行的ATM实现,真实的银行信息可能会存在远端服务器上。在编程中,创建一个非常复杂的对象开销是十分大的,这种情况下,创建一些代理对象(指向原始对象)让真正的对象在需要时创建。这样即节省内存也省了(应用)初始化时间

展示

在之后的程序中,调用代理对象的doSomework(),然后它会调用真实对象的doSomework()。看到的输出是真实对象的输出。UML图中显示出了真实对象和代理对象是不在一个包中的

package pattern.proxy.OriginalClasses;

// 代理的方法要写在抽象类中
public abstract class Subject {
    public abstract void doSomework();
}

// 真实对象的定义,实现代理方法
public class ConcreteSubjject extends Subject {
    @Override
    public void doSomework() {
        System.out.println("I'm a concrete subject");
    }
}

package pattern.proxy.proxy_class;

import pattern.proxy.OriginalClasses.ConcreteSubjject;
import pattern.proxy.OriginalClasses.Subject;

// 代理对象,用时再创建
public class Proxy extends Subject {
    ConcreteSubjject concreteSubjject;

    @Override
    public void doSomework() {
        System.out.println("Proxy call happening now.");

        if (concreteSubjject == null) {
            concreteSubjject = new ConcreteSubjject();
        }

        concreteSubjject.doSomework();
    }
}

package pattern.proxy.proxy_pattern;

// 测试
public class ProxyPatternDemo {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.doSomework();
    }
}

注意

代理类型的不同点?

  1. 远程代理(remote proxies):隐藏在不同地址空间的真实对象细节
  2. 虚拟代理(virtual proxies):用来实现优化技术(例如在需要的时候创建大对象)
  3. 保护代理(protection proxies):一般是为了处理不同的访问权限
  4. smark reference:在对象被访问的时候进行一些额外的操作(典型操作是计算真实对象的引用数量)

思考

代理模式的应用场景,主要是优化复杂对象的创建,另外可以在代理层控制权限,真正的对象只需要实现它自己所有的功能即可。既然需要代理,那么真正的对象一定是创建敏感的(花销、安全性)

posted on 2020-11-25 18:15  老鼠不上树  阅读(242)  评论(0)    收藏  举报