静态代理模式
概念
代理模式(proxy pattern) :由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
一句话概括就是:为其他对象提供一种代理以控制对这个对象的访问。
- 其他对象:目标对象,想要访问的对象,常被称为被委托对象或被代理对象。
- 提供一种代理:这里"一种"两个字比较重要,为什么不是提供一个呢?一种代表了某一类,即代理类和被代理类必须实现同一接口,这个接口下的所有实现类都能被代理访问到,其实只是单纯的为了实现代理访问功能,代理类不实现任何接口也能完成,不过针对于面向接口的编程,这种方式更易于维护和扩展,代理类实现接口,不管目标对象怎么改或改成谁,代理类不需要任何修改,而且任何目标对象能使用的地方都能用代理去替换。
- 通过代理访问目标对象:代理类需要持有目标对象的引用,这样用户可以通过代理类访问目标对象,实现了用户与目标对象的解耦。
- 访问:访问二字说明代理对象的目的是访问被代理类,业务逻辑的具体执行与其无关,由被代理对象完成。
- 为什么要通过代理来访问:设计模式都是为了解决某一类的问题,可能目标对象不想让该用户访问或者是该用户无法访问到目标对象,这样就需要一个第三者来建立他们的联系,如代理服务器情景,被访问的服务器设置防火墙过滤掉某些地址的访问,这时用户就可以通过一个代理服务器来访问目标,使得目标服务器不用对外暴露细节,用户也能访问到想访问的数据。
- 代理类功能增强:代理对象能直接访问到目标对象,这样它就能在调用目标对象的某个方法之前做一个预处理,在调用方法之后进行一些结尾工作,这样就对目标对象的方法进行了增强。但是我们不能说代理模式提供对象功能的增强,它的设计初衷是对代理对象施加控制,只是这种设计思路能达到功能增强的目的。
角色
代理模式的主要角色有:
- 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
- 真实主题(RealSubject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是我们最终要引用的对象。
- 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问或控制或扩展真实主题的功能。
示例
interface Network {
public void brouse();
}
class RealNetwork implements Network{
@Override
public void brouse() {
// TODO Auto-generated method stub
System.out.println("正在浏览...");
}
}
class Proxy implements Network {
private Network network;
public Proxy(Network network) {
this.network = network;
}
public void check() {
System.out.println("检查用户是否合法");
}
@Override
public void brouse() {
this.check();
// TODO Auto-generated method stub
this.network.brouse();
}
}
public class TestDemo {
public static void main(String[] args) {
Network net = null;
net = new Proxy(new RealNetwork());
net.brouse();
}
}
代理模式的总结
优点:
- 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
- 代理对象可以扩展目标对象的功能;
- 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度。
缺点:
- 在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢;
- 增加了系统的复杂度。
本博客是对 该博客 的学习。