代理模式

代理模式

里氏替換原則:子類型必須能夠替換掉他們的父類型。

核心

為其他對象提供一種代理,以控制對這個對象的訪問。

好處

在直接訪問對象時帶來的問題,比如說:要訪問的對象在遠程的機器上。在面向對象系統中,有些對象由于某些原因(比如對象創建開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問),直接訪問會給使用者或者系統結構帶來很多麻煩,我們可以在訪問此對象時加上一個對此對象的訪問層。

例子

情景是:A追求李嬌嬌,但不認識,通過認識她的B來送禮物。B是代理,代替A完成送禮物的事情。(實現送禮物接口)

UML圖
UML圖
//被追求者類
class SchoolGirl
{
    public string Name { get; set; }
         
}

//代理接口(送禮物)
interface GiveGift
{
    void GiveDolls();
    void GiveFlowers();
    void GiveChocolate();
}

 //追求者類
class Pursuit : GiveGift
{
    SchoolGirl mm;

    public Pursuit(SchoolGirl mm)
    {
        this.mm = mm;
    }

    public void GiveDolls()
    {
        Console.WriteLine(mm.Name + "! 送你洋娃娃");
    }
    public void GiveFlowers()
    {
        Console.WriteLine(mm.Name + "! 送你花");
    }
    public void GiveChocolate()
    {
        Console.WriteLine(mm.Name + "! 送你巧克力");
    }
}

  //代理類
class Proxy : GiveGift
{
    private Pursuit gg;

    public Proxy(SchoolGirl mm)
    {
        gg = new Pursuit(mm);
    }

    public void GiveDolls()
    {
        gg.GiveDolls();
    }
    public void GiveFlowers()
    {
        gg.GiveFlowers();
    }
    public void GiveChocolate()
    {
        gg.GiveChocolate();
    }

}

//客戶端
class Program
{
    static void Main(string[] args)
    {
        SchoolGirl jiaojiao = new SchoolGirl();
        jiaojiao.Name = "李嬌嬌";

        Proxy daili = new Proxy(jiaojiao);

        daili.GiveDolls();
        daili.GiveFlowers();
        daili.GiveChocolate();

        Console.Read();
    }
}    

例子來源:Linux公社《大話設計模式》
實例代碼在我的代碼托管上
代理模式

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容