2012.12.16 學習日記-代理模式

本學期十五週快完了,大物考試,一步步逼近,臨時抱佛腳中啊。上半學期的計算機科學基礎考的太差,不過也對這種雙語課程的開課模式不太認同,學校課程開設上連續性不大,讓學生普遍迷茫,也更讓我認識到學習技術還真得靠自學啊~誒,不扯多了,今天要學習的是代理模式,週末準備暫停學習新模式,複習學習的四個模式,每個模式再實踐一下,畢竟寫代碼的能力還是太差委屈委屈


代理模式(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();
        }
    }

代理模式在一定程度上降低了系統的耦合度,由於在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。實現代理模式需要額外的工作,有些代理模式的實現非常複雜。
發佈了36 篇原創文章 · 獲贊 2 · 訪問量 9987
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章