**外观模式**（Facade pattern），是軟件工程中常用的一種軟件設計模式，它為子系統中的一組介面提供一個統一的高層介面，使得子系統更容易使用。

外观模式是一个设计模式 (计算机)中常用的面向对象程序设计. 类似于一个建筑学中的立面. 立面作为一个前端接口来屏蔽更复杂的底层或结构代码。外观模式可以:

* 通用简化的API屏蔽与更复杂的内部组件和结构, 以提高Software library的可读性和可用性
* 为更通用的功能提供上下文特定的接口

* 在广泛更新重构单层系统(Monolithic System)或紧密耦合(tight coupling)的軟件系统, 提供一个简化的启动点，更有利于更多的松耦合(loose coupling)代码

当一个系统非常复杂或难以理解时，开发人员通常会使用 facade 设计模式，因为该系统有许多相互依赖的类，或者因为其源代码不可用。Facade模式隐藏了更大系统的复杂性，为客户端提供了一个更简单的接口。通常会涉及到一个wrapper包含客户端所需的一组成员的。这些成员代表 facade 客户端访问系统并隐藏实现细节。

結構
--

Facade
這個外觀類為子系統中Packages 1、2、3提供一個共同的對外介面（接口）
Clients
客戶對象通過一個外觀介面讀寫子系統中各介面的數據資源。
Packages
客戶可以通過外觀介面讀取的内部庫。

示例
--

### Java

這是一個抽象的範例。一個客戶"you"通過外觀介面"computer"獲取計算機内部複雜的系統信息。

```
/\* Complex parts \*/

class CPU {
 public void freeze() { ... }
 public void jump(long position) { ... }
 public void execute() { ... }
}

class Memory {
 public void load(long position, byte[] data) {
 ...
 }
}

class HardDrive {
 public byte[] read(long lba, int size) {
 ...
 }
}

/\* Façade \*/

class Computer {
 public void startComputer() {
 cpu.freeze();
 memory.load(BOOT\_ADDRESS, hardDrive.read(BOOT\_SECTOR, SECTOR\_SIZE));
 cpu.jump(BOOT\_ADDRESS);
 cpu.execute();
 }
}

/\* Client \*/

class You {
 public static void main(String[] args) {
 Computer facade = new Computer();
 facade.startComputer();
 }
}

```

### C#

```
// Facade pattern -- Structural example 

using System;

namespace DoFactory.GangOfFour.Facade.Structural
{

 // Mainapp test application 

 class MainApp
 {
 public static void Main()
 {
 Facade facade = new Facade();

 facade.MethodA();
 facade.MethodB();

 // Wait for user 
 Console.Read();
 }
 }

 // "Subsystem ClassA" 

 class SubSystemOne
 {
 public void MethodOne()
 {
 Console.WriteLine(" SubSystemOne Method");
 }
 }

 // Subsystem ClassB" 

 class SubSystemTwo
 {
 public void MethodTwo()
 {
 Console.WriteLine(" SubSystemTwo Method");
 }
 }

 // Subsystem ClassC" 

 class SubSystemThree
 {
 public void MethodThree()
 {
 Console.WriteLine(" SubSystemThree Method");
 }
 }

 // Subsystem ClassD" 

 class SubSystemFour
 {
 public void MethodFour()
 {
 Console.WriteLine(" SubSystemFour Method");
 }
 }

 // "Facade" 

 class Facade
 {
 SubSystemOne one;
 SubSystemTwo two;
 SubSystemThree three;
 SubSystemFour four;

 public Facade()
 {
 one = new SubSystemOne();
 two = new SubSystemTwo();
 three = new SubSystemThree();
 four = new SubSystemFour();
 }

 public void MethodA()
 {
 Console.WriteLine("\nMethodA() ---- ");
 one.MethodOne();
 two.MethodTwo();
 four.MethodFour();
 }

 public void MethodB()
 {
 Console.WriteLine("\nMethodB() ---- ");
 two.MethodTwo();
 three.MethodThree();
 }
 }
}

```

