11_外观模式

外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式通过将客户端与子系统之间的复杂依赖关系解耦,简化了客户端的使用。

外观模式有三个主要角色:

  1. 外观(Facade):提供了一个统一的接口,用于访问子系统中的一组接口。外观封装了子系统的复杂性,简化了客户端的使用。

  2. 子系统(Subsystems):包含一组相关的接口和实现,用于完成特定的功能。子系统可以是一个或多个类。

  3. 客户端(Client):通过使用外观接口,与子系统进行交互。

外观模式的工作原理如下:

  1. 外观模式定义了一个统一的接口,用于访问子系统中的一组接口。

  2. 外观类封装了子系统的复杂性,隐藏了子系统的具体实现细节。

  3. 客户端通过使用外观接口来和子系统进行交互,无需直接调用子系统的接口。

外观模式的优点包括:

  1. 简化了客户端的使用,客户端无需了解子系统的复杂性。

  2. 解耦了客户端和子系统,降低了客户端和子系统之间的依赖关系。

  3. 提供了一个统一的接口,使得子系统更容易使用和测试。

外观模式适用于以下场景:

  1. 当需要简化复杂子系统的接口,并提供一个统一的接口给客户端时,可以使用外观模式。

  2. 当希望解耦客户端和子系统之间的依赖关系,降低系统的耦合度时,可以使用外观模式。

总结而言,外观模式通过提供一个统一的接口,简化了客户端对复杂子系统的使用。它解耦了客户端和子系统之间的依赖关系,提高了系统的灵活性和可维护性。

 

使用场景

计算机启动过程:
->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();

        }

 

posted @ 2024-03-12 09:36  野码  阅读(5)  评论(0编辑  收藏  举报