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)是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。门面模式具有以下优点和缺点:
优点:
-
简化客户端使用:门面模式通过提供一个简单的统一接口,隐藏了子系统的复杂性,使得客户端使用起来更加简单和方便。客户端只需要与门面接口进行交互,无需了解和处理底层的子系统细节。
-
解耦子系统和客户端:门面模式将子系统和客户端之间的依赖关系解耦,客户端只需要与门面接口进行交互,而不需要直接与子系统进行交互。这样可以降低耦合度,提高代码的灵活性和可维护性。
-
封装复杂性:门面模式封装了子系统的复杂性,将其抽象成一个简单的接口。这样可以隐藏系统的内部实现细节,使得系统更加易于理解和使用。
-
提高系统的可扩展性:通过使用门面模式,可以灵活地对子系统进行修改和扩展,而无需影响客户端的使用。只需要调整门面接口或子系统的实现即可。
缺点:
-
违背开放封闭原则:当需要修改或添加新的功能时,可能需要修改门面类的代码。这可能违反了开放封闭原则,对已有的门面类进行修改可能会导致其他客户端代码的不稳定性。
-
可能造成过度设计:在设计过程中,过度使用门面模式可能会造成不必要的复杂性。如果子系统本身并不复杂,或者不需要对其进行封装和隐藏,使用门面模式可能会显得过于繁琐和冗余。
-
降低灵活性:门面模式将子系统进行了抽象和封装,但也带来了一定的限制。如果客户端需要访问子系统中的一些特定功能,可能无法通过门面接口实现,需要进行额外的扩展。
需要根据具体的应用场景和需求来评估使用门面模式的利弊。门面模式适用于需要简化子系统访问和提供统一接口的情况。通过权衡其优点和缺点,可以选择是否使用门面模式。