共计 3151 个字符,预计需要花费 8 分钟才能阅读完成。
详解代理模式的根本构造和原理
代理模式是一种罕用的设计模式,它为其余对象提供了一个代理,以管制对这个对象的拜访。代理模式能够用来 限度拜访、实现近程拜访、提早加载
等性能。在本文中,咱们将具体介绍代理模式的根本构造和原理,并通过一个例子来阐明代理模式的利用。
根本构造
代理模式由三局部组成:形象主题(Subject
)、实在主题(RealSubject
)和代理(Proxy
)。形象主题定义了实在主题和代理的公共接口,实在主题是被代理的对象,代理对象与实在主题实现雷同的接口,以便于代理对象能够代替实在主题,而代理则负责管制对实在主题的拜访。
在代理模式中,客户端不间接拜访实在主题,而是通过代理来拜访实在主题。代理在实现客户申请之前,能够进行一些预处理操作,比方 记录日志、验证权限
等。代理还能够在拜访实在主题前后进行一些操作,比方 缓存数据、提早加载
等。
原理解析
代理模式的原理非常简单。客户端通过代理来拜访实在主题,代理先进行一些预处理操作,而后将申请传递给实在主题。实在主题实现申请后,将后果返回给代理。
代理再将后果返回给客户端。代理模式能够用来实现各种性能,比方 限度拜访、近程拜访、提早加载
等。上面咱们将别离介绍这些利用场景。
限度拜访
代理模式能够用来限度拜访。在这种状况下,代理会对客户申请进行验证,以确保只有具备特定权限的用户能力拜访实在主题。例如,一个网站可能会应用代理来限度对某些页面的拜访,只有登录用户能力拜访这些页面。
上面是一个示例程序:
public interface Subject {void request();
}
public class RealSubject implements Subject {public void request() {System.out.println("RealSubject.request()");
}
}
public class Proxy implements Subject {
private Subject realSubject;
private String password;
public Proxy(String password) {
this.password = password;
this.realSubject = new RealSubject();}
public void request() {if (password.equals("secret")) {realSubject.request();
} else {System.out.println("Access denied");
}
}
}
public class Client {public static void main(String[] args) {Subject subject = new Proxy("secret");
subject.request(); // RealSubject.request()
Subject subject2 = new Proxy("wrong password");
subject2.request(); // Access denied}
}
在这个例子中,咱们定义了一个形象主题接口 Subject
和一个实在主题类 RealSubject
。而后咱们定义了一个代理类 Proxy
,并在构造函数中传入一个明码参数。当客户端调用 request()
办法时,代理会先查看明码是否正确,而后将申请转发给实在主题。如果明码不正确,代理会回绝拜访。
近程拜访
代理模式能够用来实现近程拜访。在这种状况下,代理对象充当客户端和近程对象之间的中介,客户端只须要晓得代理对象的接口,就能够通过代理对象拜访近程对象。例如,一个应用程序可能须要从另一个应用程序中获取数据,此时能够应用代理模式来进行近程拜访。
上面是一个示例程序:
public interface Subject {void request();
}
public class RemoteSubject implements Subject {public void request() {System.out.println("RemoteSubject.request()");
}
}
public class Proxy implements Subject {
private Subject remoteSubject;
public Proxy() {this.remoteSubject = new RemoteSubject();
}
public void request() {System.out.println("Proxy.request()");
remoteSubject.request();}
}
public class Client {public static void main(String[] args) {Subject subject = new Proxy();
subject.request(); // Proxy.request() RemoteSubject.request()}
}
在这个例子中,咱们定义了一个形象主题接口 Subject
和一个近程主题类 RemoteSubject
。而后咱们定义了一个代理类 Proxy
,并在构造函数中创立一个近程主题对象。当客户端调用 request()
办法时,代理会先输入一条日志,而后将申请转发给近程主题。
提早加载
代理模式还能够用来实现提早加载。在这种状况下,代理对象会在第一次拜访实在主题时才进行初始化,从而防止在程序启动时就加载所有的资源。例如,一个应用程序可能须要加载大量的图片,如果在程序启动时就加载所有的图片,会导致程序变得十分迟缓。此时能够应用代理模式来实现提早加载。
上面是一个示例程序:
public interface Subject {void request();
}
public class RealSubject implements Subject {public RealSubject() {System.out.println("RealSubject initialized");
}
public void request() {System.out.println("RealSubject.request()");
}
}
public class Proxy implements Subject {
private Subject realSubject;
public Proxy() {}
public void request() {if (realSubject == null) {realSubject = new RealSubject();
}
realSubject.request();}
}
public class Client {public static void main(String[] args) {Subject subject = new Proxy();
subject.request(); // RealSubject initialized RealSubject.request()
subject.request(); // RealSubject.request()
}
}
在这个例子中,咱们定义了一个形象主题接口 Subject
和一个实在主题类 RealSubject
。而后咱们定义了一个代理类 Proxy
,并在 request()
办法中进行提早加载。当客户端第一次调用 request()
办法时,代理会创立一个实在主题对象并进行初始化操作。当客户端再次调用 request()
办法时,代理会间接调用实在主题的办法。
总结
代理模式是一种罕用的设计模式,它为其余对象提供了一个代理,以管制对这个对象的拜访。代理模式能够用来 限度拜访、实现近程拜访、提早加载
等性能。在本文中,咱们介绍了代理模式的根本构造和原理,并通过三个例子来阐明代理模式的利用。心愿读者可能对代理模式有更深刻的理解。