### C++

```
class CPU {
public:
 void freeze() { ... }
 void jump(long position) { ... }
 void execute() { ... }
}

class Memory {
public:
 void load(long position, char\* data) {
 ...
 }
}

class HardDrive {
public:
 char\* read(long lba, int size) {
 ...
 }
}

/\* Façade \*/

class Computer {
public:
 void startComputer() {
 cpu.freeze();
 memory.load(BOOT\_ADDRESS, hardDrive.read(BOOT\_SECTOR, SECTOR\_SIZE));
 cpu.jump(BOOT\_ADDRESS);
 cpu.execute();
 }
}

/\* Client \*/

class You {
public:
 void start(String[] args) {
 Computer facade = new Computer();
 facade.startComputer();
 }
}

```

  


|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
软件设计模式 |
| --- |
|  |
| 设计模式 | 

|  |  |
| --- | --- |
| 创建型 | 
* 抽象工厂
* 生成器
* 工厂方法
* 惰性初始
* 原型
* 单例

 |
|  |
| 结构型 | 
* 适配器
* 桥接
* Composite（英语：）
* 修饰
* 外观
* 享元
* 代理

 |
|  |
| 行为型 | 
* 责任链
* 命令
* Interpreter（英语：）
* 迭代器
* 中介者
* Memento（英语：）
* 观察者
* Specification（英语：）
* State（英语：）
* 策略
* 模板方法
* 访问者

 |

 |
|  |
| 并行模式 | 
* 主动对象（英语：）
* 阻止（英语：）
* Binding properties（英语：）
* 双重检查锁定模式
* 异步方法调用
* Future与promise
* Guarded suspension（英语：）
* Join（英语：）
* 锁
* Messaging（英语：）
* 监视器
* Proactor（英语：）
* 反应器
* 读写锁
* 调度
* 线程池
* 线程局部存储

 |
|  |
| 架构模式 | 
* ADR（英语：）
* 主动记录
* Broker（英语：）
* 主從式架構
* cbd
* DAO
* DDD
* Data transfer object（英语：）
* Front controller（英语：）
* Identity map（英语：）
* Interceptor（英语：）
* 控制反转
* MVC
* 微服務
* MVP
* 單體式應用程式
* 多层架构
* *n*-tier（英语：）
* Naked objects（英语：）
* P2P
* 发布/订阅
* REST
* SOA
* Specification（英语：）

 |
|  |
| 云分布式 | 
* 断路器
* CQRS（英语：）
* 补偿交易（英语：）
* 索引表
* 领导者选举（英语：）
* MapReduce
* 物化视图（英语：）
* 管道
* 过滤器（英语：）
* 发布/订阅
* 分片（英语：）
* 节流（英语：）

 |
|  |
| 其他模式 | 
* Blackboard（英语：）
* Business delegate（英语：）
* Composite entity（英语：）
* 委托
* 依赖注入
* Intercepting filter（英语：）
* 惰性載入
* Method chaining（英语：）
* 模拟对象
* 空对象
* 对象池
* Servant（英语：）
* Twin（英语：）
* Type tunnel（英语：）

 |
|  |
| 书籍 | 
* 设计模式：可复用面向对象软件的基础
* 企业集成模式（英语：）

 |
|  |
| 人物 | 
* 克里斯托佛·亚历山大
* 埃里希·伽瑪
* Ralph Johnson（英语：）
* John Vlissides（英语：）
* 葛來迪·布區
* 肯特·貝克
* 沃德·坎宁安
* 马丁·福勒
* Robert Martin（英语：）
* Jim Coplien（英语：）
* Douglas Schmidt（英语：）
* Linda Rising

 |
|  |
| 社区 | 
* The Hillside Group（英语：）
* The Portland Pattern Repository（英语：）

 |

 |