资料来源:<<大话设计模式>>

1. 没有代理的代码

图1

class Program
{
    static void Main(string[] args)
    {
        SchoolGirl jiaojiao = new SchoolGirl();
        jiaojiao.Name = "李娇娇";

        Pursuit zhuojiayi = new Pursuit(jiaojiao); //不认识,有问题

        zhuojiayi.GiveDolls();
        zhuojiayi.GiveFlowers();
        zhuojiayi.GiveChocolate();


        Console.Read();
    }
}

//追求者
class Pursuit
{
    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 SchoolGirl
{
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}

A: 这样写不就是等于他们直接互相认识,并且是卓本人亲自送东西给娇娇了吗?

2. 只有代理的代码

图2

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();
    }
}

//代理人
class Proxy
{
    SchoolGirl mm;
    public Proxy(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 + " 送你巧克力");
    }
}

A: 使得礼物是代理送的,而你刚才还肯定的说,卓这个人存在,你怎么能正确呢?
B: 事实上,应该是追求者通过代理送给被追求者礼物,这才是合理的,怎么办?
A: 不妨仔细观察下Pursuit和Proxy有没有相似的地方?
B: 他们都有送礼物的方法.哦,他们都实现了同样的接口?

3. 符合实际的代码

图3

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();
    }
}

//送礼物
interface GiveGift
{
    void GiveDolls();
    void GiveFlowers();
    void GiveChocolate();
}

class Proxy : GiveGift
{
    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 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 SchoolGirl
{
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}

B: 娇娇不认识追求她的人,但是却可以通过代理人得到礼物.

4. 代理模式

为其他对象提供一种代理以控制对这个对象的访问.

图4

class Program
{
    static void Main(string[] args)
    {
        Proxy proxy = new Proxy();
        proxy.Request();

        Console.Read();
    }
}

//定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSuject的地方都可以使用Proxy
abstract class Subject
{
    public abstract void Request();
}

//定义Proxy所代表的真实实体
class RealSubject : Subject
{
    public override void Request()
    {
        Console.WriteLine("真实的请求");
    }
}

//保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体
class Proxy : Subject
{
    RealSubject realSubject;
    public override void Request()
    {
        if (realSubject == null)
        {
            realSubject = new RealSubject();
        }

        realSubject.Request();
    }
}

5. 代理模式应用

B: 都用在哪些场合?
A: 1)远程代理,也就是为一个对象在不同的地址空间提供局部代表.这样可以隐藏一个对象存在与不同地址空间的事实.__2)虚拟代理,是根据需要创建开销很大的对象.通过它来存放实例化需要很长时间的真实对象.__3)安全代理,是用来控制真实对象访问时的权限.__4)智能代理,是指调用真实的对象时,代理处理另外一些事.如计算真实对象的引用次数.
A: 代理模式其实就是在访问对象时引入一定程度的间接性,因为这个间接性,可以附加多种用途.


yuanoung
10 声望1 粉丝

« 上一篇
装饰器模式
下一篇 »
工厂方法模式

引用和评论

0 条评论