24

抽丝剥茧——调停者和门面设计模式

 3 years ago
source link: https://segmentfault.com/a/1190000037756273
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

调停者和门面设计模式

今天我们来聊两个设计模式:调停者设计模式和门面设计模式,为什么要将他们放在一起讲解,因为他们两个东东太像了,仅仅是由于作用的地方不同而产生的不同的叫法。

我们用一个对于我们90后最难的一个问题来入手吧。假设我们厌倦了城市生活,想要找一个安静的地方安家,养猪,顺便写一个猪脸识别来分类管理这些猪(梦想中的生活)。而在做这些事情的前提,我们必须建造一个房子和一个猪圈。

我们来看一下我们以前会怎么做。

jiI3MbZ.png!mobile

盖房子需要工人,砖头,水泥等等,我们需要一个一个联系所需要的人。但我这么聪明当然不会这么干了,所以我找了一个人来帮我完成这些事情,于是就成为了这样的流程。

RZv6jqb.png!mobile

我找了一个包工头,代理商帮我去完成这些事情。这个流程就是一个完整的门面模式。是不是感觉和代理模式有点像,帮我做事情。其实吧设计模式到最后就殊途同归了,正所谓,太极剑法,学多少忘多少,最后记得的只是太极剑。

我们回到编程领域,我们来看一下门面模式具体的类图实现

vqUJrqf.png!mobile

那接下来我们来看一下调停者设计模式。

它和门面模式最大的区别就是门面模式是挡在外层的,而它是在所有服务中间的。我们来看一下它的原理图。

NJVZBfe.png!mobile

我们再来看一下它的类图实现

7bYbyyb.png!mobile

发现了没,两个模式的类图实现几乎相同,所以他们的代码实现也几乎相同。

了解了他们的原理以后,我们来聊聊他们在实际代码中的应用。

门面模式:服务器部署时的网关,将所有的请求拦截,具体的方法转发由网关决定

调停者模式:协调中间件,微服务中将所有的服务注册到类似于 zookeeper 的协调中间件中,通过中间件访问其他服务;消息中间件,需要什么消息通过消息中间件进行获取。

对于一些比较老的项目,门面模式和调停者模式的调度中心很有可能是一个,如通过 Nginx 管理服务。

我们来看一下具体的代码实现吧。

门面模式代码实现(角色组成)

  • 子系统
 ​
 class Cement{
  void cement(){
  System.out.println("水泥");
  }
 }
 ​
 class Worker{
  void worker(){
  System.out.println("工人");
  }
 }
 ​
 class Brick{
  void brick(){
  System.out.println("砖头");
  }
 }
  • 门面
 class Contractor{
  private Cement cement = new Cement();
  private Worker worker = new Worker();
  private Brick brick = new Brick();
 ​
  void cement(){
  cement.cement();
  }
 ​
  void worker(){
  worker.worker();
  }
 ​
  void brick(){
  brick.brick();
  }
 }

调停者模式的代码实现和门面模式几乎相同。两者只是因为应对与不同的位置而诞生,本质相同。

更多原创文章请关注公众号@MakerStack


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK