1. 代理模式
代理模式(Proxy Pattern)是常用的结构性设计模式,和装饰者模式非常相似,代理类和被代理类实现了同样的接口。代理模式完全隐藏了被代理的对象,并可以控制方法的访问过程。
代理模式的角色一共有三种。
Subject(抽象主题角色): RealSubject和Proxy实现的共同接口。
RealSubject(真实主题角色):是被代理的对象,客户端对RealSubject毫无所知。
Proxy(代理主题角色): 负责代理RealSubject,控制RealSubject的方法访问过程。
本文只讨论静态的代理模式,Java的动态代理涉及到反射或cglib的技术,不是本次讨论的重点,关于动态代理的内容,可以参考//www.greatytc.com/p/4fe5a75b9202 。
2. 代理模式举例
下面我们举一个租房的例子,客户只知道中介,不知道房东是谁,最终把房子租下来了。
序号 | 类名 | 角色 | 说明 |
---|---|---|---|
1 | Rentable | Subject | 抽象主题角色,租房接口 |
2 | Owner | RealSubject | 真实主题角色,房东 |
3 | Agency | Proxy | 代理主题角色,中介 |
4 | ProxyMain | 客户端 | 演示调用,租客 |
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. 代理模式和装饰者模式的对比
相同点:
代理模式中,代理类和被代理类都实现同一个接口;装饰者模式中,装饰类和被装饰类也都实现同一个接口。
不同点:
代理类和装饰类的构造器是不同。代理类在构造器是无参的,明确地创建了一个对象,即只代理一个固定的对象;装饰类的构造器是有参的,可以动态的指定被装饰的对象。
装饰者模式注重为被装饰者添加新的方法;代理模式注重对代理对象的方法访问做控制。
(完)