
外观模式(Facade),亦称"过程模式"。来自学校课程评价模式之一。美国教育学者斯泰克1967 年在所著《教育评价的外观》中提出。主张按照描述和银话体判断资料来评价课程,关键的活动是在课程实施的全过程中进行观察和搜集意见均必交裂,以了解人们对万举照课程的不同看法。这种模式不限于检查教学的成果,重视描水突话述和判断教学过程中各种复杂、动态的现象和事物。
- 中文名 外观模式
- 外文名 Facade
- 类型 组合型
结构

Facade
这个外观类为子系统提供一个共同的对外接口
Clients
善帝住其却台客户对象通过一个外观接口读写子系统中各接口的数据资源。
适用场景
在以下情况下可以考来自虑使用外观模式:
(1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。
王数 (2) 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。
(3) 维护一个大型遗留系360百科统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。
优点
(永谈兵南切鱼色短原早士1)实现了子系统与客户端之间际的松耦合关系。
(2)客户端屏蔽了子系统组件,减来自少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。
示例
Java
这是一个抽象的示例。一个客户"you"通过外观接口"computer"获取计算机内部复杂的系统伤古信息。
/* Complex parts */
class 360百科CPU {
public void freeze() { .和逐输.. }
publi油载书c void jump(long 个世position) { ... }
public void execute() { ... }
}
class Memory {
public void lo假架虽罗房ad(long position, byte[] data) {
...
}
}
class Har凯云房良dDrive {
public byte[] read(long l啊该ba, 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();
}
}
/* Cl题游刘存服度飞度复降功ient */
class You {
public stat判况讨杨获州乎声核根参ic void main(S消油为处厚格列屋啊盟tring[] 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.Meth丝衡亚侵下极误伟范odA();
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();
}
}
}