外观模式

在众多设计模式中,外观模式应该算是比较简单直观的一种了,可能很多人在平时开发中都会无意的用到这种模式,本文就简单的介绍下外观模式的写法。

何为外观模式

软件开发者应该都知道面向对象的一条原则,就是低耦合。降低不同模块间的依赖性,便于扩展也便于修改。当然,大部分设计模式也是在解决软件系统低耦合高内聚的问题,外观模式也不例外。那它又是如何解决这个问题呢?一位大师(具体名字忘记了)曾总结到,所有的计算机问题都可以通过增加一层中间层解决,外观模式正是这样的一种模式。接下了具体看看外观模式是怎样的结构。

我们假设这样的场景:我们开发了一个系统,这个系统包含了很多功能,由很多类组成,现在要将这个系统提供给外部系统使用。最直接的方式就是把所有的类都暴露出来,让用户自己决定怎么使用,想怎么使用都可以。显然,这种方式最省事,但是缺陷也很明显,向用户暴露了系统的所有细节,用户的系统和我们的系统高度耦合,后续如果我们的系统有所改动,用户的系统也需要同步改动。

那如何降低两个系统的耦合度?增加一个中间层。我们在系统之上再封装一个中间层,或者叫做代理层,将需要向外部暴露的功能通过代理层的提供,再由代理层去调用系统的内部实现。这样用户只需要了解代理层的接口,不需要了解系统内部的实现。同时,将来系统内部进行了修改,只要代理层的接口没有改动,对于用户就是无感知的。

下面以两张UML图来展现这一过程,直接访问:

外观模式图1

通过代理层访问:

外观模式图2

一个简单的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class A {
public:
void DoSomething() {}
};

class B {
public:
void DoSomething() {}
};

class C {
public:
void DoSomething() {}
};

class Facade {
public:
void DoA() { a.DoSomething(); }
void DoB() { b.DoSomething(); }
void DoC() { c.DoSomething(); }
private:
A a;
B b;
C c;
};

class Client {
public:
void DoSomething() {
facade.DoA();
facade.DoB();
facade.DoC();
}
private:
Facade facade;
};

代码很简单,就是在客户端和系统直接加入了一个中间层,隔离了客户端和系统实现的联系。