代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
有一天早上,小蔡突然跑到老王面前,满脸困惑的问:“老王,我的网络好像有问题,好多著名网站都访问不了,你能帮我看看吗?”
老王问:“你访问不了什么网站了?那简书能访问吗?”
小蔡说:“访问简书没问题,但是我访问不了Google,Youtube,Facebook和Twitter。”
老王当时的表情老王满脸黑线,用很低沉无力的声音说:“你说的这些网站,由于某些不可说的原因,的确是访问不到。除非你使用VPN翻墙出去看。”
小蔡瞪大了双眼小蔡两眼瞪得大大的:“什么是VPN,为什么访问不到???他们都是知名网站啊~~~Google是全球最大的搜索引擎,比百度好用一万倍。Youtube是全球最大的视频网站,比爱奇艺好用一万倍。Facebook是全球最大社交网站,就连人人网都是抄它的。Twitter是全球最大的微博网站,新浪微博都是抄的。为什么这些全球第一的网站都访问不了呢?”
回避!全部回避!老王低声说:“嘘~~~由于某些不可说的原因,其实我们用的是大中华局域网,如果你真想访问你说的那些网站,你就使用代理服务器去访问吧。”
小蔡接着问:“代理服务器是个什么鬼?怎么用?为什么用代理服务器就能访问那些网站了呢?”
老王清了清嗓子:“正好我准备分享代理模式,那么我就从技术的角度给你讲讲代理服务器吧。其实代理服务器就是使用的代理模式。”
小蔡闷着没说话……
老王接着说:“代理模式需要先定义一个接口,比如代理服务器是用于访问网站的,我们就需要定义出网站是个什么样子。”
//网站
public interface Website {
//网站都可以显示内容
void showContent();
}
小蔡闷着没说话…………
老王接着说:“接下来我们看看如何定义Google和Youtube,Google和Youtube都是网站,所以它们需要实现这个接口。”
//Google
public class Google implements Website {
//Google的内容
@Override
public void showContent() {
System.out.println("这是世界上最大流行的搜索引擎");
}
}
//Youtube
public class Youtube implements Website {
//Youtube的内容
@Override
public void showContent() {
System.out.println("这是世界上最大流行的视频网站");
}
}
小蔡闷着没说话………………
老王接着说:“这时候网站定义好了,我们再来定义这个代理服务器,代理服务器其实也是网站,我们把他作为跳板去访问其他网站,以前我用过一个很好用的代理服务器,叫做红杏,不过现在已经被封了。红杏的工作方式如下:”
//红杏,代理者
public class Hongxin implements Website {
//被代理的对象
private Website website;
//只要是网站,都可以代理
public Hongxin(Website website){
this.website = website;
}
//执行被代理对象的方法
@Override
public void showContent() {
this.website.showContent();
}
}
小蔡继续闷着没说话……………………
老王接着说:“这时候一个访客来访问网站了。他通过红杏先去访问Google,然后再去访问Youtube。”
//访客
public class Visitor {
public static void main(String[] args) {
//使用红杏访问Google
Hongxin hongxin = new Hongxin(new Google());
hongxin.showContent();
//使用红杏访问Youtube
hongxin = new Hongxin(new Youtube());
hongxin.showContent();
}
}
小蔡还是闷着没说话…………………………(看得出小蔡有点不高兴的样子,但是老王没察觉)
老王接着说:“通过这个例子,我们可以发现,虽然我们是在调用hongxin
这个对象的方法,但实际上,hongxin
在内部是调用的Google和Youtube的方法。这就是代理模式。我们见不到真正的对象,我们只面对代理。”
小蔡还是闷着没说话………………………………(看得出小蔡很生气,快要发飙了的样子,但是老王没察觉,反而越说越兴奋)
老王接着说:“我最后总结一下,代理模式里有3个角色:1.一个抽象出来的接口。2. 作为代理的对象。3. 真实的对象,即被代理的对象。代理模式主要使用了 Java 的多态,代理类负责接活,被代理类负责干活。这里也附上一个图来说明一下。”
代理模式小蔡依然闷着没说话………………………………………………
老王问:“小蔡,你怎么了?好想看上去不高兴的样子~”
小蔡暴走小蔡发怒到:“老王!我只是想访问那些网站而已,可是你到现在都没教我如何使用代理!!!”
跪榴莲老王赶紧抱歉道:“对不住,对不住,妹纸,走,哥这就叫你如何用代理,手把手的教都可以,教一晚上都可以。别气了,别气了。”
小蔡扭头甩下一句:“这还差不多。”
老王/小蔡求打赏