首先了解代理模式:
給某一個對象提供一個代理,並由代理對象控制對原對象的引用,是一種對象結構型模式。(比如某臺遠程服務器提供了一個功能很強大的加密算法,而現在正在開發的系統又需要使用到該算法,由於該算法位於遠程服務器端,封裝該算法的對象位於遠程服務器的內存中,本地內存中的對象無法直接訪問,因此需要通過一個遠程代理的機制來實現對遠程對象的操作)
subject(抽象主體角色)
聲明瞭真實主題和代理主題的共同接口,這樣一來在任何使用真實主題的地方都可以使用代理主題。客戶端需要針對抽象主題角色進行編程。
Proxy(代理主題角色):
內部包含着對真實主題的引用,從而可以在任何時候操作真實主題對象。代理主題角色還可以控制對真實主題的使用,負責在需要的時候創建和刪除真實的主題對象,並對真實主題對象的使用加以約束。代理角色通常在客戶端調用所引用的真實主題操作之前或之後還需要執行其他操作,而不僅僅是單純的調用真實主題對象中的操作。
RealSubject(真實主題角色):
定義了代理角色所表示的真實對象,在真實主題角色中實現了真實的業務操作,客戶端可以通過代理主題角色間接調用真實主題角色中定義的方法。
代理模式的核心:
代理模式在日常生活中隨處可見:使用信用卡付款時,信用卡就是銀行的代理。windows操作系統上的桌面快捷方法工具欄就是迅速打開應用程序的代理。
代理模式實例之論壇權限控制代理:
說明:
在一個論壇中已註冊用戶和遊客的權限不同,已註冊的用戶擁有發帖,修改自己的註冊信息,修改自己的帖子等功能,而遊客只能看到別人發的帖子,沒有其他權限。(使用到保護代理,用於控制對一個對象的訪問,可以給不同的用戶提供不同級別的使用權限)
實現:
抽象代理類AbstractPermission:
package 代理模式;
/**
* 論壇權限控制代理
* 抽象權限類AbstractPermission
* 真實主題角色RealPermission
* 代理主題角色PermissionProxy
* @author Administrator
*/
public interface AbstractPermission {
public void modifyUserinfo();
public void viewNote();
public void publishNote();
public void modifyNote();
public void setLevel(int level);
}
真實權限類RealPermission:
package 代理模式;
/**
* 真實權限類
* @author Administrator
*
*/
public class RealPermission implements AbstractPermission {
@Override
public void modifyUserinfo() {
System.out.println("修改用戶信息");
}
@Override
public void viewNote() {
}
@Override
public void publishNote() {
System.out.println("發佈新帖");
}
@Override
public void modifyNote() {
System.out.println("修改發帖內容");
}
@Override
public void setLevel(int level) {
}
}
權限代理類PermissionProxy:
package 代理模式;
/**
* 權限代理類
* @author Administrator
*
*/
public class PermissionProxy implements AbstractPermission{
private RealPermission permission = new RealPermission();
private int level = 0;
@Override
public void modifyUserinfo() {
if(0 == level){
System.out.println("沒有該權限modifyUserinfo");
}else
if(1 == level){
// 調用真實權限類的方法
permission.modifyUserinfo();
}
}
@Override
public void viewNote() {
System.out.println("查看帖子");
}
@Override
public void publishNote() {
if(0 == level){
System.out.println("沒有該權限publishNote");
}else
if(1 == level){
// 調用真實權限類的方法
permission.publishNote();
}
}
@Override
public void modifyNote() {
if(0 == level){
System.out.println("沒有該權限modifyNote");
}else
if(1 == level){
// 調用真實權限類的方法
permission.modifyNote();
}
}
@Override
public void setLevel(int level) {
this.level = level;
}
}
客戶端測試類:
package 代理模式;
import 工廠模式.XMLUtil;
public class Client {
public static void main(String[] args) {
AbstractPermission permission;
permission = (AbstractPermission)XMLUtil.getBean();
permission.modifyUserinfo();
permission.viewNote();
permission.publishNote();
permission.modifyNote();
System.out.println("___________________");
permission.setLevel(1);
permission.modifyUserinfo();
permission.viewNote();
permission.publishNote();
permission.modifyNote();
}
}
優缺點:
保護代理模式可以控制對真實對象的使用權限。
遠程代理使得客戶端可以訪問在遠程機器上的對象,遠程機器可能具有更好的計算性能與處理速度,可以快速響應並處理客戶端請求。遠程代理爲一個位於不同的地址空間的對象提供一個本地的代理對象,這個不同的地址空間可以是在同一臺主機中,也可是在另一臺主機中,遠程代理又叫做大使(Ambassador)
虛擬代理通過使用一個小對象來代表一個大對象,可以減少系統資源的消耗,對系統進行優化並提高運行速度。虛擬代理如果需要創建一個資源消耗較大的對象,西安創建一個消耗相對較小的對象來表示,真實對象只在需要時纔會被真正創建。
由於在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。實現代理模式需要額外的工作,有些代理模式的實現非常複雜。