老王讲设计模式(二)代理模式

2018/08/08  |  from IT路  |  by 我是真老王  |  浏览 36

代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

有一天早上,小蔡突然跑到老王面前,满脸困惑的问:“老王,我的网络好像有问题,好多著名网站都访问不了,你能帮我看看吗?”

老王问:“你访问不了什么网站了?那简书能访问吗?”

小蔡说:“访问简书没问题,但是我访问不了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 的多态,代理类负责接活,被代理类负责干活。这里也附上一个图来说明一下。”


代理模式

小蔡依然闷着没说话………………………………………………

老王问:“小蔡,你怎么了?好想看上去不高兴的样子~”


小蔡暴走

小蔡发怒到:“老王!我只是想访问那些网站而已,可是你到现在都没教我如何使用代理!!!”


跪榴莲

老王赶紧抱歉道:“对不住,对不住,妹纸,走,哥这就叫你如何用代理,手把手的教都可以,教一晚上都可以。别气了,别气了。”

小蔡扭头甩下一句:“这还差不多。”