11_外观模式
外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式通过将客户端与子系统之间的复杂依赖关系解耦,简化了客户端的使用。
外观模式有三个主要角色:
-
外观(Facade):提供了一个统一的接口,用于访问子系统中的一组接口。外观封装了子系统的复杂性,简化了客户端的使用。
-
子系统(Subsystems):包含一组相关的接口和实现,用于完成特定的功能。子系统可以是一个或多个类。
-
客户端(Client):通过使用外观接口,与子系统进行交互。
外观模式的工作原理如下:
-
外观模式定义了一个统一的接口,用于访问子系统中的一组接口。
-
外观类封装了子系统的复杂性,隐藏了子系统的具体实现细节。
-
客户端通过使用外观接口来和子系统进行交互,无需直接调用子系统的接口。
外观模式的优点包括:
-
简化了客户端的使用,客户端无需了解子系统的复杂性。
-
解耦了客户端和子系统,降低了客户端和子系统之间的依赖关系。
-
提供了一个统一的接口,使得子系统更容易使用和测试。
外观模式适用于以下场景:
-
当需要简化复杂子系统的接口,并提供一个统一的接口给客户端时,可以使用外观模式。
-
当希望解耦客户端和子系统之间的依赖关系,降低系统的耦合度时,可以使用外观模式。
总结而言,外观模式通过提供一个统一的接口,简化了客户端对复杂子系统的使用。它解耦了客户端和子系统之间的依赖关系,提高了系统的灵活性和可维护性。
使用场景
计算机启动过程:
->BIOS自检(处理器,内存,硬盘,显卡,声卡等)(BIOS类)
->CPU开始工作(CPU类)
->硬盘开始工作(HardDisk类)
->内存开始工作(Memory类)
->加载操作系统(OS类)
->启动完成
Subsystems
public class BIOS { public void SelfCheck() { Console.WriteLine("BIOS开始自检..."); } }
public class CPU { public void Run() { Console.WriteLine("CPU开始工作..."); } }
public class HardDisk { public void LoadMBR() { Console.WriteLine("硬盘读取MBR主引导记录..."); } }
public class Memory { public void Run() { Console.WriteLine("内存开始工作..."); } }
public class OS { public void Load() { Console.WriteLine("加载WIN11操作系统..."); } }
public class Desktop { public void Display() { Console.WriteLine("启动完成,进入桌面..."); } }
Facade
public interface IComputer { void PowerOn(); }
public class Computer : IComputer { private BIOS bios = null; private CPU cpu = null; private HardDisk hardDisk = null; private Memory memory= null; private OS os = null; private Desktop desktop = null; public void PowerOn() { Console.WriteLine("电脑开机..."); bios?.SelfCheck(); cpu?.Run(); hardDisk?.LoadMBR(); memory?.Run(); os?.Load(); desktop?.Display(); } public void SetBIOS(BIOS bios) => this.bios = bios; public void SetCPU(CPU cpu) => this.cpu = cpu; public void SetHardDisk(HardDisk hardDisk) => this.hardDisk = hardDisk; public void SetMemory(Memory memory) => this.memory = memory; public void SetOS(OS os) => this.os = os; public void SetDesktop(Desktop desktop) => this.desktop = desktop; }
Client
internal class Client { public void Start() { Computer computer = new Computer(); computer.SetBIOS(new Hardware.BIOS()); computer.SetCPU(new Hardware.CPU()); computer.SetDesktop(new Hardware.Desktop()); computer.SetHardDisk(new Hardware.HardDisk()); computer.SetMemory(new Hardware.Memory()); computer.SetOS(new Hardware.OS()); computer.PowerOn(); } }
调用
static void Main(string[] args) { new Client().Start(); Console.ReadKey(); }