外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
用一个简单的例子来解释一下吧,电脑整机是 CPU、内存、硬盘的外观。有了外观以后,启动电脑和关闭电脑都简化了。直接 new 一个电脑,在 new 电脑的同时把 cpu、内存、硬盘都初始化好并且接好线。对外暴露方法(启动电脑,关闭电脑):
- 启动电脑(按一下电源键):启动CPU、启动内存、启动硬盘
- 关闭电脑(按一下电源键):关闭硬盘、关闭内存、关闭CPU
class Program
{
static void Main(string[] args)
{
Computer computer = new Computer();
computer.start();
Console.WriteLine("=================");
computer.shutDown();
Console.Read();
}
}
public class CPU
{
public void Start()
{
Console.WriteLine("CPU is start...");
}
public void ShutDown()
{
Console.WriteLine("CPU is shutDown...");
}
}
public class Disk
{
public void Start()
{
Console.WriteLine("Disk is start...");
}
public void ShutDown()
{
Console.WriteLine("Disk is shutDown...");
}
}
public class Memory
{
public void Start()
{
Console.WriteLine("Memory is start...");
}
public void ShutDown()
{
Console.WriteLine("Memory is shutDown...");
}
}
public class Computer
{
private CPU cpu;
private Memory memory;
private Disk disk;
public Computer()
{
cpu = new CPU();
memory = new Memory();
disk = new Disk();
}
public void start()
{
Console.WriteLine("Computer start begin");
cpu.Start();
disk.Start();
memory.Start();
Console.WriteLine("Computer start end");
}
public void shutDown()
{
Console.WriteLine("Computer shutDown begin");
cpu.ShutDown();
disk.ShutDown();
memory.ShutDown();
Console.WriteLine("Computer shutDown end...");
}
}
输出结果
Computer start begin
CPU is start...
Disk is start...
Memory is start...
Computer start end
=================
Computer shutDown begin
CPU is shutDown...
Disk is shutDown...
Memory is shutDown...
Computer shutDown end...
这种实现方式就类似三层架构。不过虽然客户端与外观类之间解耦了,但是外观类内部耦合还是很严重的
类图
优点与缺点
外观模式的优点:
- 外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。
- 外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使得子系统的组件变化不会影响到它的客户。
外观模式的缺点:
- 如果增加新的子系统可能需要修改外观类或客户端的源代码,这样就违背了”开——闭原则“(不过这点也是不可避免)。
本文主要借鉴了《Gof设计模式》