2018年12月27日 12:50
原创作品,转载时请务必以超链接形式标明文章原始出处,否则将追究法律责任。

什么是代理模式,顾名思义,就是作为你的代理去帮你办事。比如打官司,卖房,律师和售楼部销售顾问就是你的代理,他们帮你打官司办购房手续。

今天我们就以买车作为案例,首先买车的人角色有很多种,有大老板,有程序员。一个是全款,一个是首付。假设这两个人是不直接和银行进行交互的,只是通过销售人员买车。

首先我们定义一下买车人的接口,每个购车人都有一个行为叫买车

internal interface 购车人
{
    void 买车();
}

现在定义一个老板,一个程序员

internal class 老板 : 购车人
{
    public void 买车()
    {
        Console.WriteLine("老板:提供证件,交全款");
    }
}

internal class 程序员 : 购车人
{
    public void 买车()
    {
        Console.WriteLine("程序员:提供证件,交首付");
    }
}

老板还是富有,假设买的迈腾,老板一把付,程序员交10万首付。

接下来我们定义代理类

internal class 老板四S店代理
{
    购车人 老板;
    public 老板四S店代理()
    {
        老板 = new 老板();
    }

    public void 买车()
    {
        老板.买车();
        Console.WriteLine("老板,直接提车,开走");
    }
}

internal class 程序员四S店代理
{
    购车人 程序员;
    public 程序员四S店代理()
    {
        程序员 = new 程序员();
    }

    public void 买车()
    {
        程序员.买车();
        Console.WriteLine("程序员,等待发放贷款");
    }
}

一种是代理老板的,一种是代理程序员的。大家发现这个模式和装饰模式有点像,但是不一样的是从外部我们无法得知老板四s店代理类到底代理的是谁,而装饰模式的装饰对象我们是需要提前知道的。其实这里隐藏了真实代理对象,所以也是这个模式存在的意义。另外,我们还可以在代理类中加入一些其他方法。比如洗车,擦车,验车,交车这些步骤,交给代理类去实现,被代理只负责交钱交手续。

我们来执行一下,让代理给我们办事,看一下效果

老板四S店代理 老板代理 = new 老板四S店代理();
老板代理.买车();

程序员四S店代理 程序员代理 = new 程序员四S店代理();
程序员代理.买车();

输出如下,

老板:提供证件,交全款
老板,直接提车,开走
程序员:提供证件,交首付
程序员,等待发放贷款

这个是静态代理,也就是说代理类已经决定了代理对象。下来我们看一下动态代理

internal class 四S店动态代理<T> where T : 购车人
{
    T 购车人;
    public 四S店动态代理()
    {
        购车人 = (T)Activator.CreateInstance(typeof(T));
    }

    public void 买车()
    {
        购车人.买车();
    }
}

其实很简单,根据泛型类型,动态创建代理,只要是实现了购车人接口的,我们都能生成代理。

四S店动态代理<老板> 老板动态代理 = new 四S店动态代理<老板>();
老板动态代理.买车();

四S店动态代理<程序员> 程序员动态代理 = new 四S店动态代理<程序员>();
程序员动态代理.买车();

运行效果如下

老板:提供证件,交全款
程序员:提供证件,交首付
发表评论
匿名  
用户评论
暂无评论