1. 代理模式
代理模式(Proxy Pattern)是常用的結構性設計模式,和裝飾者模式非常相似,代理類和被代理類實現了同樣的接口。代理模式完全隱藏了被代理的對象,并可以控制方法的訪問過程。
代理模式的角色一共有三種。
Subject(抽象主題角色): RealSubject和Proxy實現的共同接口。
RealSubject(真實主題角色):是被代理的對象,客戶端對RealSubject毫無所知。
Proxy(代理主題角色): 負責代理RealSubject,控制RealSubject的方法訪問過程。
本文只討論靜態(tài)的代理模式,Java的動態(tài)代理涉及到反射或cglib的技術,不是本次討論的重點,關于動態(tài)代理的內容,可以參考http://www.itdecent.cn/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. 代理模式總結
優(yōu)點:
代理模式完全隱藏了被代理的對象,方便控制方法被訪問的過程。
缺點:
代理模式有可能使請求處理速度變慢。
4. 代理模式和裝飾者模式的對比
相同點:
代理模式中,代理類和被代理類都實現同一個接口;裝飾者模式中,裝飾類和被裝飾類也都實現同一個接口。
不同點:
代理類和裝飾類的構造器是不同。代理類在構造器是無參的,明確地創(chuàng)建了一個對象,即只代理一個固定的對象;裝飾類的構造器是有參的,可以動態(tài)的指定被裝飾的對象。
裝飾者模式注重為被裝飾者添加新的方法;代理模式注重對代理對象的方法訪問做控制。
(完)