代理模式:提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.
其中有动态代理和静态代理,这里我们主要学习静态代理;
主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
像我们如果要访问一些国外的网站就需要购买代理,这就是说我们把我们要访问给他代理服务器,有他转发给国外的服务器,然后再将返回的响应内容转发回我们电脑;
这里我们看到代理类和真实类都实现于同一个接口,这也就保证了代理类具有与真实类相同的对外接口,就像代理服务器与真实服务器一样,在我们用户看来,他们都是实现我们访问获取数据的需求;
代理类中包含一个真实类的对象,可以保证代理类去访问真实类中的功能,从而实现代理功能;
当然我们可以在代理类中加入一些附加的功能,就好像公司的代理服务器加入了一些屏蔽功能来保证公司网络的安全
下面看一下代码:
ISubject 接口:
public interface ISubject {
String visit(String url);
}
RealServer 类:
public class RealServer implements ISubject{
@Override
public String visit(String url) {
return url + "响应内容";
}
}
ProxyServer 类:
public class ProxyServer implements ISubject{
private RealServer realServer = new RealServer();
@Override
public String visit(String url) {
String response = "";
if(url.equals("www.taobao.com")) {
response += "404 not found";
} else {
response = response + realServer.visit(url);
}
return response;
}
}
Cilent 类:
import org.junit.Assert;
import org.junit.Test;
public class Client {
@Test
public void proxyTest() {
ISubject server = new ProxyServer();
String response = server.visit("www.taobao.com");
Assert.assertEquals("404 not found", response);
response = server.visit("www.baidu.com");
Assert.assertEquals("www.baidu.com响应内容", response);
}
}
这样我们通过实现一个简单的代理服务器模拟程序来看一下代理模式,并在代理类中加入了淘宝的屏蔽,这样就能避免员工在上班时间使用淘宝进行购物;手动滑稽…..可见客户端只要知道代理类就可以访问实际的功能类,得到想要的记过,另外代理类还可以对实际类进行加工和补充