前言
今天继续谈谈设计模式中的一种——外观模式。
正文
概念
外观模式属于结构型模式的一种,它向客户端提供了一个可访问的接口,来隐藏复杂的逻辑。即将某些接口进行整合,然后提供一个接口访问这些子接口,简化客户端的访问的复杂性,并且隐藏内部子系统。
这么说可能不够清楚,举个例子:
假设我开发了10个接口实现了不同功能,但是同学Q要实现业务A,那么它必须得先调用接口1,再调用3,得把接口进行整合;另一个同学W要实现业务B,那要先调用接口3,然后调用接口5,以后有很多业务都要调用接口的话都需要十分复杂的代码。
那怎么办?重构代码呗。最容易想到的就是我自己实现业务接口,比如我实现一个接口A,就是把原来的接口1和接口5整合进来,实现接口B,就是整合接口3和接口5。
原本基础功能分为10个接口,本身符合单一职责原则。但是发现没有,两个接口中都用到了接口3的代码,强行合并底层代码,却失去了代码的可重用性。
那这时候就需要外观模式了,在调用方与底层接口之前增加中间层,中间层提供业务接口,来供客户端调用,即在底层接口不变的情况下,中间层组合了底层接口方便上一层进行调用。
这就是外观模式。
实现
我们来简单写一个demo。
就拿上面那个例子来说。我们先实现3个底层接口,分别是1,3,5.
1 | public class CoreSystem1 { |
接着我们创建Facade类,即外观模式中的中间层,来将底层功能整合。
1 | public class Facade { |
最后我们创建一个客户端,调用试试。
1 | public class Client { |
优缺点
外观模式可以减少系统之间的相互依赖,提高灵活性,并且隐藏了底层接口调用逻辑,一定程度上提高了安全性。而缺点在于如果底层改变了,那修改就会很麻烦。 但本身就是整合”祖传代码”,也说不上麻不麻烦。
代理模式VS外观模式VS中介者模式
前面也讲过这几个模式,这几个模式是有相似点的,这里就统一说一下。
这三个模式都是通过增加中间层,来让客户端调用,隐藏内部逻辑。
其次代理模式和外观模式属于结构型模式,而中介者模式属于行为型模式。
首先先说代理模式,代理模式是使用代理类去代表另一个类的功能,不改变被代理类的功能。
其次是外观模式,它提供的是一个高层次的接口,整合低层次的接口,使得客户端更容易调用。即对外提供访问底层接口的接口。
最后是中介者模式,这个模式将多对多的关系,转换为一对多的关系,使用一个中介对象来封装一系列类似对象的行为。
个人理解,代理模式强调的是一对一的关系,即代理类是原类的一个替身。
外观模式对内整合接口,一对多,对外提供一个访问的接口,一对一。
中介者模式则将原本多对多转化为一对多。
外观模式与中介者模式都能减少原来类与类之间的耦合。对原有系统进行封装,使得外部更容易调用。
总结
本文聊了聊外观模式,并讲了代理模式,外观模式,中介者模式三者的不同点。当然,以上仅是个人理解,如有错误希望指出。