Proxy代理模式(結構型模式)

一、問題html

在面向對象系統中,有些對象因爲某種緣由(好比建立對象的開銷很大,或者某些操做須要安全控制,或者須要進程外的訪問等),直接訪問會給調用者帶來麻煩,那麼如何在不損失接口透明性的狀況下,解決這些麻煩?安全

 

二、解決方案分佈式

經過架設一層中間層,讓這層中間層來解決上面的麻煩,也就是咱們所說的代理。大體的結構轉換圖以下:post

轉換成ui

將一個複雜的系統A,經過假設一層中間層C,將A中的複雜度處理掉,並經過C向B提供一種更靈活,知足B需求的方案.url

案例1、.Net中WebService技術提供了很好的借鑑.代碼以下:spa

        #region 基於.Net WebService的分佈式服務
        public interface IUser
        {
            void GetUser();


            void AddUser();

            void UpdateUser();

            void DeleteUser();
        }

        public class User : IUser
        {
            public void AddUser() { }

            public void DeleteUser() { }

            public void GetUser() { }

            public void UpdateUser() { }
        }
        #endregion


        #region 客戶端調用程序
        /// <summary>
        /// 該代理的類的做用是屏蔽分佈式通訊的細節(如協議的處理等),客戶端調用代碼則不須要關注這些細節
        /// 只須要關注業務
        /// </summary>
        public class UserProxy : IUser
        {
            public UserProxy()
            {
                //對對象建立的一種Soap封裝
            }

            public void GetUser()
            {
                //對對象訪問的一種Soap封裝
                //發送Soap數據,執行分佈式服務中的業務代碼
                //若是有返回值,接受返回值Soap數據,解包,轉換成C#代碼
            }

            public void AddUser() { }


            public void DeleteUser() { }

            public void UpdateUser() { }
        }

經過UserProxy類,該類將soap協議的相關處理完成,而後客戶端調用類就不須要關心soap協議的處理,只須要關心業務代碼以下調用便可,這就是代理類的做用.3d

 

案例2、StringBuilder的Copy-on-Wirte技術代理

                StringBuilder sbOne = new StringBuilder("Hello World");
                StringBuilder sbTwo = new StringBuilder("Hello World");
                StringBuilder sbThree = new StringBuilder("Hello World");

上面的代碼建立了3個StringBuilder類,因爲字符串的實例惟一性和字符串的不變性,關於字符串實例惟一性和字符串的不變性,參考字符、字符串和文本的處理之String類型,能夠得出下面的結構圖:code

3個StringBuilder實例都指向"Hello World"字符串實例,可是當其中一個StringBuilder執行了Replace方法,若是按照這個結構的話,當一個實例對字符串進行修修改操做,那麼其它兩個實例也會共享這個修改操做.但實際上,StringBuilder並非這樣操做的.由於StringBuilder表明的是可變字符串.因此當對StringBuilder實例進行修改對應的字符串也要發生改變,接下來看StringBuilder是如何使用Copy On Write技術對字符串實例進行修改的,代碼以下:

                StringBuilder sbOne = new StringBuilder("Hello World");
                StringBuilder sbTwo = new StringBuilder("Hello World");
                StringBuilder sbThree = new StringBuilder("Hello World");
                sbThree.Replace("Hello World", "小超");
                Console.WriteLine(sbThree);//輸出小超

根據輸出,發現同一個StringBuilder實例,能夠修改它的值,可是String字符串對象就不能修改.大體的結構圖以下:

這就是Copy On Write技術,而StringBuilder類就至關於一個代理類,它代理的是String類,讓原先沒法修改的字符串實例變得可修改,它就是可變字符串的代理類.

相關文章
相關標籤/搜索