设计模式-代理模式

114 阅读1分钟

代理模式

引言

这一放假回家的火车票是真的不好买啊,只能花点钱借助于抢票软件了,嘿,别说还真好使,抢到票赶紧回家。

正文

代理模式就是出于某些原因,不能直接访问某个对象,需要提供一个代理来访问。这个代理就是充当访问对象和目标对象之间的中介。

核心思想

主要是通过定义一个继承抽象目标的代理来包含真实目标,从而实现对真实主题的访问

代码实现

讲解

//抽象目标
public interface Subject {
    void request();
}
public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("访问了真实主题");
    }
}
public class Proxy implements Subject {

    private RealSubject realSubject;

    @Override
    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        additionalMethod();
        realSubject.request();
    }

    public void additionalMethod() {
        System.out.println("拓展功能");
    }

}

实例

public interface SellTicket {
    void sellTicket();
}
public class GrabTicketCompany implements SellTicket {
    @Override
    public void sellTicket() {
        System.out.println("抢票公司在卖票...");
    }
}
public class GrabTicketProxy implements SellTicket {

    private GrabTicketCompany grabTicketCompany;

    @Override
    public void sellTicket() {
        if (grabTicketCompany == null) {
            grabTicketCompany = new GrabTicketCompany();
        }
        vipService();
        grabTicketCompany.sellTicket();
    }

    private void vipService() {
        System.out.println("提供额外的vip服务");
    }
    
}
public class Main {
    public static void main(String[] args) {
        GrabTicketProxy ticketProxy = new GrabTicketProxy();
        ticketProxy.sellTicket();
    }
}

输出结果

提供额外的vip服务
抢票公司在卖票...

总结

通过在目标对象和访问对象之间设置代理,从而可以更好的保护目标对象,还可以拓展目标对象的功能。同时由于将目标对象和访问对象之间相分离,在一定程度上降低了耦合。

此外,从文中可以看出在代理类中包含了对真实目标的引用,那么在之后如果想要增加新的目标,可能还要增加新的代理,那么这种情况可以使用动态代理来解决,具体不再赘述。