设计模式[8]-代理模式-Proxy Pattern

1. 代理模式

代理模式(Proxy Pattern)是常用的结构性设计模式,和装饰者模式非常相似,代理类和被代理类实现了同样的接口。代理模式完全隐藏了被代理的对象,并可以控制方法的访问过程。

代理模式的角色一共有三种。

  • Subject(抽象主题角色): RealSubject和Proxy实现的共同接口。

  • RealSubject(真实主题角色):是被代理的对象,客户端对RealSubject毫无所知。

  • Proxy(代理主题角色): 负责代理RealSubject,控制RealSubject的方法访问过程。

本文只讨论静态的代理模式,Java的动态代理涉及到反射或cglib的技术,不是本次讨论的重点,关于动态代理的内容,可以参考http://www.jianshu.com/p/4fe5a75b9202 。

2. 代理模式举例

下面我们举一个租房的例子,客户只知道中介,不知道房东是谁,最终把房子租下来了。

序号 类名 角色 说明
1 Rentable Subject 抽象主题角色,租房接口
2 Owner RealSubject 真实主题角色,房东
3 Agency Proxy 代理主题角色,中介
4 ProxyMain 客户端 演示调用,租客
设计模式[8]-代理模式-Proxy Pattern_第1张图片
Paste_Image.png

1. Rentable类

// 抽象主题,可以出租的
public interface Rentable {
    // 出租
    void rent();
}

2. Owner类

// 真实主题角色,房东
public class Owner implements Rentable{

    @Override
    public void rent() {
        System.out.println("房东出租三居室一套");
    }
}

3. Agency

// 代理角色,中介,客户端不知道被代理的对象。
public class Agency implements Rentable{

    private Owner owner;

    // 代理模式直接在构造函数里面new一个被代理对象。
    // 注意对比装饰者模式,构造器是不同的。
    public Agency() {
        super();
        this.owner = new Owner();
    }

    // 代理模式注重控制对方法的访问
    @Override
    public void rent() {
        // 可以在这里做权限验证等功能,类似Spring AOP。
        System.out.println("中介宣传、并带看房子");
        owner.rent();
        System.out.println("和中介签订租房合同");
    }
}

4. ProxyMain

// 客户端,即租客,只知道中介,不认识房东。
public class ProxyMain {

    public static void main(String[] args) {
        Agency agency = new Agency();
        agency.rent();
    }
}

3. 代理模式总结

优点:
代理模式完全隐藏了被代理的对象,方便控制方法被访问的过程。

缺点:
代理模式有可能使请求处理速度变慢。

4. 代理模式和装饰者模式的对比

相同点:
代理模式中,代理类和被代理类都实现同一个接口;装饰者模式中,装饰类和被装饰类也都实现同一个接口。

不同点:
代理类和装饰类的构造器是不同。代理类在构造器是无参的,明确地创建了一个对象,即只代理一个固定的对象;装饰类的构造器是有参的,可以动态的指定被装饰的对象。

装饰者模式注重为被装饰者添加新的方法;代理模式注重对代理对象的方法访问做控制。

(完)

你可能感兴趣的:(设计模式[8]-代理模式-Proxy Pattern)