FacadePattern-门面模式

在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();
            //输出结果
            //系统自检完成
        }
    }
}

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

 

门面模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。门面模式具有以下优点和缺点:

优点:

  1. 简化客户端使用:门面模式通过提供一个简单的统一接口,隐藏了子系统的复杂性,使得客户端使用起来更加简单和方便。客户端只需要与门面接口进行交互,无需了解和处理底层的子系统细节。

  2. 解耦子系统和客户端:门面模式将子系统和客户端之间的依赖关系解耦,客户端只需要与门面接口进行交互,而不需要直接与子系统进行交互。这样可以降低耦合度,提高代码的灵活性和可维护性。

  3. 封装复杂性:门面模式封装了子系统的复杂性,将其抽象成一个简单的接口。这样可以隐藏系统的内部实现细节,使得系统更加易于理解和使用。

  4. 提高系统的可扩展性:通过使用门面模式,可以灵活地对子系统进行修改和扩展,而无需影响客户端的使用。只需要调整门面接口或子系统的实现即可。

缺点:

  1. 违背开放封闭原则:当需要修改或添加新的功能时,可能需要修改门面类的代码。这可能违反了开放封闭原则,对已有的门面类进行修改可能会导致其他客户端代码的不稳定性。

  2. 可能造成过度设计:在设计过程中,过度使用门面模式可能会造成不必要的复杂性。如果子系统本身并不复杂,或者不需要对其进行封装和隐藏,使用门面模式可能会显得过于繁琐和冗余。

  3. 降低灵活性:门面模式将子系统进行了抽象和封装,但也带来了一定的限制。如果客户端需要访问子系统中的一些特定功能,可能无法通过门面接口实现,需要进行额外的扩展。

需要根据具体的应用场景和需求来评估使用门面模式的利弊。门面模式适用于需要简化子系统访问和提供统一接口的情况。通过权衡其优点和缺点,可以选择是否使用门面模式。

posted @ 2023-08-19 13:51  ZHIZRL  阅读(16)  评论(0编辑  收藏  举报