外观模式是什么?为什么要使用外观模式?使用外观模式有什么好处?外观模式有什么特点?本篇博客就外观模式的原理以及最近的使用心得做个总结。
通俗的讲,外观模式就是给系统的一组接口提供一个统一的界面,它定义了一个接口,这个接口使得这个子系统更加容易使用。
为什么使用外观模式?那我最近的例子来讨论一下。来个包图说明一下系统层次结构。
可以清楚的看到,在U层和B层之间加了一个外观层,如果不加这层,会发生什么情况呢?我简单的画了个用例图来说明两层之间的调用关系。
由图片可以看出来,角色和用例之间关系过于复杂,如果需要修改一个用例,那么两个角色都需要修改,这在程序设计中是不予许的。怎么避免这种情况呢?这就是文章需要讨论的内容了--外观模式。
试想,如果我们在角色和用例之间加入某个东西,专门用来处理他们之间的复杂关系,然后角色和用例之间只有简单的关联关系,不就解决了这个问题吗。看接下来的用例图。
实际类图不是这样的,为了便于理解,类图简化成了用例图,此图没有实际意义,仅供参考。
可见,加了外观层以后,角色和用例之间没有直接联系,它们之间的耦合度降低了,系统维护都是在外观层进行,可维护性也提高了。
下面是外观层的类图结构:
由类图可知,外观层就是对子系统的方法的封装,它把每个过程需要使用的所有子系统的方法封装成了一个方法,然后由客户端调用。现实生活中有没有类似的例子呢?有!学校的一卡通其实就是一个外观模式的应用。我们每个学生每天需要去食堂买饭,去超市买东西,去澡堂洗澡,那么学生和学校的消费中心其实就是多对多的关系,现在有了一卡通,它将我们所有的交易过程封装到了一起,我们只需要使用一张卡即可在不同的地方消费。结构图如下:
一卡通的使用,为我们的生活带来了便利。现在假如学校不使用人民币了,使用美元来交易,那么我们不必亲自去银行换取美元使用,只需要更改一卡通即可,真是方便。可见,外观模式的使用,极大的降低了消费者和生产者之间的耦合度。
外观模式的适用范围:软件设计初期阶段,应该要有意识的将不同的两个层分离开,不同的层之间就可以建立外观层,可以使得层之间的耦合度大大降低,增加系统的可维护性。在开发阶段,如果子系统越来越复杂,我们可以使用外观来提供一个简单的接口,减少他们之间的依赖。在维护阶段,我们可以开发一个外观层接口,我们只需要使用外观层接口与新系统交互即可,可以减少很多不必要的麻烦。
总结:外观模式向外界提供了一个统一的接口,这一接口使得子系统更加容易使用。