設計模式之Proxy

設計模式總共有23種模式這僅僅是爲了一個目的:解耦+解耦+解耦...(高內聚低耦合知足開閉原則)

爲何要使用Proxy?

1.受權機制 不一樣級別的用戶對同一對象擁有不一樣的訪問權利.java

2.某個客戶端不能直接操做到某個對象,但又必須和那個對象有所互動.
代理對象能夠在客戶端和目標對象之間起到中介的做用,而且能夠經過代理對象去掉客戶不能看到的內容和服務或者添加客戶端須要的額外服務。
android

Proxy的應用?

1.每一個模塊訪問目標對象的權限不一樣的狀況。數據庫

在一個論壇中游客與已註冊的權限是不一樣的,已註冊用戶能夠發帖什麼的。遊客但沒有基本只有瀏覽的權限。設計模式

2.獲取網絡圖片的時候。瀏覽器

用戶經過瀏覽器訪問網頁時先不加載真實的大圖片,而是經過代理對象的方式進行處理,先用一個線程獲取一個小圖片並加載顯示給用戶。安全

而後再開一個線程來調用大圖片。網絡

3.android的應用層中調用local service 的時候。post

學過binder的時候會發現有不少proxy出現。應用層中不能直接驅動binder驅動程序須要經過Proxy來獲取對應的數據或發送對應的另一個進程中。this

Proxy模式結構?

Subject是一個抽象類。spa

Proxy是RealSbuject的代理類。

RealSbuject是真實的模塊類具體處理都是由它來完成。

Client裏能夠經過Proxy來操做RealSbuject。

經過這種思路咱們能夠了解一下論壇權限相關模式。

如何使用Proxy?

訪問論壇系統的用戶有多種類型:註冊普通用戶 論壇管理者 系統管理者 遊客,註冊普通用戶才能發言;論壇管理者能夠管理他被受權的論壇;

系統管理者能夠管理全部事務等,這些權限劃分和管理是使用Proxy完成的.

Forum是Jive的核心接口,在Forum中陳列了有關論壇操做的主要行爲,如論壇名稱 論壇描述的獲取和修改,帖子發表刪除編輯等.

ForumPermissions中定義了各類級別權限的用戶:

public class ForumPermissions implements Cacheable { 

/**
* Permission to read object.
*/
public static final int READ = 0;

/**
* Permission to administer the entire sytem.
*/
public static final int SYSTEM_ADMIN = 1;

/**
* Permission to administer a particular forum.
*/
public static final int FORUM_ADMIN = 2;

/**
* Permission to administer a particular user.
*/
public static final int USER_ADMIN = 3;

/**
* Permission to administer a particular group.
*/
public static final int GROUP_ADMIN = 4;

/**
* Permission to moderate threads.
*/
public static final int MODERATE_THREADS = 5;

/**
* Permission to create a new thread.
*/
public static final int CREATE_THREAD = 6;

/**
* Permission to create a new message.
*/
public static final int CREATE_MESSAGE = 7;

/**
* Permission to moderate messages.
*/
public static final int MODERATE_MESSAGES = 8;

.....

public boolean isSystemOrForumAdmin() {
  return (values[FORUM_ADMIN] || values[SYSTEM_ADMIN]);
}

.....

}

所以,Forum中各類操做權限是和ForumPermissions定義的用戶級別有關係的,做爲接口Forum的實現:ForumProxy正是將這種對應關係聯繫起來.

好比,修改Forum的名稱,只有論壇管理者或系統管理者能夠修改,代碼以下:

public class ForumProxy implements Forum {

private ForumPermissions permissions;
private Forum forum; 
this.authorization = authorization; 

public ForumProxy(Forum forum, Authorization authorization,
ForumPermissions permissions)
{
this.forum = forum;
this.authorization = authorization;
this.permissions = permissions;
}

.....

public void setName(String name) throws UnauthorizedException,
ForumAlreadyExistsException
{
  //只有是系統或論壇管理者才能夠修更名稱
  if (permissions.isSystemOrForumAdmin()) {
    forum.setName(name);
  }
  else {
    throw new UnauthorizedException();
  }
}

...

}

 而DbForum纔是接口Forum的真正實現,以修改論壇名稱爲例:

public class DbForum implements Forum, Cacheable {
...

public void setName(String name) throws ForumAlreadyExistsException {

  ....

  this.name = name;
  //這裏真正將新名稱保存到數據庫中 
  saveToDb();

  ....
}


... 

}

凡是涉及到對論壇名稱修改這一事件,其餘程序都首先得和ForumProxy打交道,由ForumProxy決定是否有權限作某同樣事情,ForumProxy是個名副其實的"網關","安全代理系統".

在平時應用中,無可避免總要涉及到系統的受權或安全體系,無論你有無心識的使用Proxy,實際你已經在使用Proxy了

相關文章
相關標籤/搜索