设计模式 - 5) 代理模式

// 送礼物:红包、花、巧克力
public interface GiveGift
{
    void GiveDolls();
    void GiveFlowers();
    void GiveChocolate();
}

// 送礼物的人
public class Pursuit : GiveGift
{
    // 要送的对象
    SchoolGirl mm;        
    
    public Pursuit(SchoolGirl sg)
    {
        mm = sg;
    }

    public void GiveDolls()
    {
        Console.WriteLine(mm.Name + ", give you dolls");
    }

    public void GiveFlowers()
    {
        Console.WriteLine(mm.Name + ", give you flower");
    }

    public void GiveChocolate()
    {
        Console.WriteLine(mm.Name + ", give you chocolate");
    }
}
    
public class SchoolGirl
{
    public string Name { get; set; }
} 
    
// 代理送礼物
public class Proxy : GiveGift
{
    // 实际的送礼人
    public Pursuit pp;
    
    // 入参:要送的对象
    public Proxy(SchoolGirl sg)
    {
        pp = new Pursuit(sg);
    }
    
    public void GiveChocolate()
    {
        pp.GiveChocolate();
    }

    public void GiveDolls()
    {
        pp.GiveDolls();
    }

    public void GiveFlowers()
    {
        pp.GiveFlowers();
    }
}
    
业务代码:
SchoolGirl mm = new SchoolGirl() { Name = "na" };
Model.Proxy px = new Model.Proxy(mm);
px.GiveChocolate();
px.GiveDolls();
px.GiveFlowers();

本来是小刚要给小红送花、巧克力、假币,但是小刚有点害羞,让小方作为代理送给小红。
小刚和小方都继承自 GiveGift 接口,都有送礼物的功能
送者 关联 被送者对象,代理 关联 送者对象,代理和送者都接受一个入参:被送者对象,区别是代理接受被送者对象之后,生成关联被送者对象的送者。

适用代理:
graph LR 送者--送-->被送者
使用代理:
graph LR 送者--继承-->送礼 代理--继承-->送礼
sequenceDiagram 代理->>送者: 关联 代理->>送者: 调用 送者->>被送者: 送
posted @ 2020-12-15 23:13  鑫茂  阅读(90)  评论(0编辑  收藏  举报