设计模式之代理模式

2022-03-29 10:05:34 浏览数 (1)

这节讲代理模式(Proxy Pattern)。

代理模式就是将两个类的直接耦合变为间接耦合,通过一个代理类做两个类的桥梁,这种模式既是对对象的代理,又能通过代理类实现被代理对象的扩展,就像我们买火车票可以不用去车站,可以直接在网上或者12306上买,这种购票第三方就是一种代理。并且可以扩展一些相关服务,如目的地酒店预订等等。

下面来看一下代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象就作为访问对象和目标对象之间的中介。

代理模式可以在客户端与目标对象之间起到一个中介作用和保护目标对象的作用,将客户端与目标对象分离,同时可以扩展目标对象的功能。代理模式能在一定程度上降低系统的耦合度,增加了程序的可扩展性。

但是,它当然也有缺点,因为代理类的出现,无疑是增加了系统的复杂度,并且这种间接的对象关系,也存在访问时间上的消耗。因此在一些高性能的场景下,我们一般配合反射技术实现动态代理,以减少类的复杂度,动态代理就是在运行中生成代理对象。

下面看一个完整的代理模式演示:

代码语言:javascript复制
class Program
{
    static void Main (string[] args)
    {
        ITicketService ts = new TicketProxy ();
        ts.BuyTicket ();
    }
}

//代理意图
interface ITicketService
{
    void BuyTicket ();
}

//被代理对象
class TrainStation : ITicketService
{
    public void BuyTicket ()
    {
        Console.WriteLine ("购买了一张票。");
    }
}

//代理对象
class TicketProxy:ITicketService
{
    private ITicketService ts = null;

    public void BuyTicket ()
    {
        if (ts == null)
            ts = new TrainStation ();
        //在执行真正的服务之前,可以扩展一些服务
        PreferentialService ();
        ts.BuyTicket ();
        //在执行服务之后,也可以进行扩展
        TravelService ();
    }

    //旅行服务
    private void TravelService ()
    {
        Console.WriteLine ("是否需要旅行服务");
    }

    //购票优惠服务
    private void PreferentialService ()
    {
        Console.WriteLine ("是否有购票优惠");
    }
}

代理对象和被代理对象继承同一个接口,除此之外,代理对象还定义一些第三方服务,这样代理对象就具有被代理对象的能力,以及扩展的能力。

本节到此结束...

0 人点赞