Zer0e's Blog

设计模式之外观模式

字数统计: 1.1k阅读时长: 4 min
2020/08/16 Share

前言

今天继续谈谈设计模式中的一种——外观模式。

正文

概念

外观模式属于结构型模式的一种,它向客户端提供了一个可访问的接口,来隐藏复杂的逻辑。即将某些接口进行整合,然后提供一个接口访问这些子接口,简化客户端的访问的复杂性,并且隐藏内部子系统。
这么说可能不够清楚,举个例子:
假设我开发了10个接口实现了不同功能,但是同学Q要实现业务A,那么它必须得先调用接口1,再调用3,得把接口进行整合;另一个同学W要实现业务B,那要先调用接口3,然后调用接口5,以后有很多业务都要调用接口的话都需要十分复杂的代码。
那怎么办?重构代码呗。最容易想到的就是我自己实现业务接口,比如我实现一个接口A,就是把原来的接口1和接口5整合进来,实现接口B,就是整合接口3和接口5。

原本基础功能分为10个接口,本身符合单一职责原则。但是发现没有,两个接口中都用到了接口3的代码,强行合并底层代码,却失去了代码的可重用性。
那这时候就需要外观模式了,在调用方与底层接口之前增加中间层,中间层提供业务接口,来供客户端调用,即在底层接口不变的情况下,中间层组合了底层接口方便上一层进行调用。
这就是外观模式。

实现

我们来简单写一个demo。
就拿上面那个例子来说。我们先实现3个底层接口,分别是1,3,5.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class CoreSystem1 {
public void method1(){
System.out.println("core system 1 method1");
}
}
public class CoreSystem3 {
public void method3(){
System.out.println("core system 3 method3");
}
}
public class CoreSystem5 {
public void method5(){
System.out.println("core system 5 method5");
}
}

接着我们创建Facade类,即外观模式中的中间层,来将底层功能整合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Facade {
public void methodA(){
CoreSystem1 coreSystem1 = new CoreSystem1();
CoreSystem3 coreSystem3 = new CoreSystem3();
coreSystem1.method1();
coreSystem3.method3();
}

public void methodB(){
CoreSystem3 coreSystem3 = new CoreSystem3();
CoreSystem5 coreSystem5 = new CoreSystem5();
coreSystem3.method3();
coreSystem5.method5();
}
}

最后我们创建一个客户端,调用试试。

1
2
3
4
5
6
7
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.methodA();
facade.methodB();
}
}

优缺点

外观模式可以减少系统之间的相互依赖,提高灵活性,并且隐藏了底层接口调用逻辑,一定程度上提高了安全性。而缺点在于如果底层改变了,那修改就会很麻烦。 但本身就是整合”祖传代码”,也说不上麻不麻烦。

代理模式VS外观模式VS中介者模式

前面也讲过这几个模式,这几个模式是有相似点的,这里就统一说一下。
这三个模式都是通过增加中间层,来让客户端调用,隐藏内部逻辑。
其次代理模式和外观模式属于结构型模式,而中介者模式属于行为型模式。
首先先说代理模式,代理模式是使用代理类去代表另一个类的功能,不改变被代理类的功能。
其次是外观模式,它提供的是一个高层次的接口,整合低层次的接口,使得客户端更容易调用。即对外提供访问底层接口的接口。
最后是中介者模式,这个模式将多对多的关系,转换为一对多的关系,使用一个中介对象来封装一系列类似对象的行为。

个人理解,代理模式强调的是一对一的关系,即代理类是原类的一个替身。
外观模式对内整合接口,一对多,对外提供一个访问的接口,一对一。
中介者模式则将原本多对多转化为一对多。
外观模式与中介者模式都能减少原来类与类之间的耦合。对原有系统进行封装,使得外部更容易调用。

总结

本文聊了聊外观模式,并讲了代理模式,外观模式,中介者模式三者的不同点。当然,以上仅是个人理解,如有错误希望指出。

CATALOG
  1. 1. 前言
  2. 2. 正文
    1. 2.1. 概念
    2. 2.2. 实现
    3. 2.3. 优缺点
    4. 2.4. 代理模式VS外观模式VS中介者模式
  3. 3. 总结