代理模式
引言
这一放假回家的火车票是真的不好买啊,只能花点钱借助于抢票软件了,嘿,别说还真好使,抢到票赶紧回家。
正文
代理模式就是出于某些原因,不能直接访问某个对象,需要提供一个代理来访问。这个代理就是充当访问对象和目标对象之间的中介。
核心思想
主要是通过定义一个继承抽象目标的代理来包含真实目标,从而实现对真实主题的访问
代码实现
讲解
//抽象目标
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服务
抢票公司在卖票...
总结
通过在目标对象和访问对象之间设置代理,从而可以更好的保护目标对象,还可以拓展目标对象的功能。同时由于将目标对象和访问对象之间相分离,在一定程度上降低了耦合。
此外,从文中可以看出在代理类中包含了对真实目标的引用,那么在之后如果想要增加新的目标,可能还要增加新的代理,那么这种情况可以使用动态代理来解决,具体不再赘述。