在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 的内容和服务或者添加客户需要的额外服务。
通过引入一个新的对象来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式,通过引入代理对象来间接访问一个对象,这就是代理模式的模式动机。
**代理模式(
Proxy Pattern
)**:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy
或Surrogate
,它是一种对象结构型模式。
代理模式包含如下角色:
Subject
: 抽象主题角色RealSubject
: 真实主题角色Proxy
: 代理主题角色首先,是抽象的主题接口和真实主题类:
package com.blinkfox.patterns.proxy;
/**
* 抽象主题类
* Created by blinkfox on 2017/1/1.
*/
public interface ISubject {
/**
* 定义一个方法
*/
public void request();
}
package com.blinkfox.patterns.proxy;
/**
* 真实主题类
* Created by blinkfox on 2017/1/1.
*/
public class RealSubject implements ISubject {
/**
* 实现方法
*/
@Override
public void request() {
System.out.println("真实主题类请求方法...");
}
}
然后,是代理类:
package com.blinkfox.patterns.proxy;
/**
* 代理类
* Created by blinkfox on 2017/1/1.
*/
public class Proxy implements ISubject {
private ISubject subject;
public Proxy(ISubject subject) {
this.subject = subject;
}
@Override
public void request() {
this.before();
this.subject.request();
this.after();
}
/**
* 预处理
*/
private void before() {
System.out.println("执行前(before)的处理...");
}
/**
* 善后处理
*/
private void after() {
System.out.println("执行后(after)的处理...");
}
}
最后,是客户端场景测试类:
package com.blinkfox.patterns.proxy;
/**
* 代理模式客户端场景类
* Created by blinkfox on 2017/1/1.
*/
public class ProxyClient {
public static void main(String[] args) {
ISubject subject = new RealSubject();
Proxy proxy = new Proxy(subject);
proxy.request();
}
}
代理模式的优点:
代理模式的缺点:
根据代理模式的使用目的,常见的代理模式有以下几种类型: