本學期十五週快完了,大物考試,一步步逼近,臨時抱佛腳中啊。上半學期的計算機科學基礎考的太差,不過也對這種雙語課程的開課模式不太認同,學校課程開設上連續性不大,讓學生普遍迷茫,也更讓我認識到學習技術還真得靠自學啊~誒,不扯多了,今天要學習的是代理模式,週末準備暫停學習新模式,複習學習的四個模式,每個模式再實踐一下,畢竟寫代碼的能力還是太差
代理模式(Proxy Pattern)
定義:爲其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
代理模式由三個角色組成:
1.虛擬角色類:通過接口或虛擬類聲明真實角色中的業務方法
2.代理角色類:實現抽象角色,是真實角色的代理,通過真實角色的業務邏輯方法來實現抽象方法,並可以附加自己的操作。
3.真實角色類:實現抽象角色,定義真實角色所要實現的業務邏輯,供代理角色調用。
類圖:
現實生活中,代購、通過代理去上臉書、推特,通過經銷商買東西都可以看作是代理模式。而代理模式的應用非常多,比如下面這些:
(1) 遠程代理(Remote Proxy):爲一個位於不同的地址空間的對象提供一個本地的代理對象,這個不同的地址空間可以是在同一臺主機中,也可是在另一臺主機中,遠程代理又稱爲大使(Ambassador)。
(2) 虛擬代理(Virtual Proxy):如果需要創建一個資源消耗較大的對象,先創建一個消耗相對較小的對象來表示,真實對象只在需要時纔會被真正創建。
(3) 保護代理(Protect Proxy):控制對一個對象的訪問,可以給不同的用戶提供不同級別的使用權限。
(4)
緩衝代理(Cache Proxy):爲某一個目標操作的結果提供臨時的存儲空間,以便多個客戶端可以共享這些結果。
(5) 智能引用代理(Smart Reference Proxy):當一個對象被引用時,提供一些額外的操作,例如將對象被調用的次數記錄下來等。
(以上其實不是好理解.......)
這裏需要使用的是以上應用中的保護代理。代理類可以對用戶訪問權限進行控制,因此有些用戶無法調動真實業務類的某些方法,當用戶權限改變之後,則可以訪問這些方法。
實現代碼:
AbstractPermission.cs
abstract class AbstractPermission
{
public abstract void modifyUserInfo();
public abstract void viewNote();
public abstract void publishiNote();
public abstract void modifyNote();
public abstract void setLevel(int level);
}
RealPermission.cs
class RealPermission : AbstractPermission
{
public override void modifyUserInfo()
{
Console.WriteLine("修改個人信息");
}
public override void viewNote()
{
}
public override void modifyNote()
{
Console.WriteLine("修改發貼內容!");
}
public override void publishiNote()
{
Console.WriteLine("發佈新貼!");
}
public override void setLevel(int level)
{
}
}
PermissionProxy.cs
class PermissionProxy : AbstractPermission
{
private RealPermission permission = new RealPermission();
private int level = 0;
public override void modifyUserInfo()
{
if (level == 0)
{
Console.WriteLine("對不起,你沒有權限修改個人信息!");
}
else if (level == 1)
{
permission.modifyUserInfo();
}
}
public override void viewNote()
{
Console.WriteLine("查看帖子!");
}
public override void publishiNote()
{
if (level == 0)
{
Console.WriteLine("對不起,你沒有權限發佈新貼!");
}
else if (level == 1)
{
permission.publishiNote();
}
}
public override void modifyNote()
{
if (level == 0)
{
Console.WriteLine("對不起,你沒有權限修改帖子內容!");
}
else if (level == 1)
{
permission.modifyNote();
}
}
public override void setLevel(int level)
{
this.level = level;
}
}
Program.cs
class Program
{
static void Main(string[] args)
{
PermissionProxy proxy = new PermissionProxy();
proxy.viewNote();
proxy.publishiNote();
proxy.modifyNote();
proxy.modifyUserInfo();
Console.WriteLine("-----------------------------------------");
proxy.setLevel(1);
proxy.viewNote();
proxy.publishiNote();
proxy.modifyNote();
proxy.modifyUserInfo();
Console.ReadKey();
}
}
代理模式在一定程度上降低了系統的耦合度,但由於在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。實現代理模式需要額外的工作,有些代理模式的實現非常複雜。