為什麼要使用Proxy?
舉例兩個具體情況:
(
(
總之原則是
如何使用Proxy?
以Jive 論壇系統為例
Forum 是Jive 的核心接口
在ForumPermissions 中定義了各種級別權限的用戶:
public class ForumPermissions implements Cacheable {
/*** Permission to read object
public static final int READ =
/*** Permission to administer the entire sytem
public static final int SYSTEM_ADMIN =
/*** Permission to administer a particular forum
public static final int FORUM_ADMIN =
/*** Permission to administer a particular user
public static final int USER_ADMIN =
/*** Permission to administer a particular group
public static final int GROUP_ADMIN =
/*** Permission to moderate threads
public static final int MODERATE_THREADS =
/*** Permission to create a new thread
public static final int CREATE_THREAD =
/*** Permission to create a new message
public static final int CREATE_MESSAGE =
/*** Permission to moderate messages
public static final int MODERATE_MESSAGES =
public boolean isSystemOrForumAdmin() {
return (values[FORUM_ADMIN] || values[SYSTEM_ADMIN]);
}
}
因此
public class ForumProxy implements Forum {
private ForumPermissions permissions;
private Forum forum;
this
public ForumProxy(Forum forum
ForumPermissions permissions)
{
this
this
this
}
public void setName(String name) throws UnauthorizedException
ForumAlreadyExistsException
{
//只有是系統或論壇管理者才可以修改名稱
if (permissions
forum
}
else {
throw new UnauthorizedException();
}
}
}
而DbForum 才是接口Forum 的真正實現
public class DbForum implements Forum
public void setName(String name) throws
ForumAlreadyExistsException {
this
//這裡真正將新名稱保存到數據庫中
saveToDb();
}
}
凡是涉及到對論壇名稱修改這一事件
我們已經知道
為什麼不返回ForumFactory
原因是明顯的
在ForumFactoryProxy 中我們看到代碼如下:
public class ForumFactoryProxy extends ForumFactory {
protected ForumFactory factory;
protected Authorization authorization;
protected ForumPermissions permissions;
public ForumFactoryProxy(Authorization authorization
ForumPermissions permissions)
{
this
this
this
}
public Forum createForum(String name
throws UnauthorizedException
{
//只有系統管理者才可以創建forum
if (permissions
Forum newForum = factory
return new ForumProxy(newForum
}
else {
throw new UnauthorizedException();
}
}
方法createForum 返回的也是ForumProxy
注意到這裡有兩個Proxy:ForumProxy 和ForumFactoryProxy
至於為什麼將使用對象和創建對象分開
以上我們討論了如何使用Proxy 進行授權機制的訪問
比如:我們有一個很大的Collection
其中一個特別的客戶端要進行連續的數據獲取
最直接的解決方案是:使用collection 的lock
public void foFetches(Hashtable ht){
synchronized(ht){
//具體的連續數據獲取動作
}
}
但是這一辦法可能鎖住Collection 會很長時間
第二個解決方案是clone 這個Collection
public void foFetches(Hashtable ht){
Hashttable newht=(Hashtable)ht
}
問題又來了
最後解決方案:我們可以等其他客戶端修改完成後再進行clone
使用Proxy 實現這個方案
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27422.html