FacadePattern-门面模式

ZHIZRL / 2023-08-19 / 原文

在C#中,门面模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问复杂子系统中的一组接口。门面模式隐藏了子系统的复杂性,为客户端提供了一个简单的接口,使得客户端更易于使用子系统。

门面模式具有以下几个关键角色:

Facade(门面):是门面模式的核心,它提供了一个简单的接口,用于访问子系统中的一组接口。门面知道哪些子系统类负责处理请求,将客户端的请求委派给适当的子系统对象。

Subsystem(子系统):是组成子系统的类集合。它们实现了子系统的功能,处理门面对象指派的任务。

以电脑系统启动前自检为例:

CPU

namespace FacadePattern_门面模式
{
    /// <summary>
    /// 抽象CPU
    /// </summary>
    public abstract class ICPU
    {
        /// <summary>
        /// CPU自检抽象方法
        /// </summary>
        /// <returns></returns>
        public abstract bool Initialization();
    }
    /// <summary>
    /// 具体CPU
    /// </summary>
    public class AMD_CPU : ICPU
    {
        /// <summary>
        /// AMDCPU自检抽象方法
        /// </summary>
        /// <returns></returns>
        public override bool Initialization()
        {
            return true;
        }
    }
    /// <summary>
    /// 具体CPU
    /// </summary>
    public class Intel_CPU : ICPU
    {
        /// <summary>
        /// InteCPU自检抽象方法
        /// </summary>
        /// <returns></returns>
        public override bool Initialization()
        {
            return true;
        }
    }
}

RAM

namespace FacadePattern_门面模式
{
    /// <summary>
    /// 抽象内存
    /// </summary>
    public abstract class IRAM
    {
        public abstract bool Initialization();
    }
    /// <summary>
    /// 具体内存
    /// </summary>
    public class Kinston_RAM : IRAM
    {
        /// <summary>
        /// 金斯顿内存自检方法
        /// </summary>
        /// <returns></returns>
        public override bool Initialization()
        {
            return true;
        }
    }
}

HDD

namespace FacadePattern_门面模式
{
    /// <summary>
    /// 抽象硬盘
    /// </summary>
    public abstract class IHDD
    {
        /// <summary>
        /// 硬盘自检方法
        /// </summary>
        /// <returns></returns>
        public abstract bool Initialization();
    }
    /// <summary>
    /// 具体硬盘
    /// </summary>
    public class Samsung_HDD : IHDD
    {
        /// <summary>
        /// 三星硬盘自检方法
        /// </summary>
        /// <returns></returns>
        public override bool Initialization()
        {
            return true;
        }
    }
}

门面模式

namespace FacadePattern_门面模式
{
    /// <summary>
    /// 门面模式,一般为单例
    /// </summary>
    public class FacadePattern_System
    {
        private FacadePattern_System() { }
        private static FacadePattern_System facadePattern_WIN10 = new FacadePattern_System();
        public static FacadePattern_System CreateInstance()
        {
            return facadePattern_WIN10;
        }
        /// <summary>
        /// 系统自检方法
        /// </summary>
        public void Initialization()
        {
            ICPU cpu = new Intel_CPU();
            IHDD hdd = new Samsung_HDD();
            IRAM ram = new Kinston_RAM();
            if (!cpu.Initialization())
            {
                Console.WriteLine("CPU启动失败");
            }
            else if (!hdd.Initialization())
            {
                Console.WriteLine("HDD启动失败");
            }
            else if(!ram.Initialization())
            {
                Console.WriteLine("RAM启动失败");
            }
            else
            {
                Console.WriteLine("系统自检完成");
            }
        }
    }
}

客户系统

namespace FacadePattern_门面模式
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //获取系统实例
            FacadePattern_System facadePattern_WIN10 = FacadePattern_System.CreateInstance();
            //获取系统自检结果
            facadePattern_WIN10.Initialization();
            Console.Read();
            //输出结果
            //系统自检完成
        }
    }
}

门面模式的优点在于它将复杂的子系统隐藏在一个简单的接口后面,为客户端提供了更高层次的接口,降低了客户端与子系统的耦合性。它还使得子系统的使用更加方便和灵活,客户端只需要与门面进行交互即可。此外,如果需要修改或扩展子系统的功能,只需修改门面类而无需修改客户端代码。