文章目录
  1. 1. 简单介绍
  2. 2. UML图
  3. 3. 分类
  4. 4. 实例
  5. 5. 输出
  6. 6. 效果

我们继续设计模式的整理,下面是将要介绍第二个设计模式—Proxy Pattern(代理模式)

简单介绍

为其他对象提供一种代理以控制对这个对象的访问(Provide a surrogate or placeholder for another object to control access to it)。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。通俗的说,就是客户端通过代理对象去操纵委托对象(或者说被代理对象)

UML图

分类

  1. 远程代理(Remote Proxy):RMI 在不同的地址空间提供局部代表对象,可以重新申请代码(provide local representative for object in different address space, may re-code request)
  2. 虚拟代理(Virtual Proxy):创建开销的对象(creates expensive objects on demand, like in example, may also cache)。。作为创建开销大的对象的代表。虚拟代理经常直到我们真正需要一个对象的时候才创建它。当对象在创建前和创建中时,由虚拟代理来扮演对象的替身。对象创建后,代理就会将请求直接委托给对象。例子:

    想要显示CD封面,得从在线服务中取得图像,由于网络限制,下载需要一些时间,在等待图像加载的时候,应该显示一些东西。虚拟代理可以代理Icon,管理背景的加载,并在加载未完成时显示“CD封面加载中,请稍候……”,当加载完成,代理显示图像。注意这里要启动一个新的线程异步加载图像。
    
  3. 保护代理(Protection Proxy):控制访问原始对象,当访问权限不同比较有用(control access to original object, useful when access rights differ)

实例

  1. Subject类

    public interface Subject {
        public void request();
    }
    
  2. RealSubject类

    public class RealSubject implements Subject{
    
        @Override
        public void request() {
            // TODO Auto-generated method stub
            System.out.println("哈哈,我是被代理的类,我不想让你访问我!!");
        }
    
    }
    
  3. Proxy类

    public class Proxy implements Subject{
        private Subject subject;
    
        public Proxy(Subject subject) {
            this.subject = subject;
        }
    
        @Override
        public void request() {
            System.out.println("我是代理类,啦啦啦!");
            subject.request();
            this.doOtherThing();
        }
    
        public void doOtherThing() {
            System.out.println("我是代理,还去做了其他事情!!");
        }
    
    }
    
  4. Client类

    public class Client {
        public static void main(String arg[]) {
            Subject subject = new RealSubject();
    
            Subject proxy = new Proxy(subject);
            proxy.request();
        }
    }
    

输出

我是代理类,啦啦啦!
哈哈,我是被代理的类,我不想让你访问我!!
我是代理,还去做了其他事情!!

可以看到,通过代理模式,用户不仅可以让委托类完成工作外,还可以在代理类中做一些委托类不能完成的任务。这个就可以解决一些问题,比如:假设有一组对象都实现同一个接口,实现同样的方法,但这组对象中有一部分对象需要有单独的方法,传统的笨办法是在每一个应用端都加上这个单独的方法,但是代码重用性低,耦合性高。但是使用代理的方法就可以很好解决。

并且代理和委托类实现同一个接口,让他们具有相同的 对外接口~

上面这种代理模式叫做静态代理,java提供了对代理模式的更高级支持——动态代理模式(这个我们以后再做介绍)。

效果

代理模式在访问对象是引入了一个间接层(The Proxy pattern introduces a level of indirection when accessing an object)

  1. 远程代理可以隐藏该对象驻留在不同的地址空间的事实(A remote proxy can hide the fact that the object resides in a different address space)
  2. 虚拟代理可以进行最佳化(A virtual proxy can perform optimisations)
  3. 允许添加额外事务(Allow additional housekeeping)
文章目录
  1. 1. 简单介绍
  2. 2. UML图
  3. 3. 分类
  4. 4. 实例
  5. 5. 输出
  6. 6. 效果