重温设计模式 --- 外观模式

2023-10-22 16:38:39 浏览数 (2)

引言

外观模式是一种结构型设计模式,它为客户端提供了一个简单的接口,使得客户端能够更容易地使用复杂的子系统。外观模式通过隐藏子系统的复杂性,简化了客户端的调用过程,同时也降低了客户端与子系统的耦合度。

外观模式的核心思想是将系统的各个组件和子系统封装在一个单独的类中,称为外观类。外观类为客户端提供一个简单的接口,隐藏了系统的复杂性。客户端只需要与外观类交互,就可以使用系统的所有功能。

将外观模式具象化可以这样理解,假设我们有一个汽车工厂,它可以生产各种型号的汽车。生产一辆汽车需要很多步骤,比如设计、采购零件、组装等等。如果客户端要使用汽车工厂生产一辆汽车,那么他需要了解所有这些步骤的细节,这会使得客户端非常复杂。但是如果我们在汽车工厂的外面加上一个售车大厅,这个售车大厅就是外观。客户端只需要在售车大厅告诉售货员他想要什么型号的汽车,然后售货员会帮他完成所有的操作。这样客户端就可以很方便地使用汽车工厂了。

接下来,我们使用C#实现上文描述的外观模式。

子系统类

创建设计师类采购部类组装车间类

代码语言:javascript复制
public  class  Designer
{
    public void Design()
    {
        //Design a car..
    }
}

public  class  PurchasingDepartment
{
    public void Purchase()
    {
        //Purchase car parts..
    }
}

public  class  AssemblyWorkshop
{
    public void Assemble()
    {
        //Assemble car..
    }
}

外观类

创建外观类:

代码语言:javascript复制
public  class  CarFacade
{
    private Designer designer;
    
    private PurchasingDepartment purchasingDepartment;
    
    private AssemblyWorkshop assemblyWorkshop;

    public CarFacade()
    {
        designer = new();
        
        purchasingDepartment = new();
        
        assemblyWorkshop = new();
    }

    public void Operation()
    {
        designer.Design();
        
        purchasingDepartment.Purchase();
        
        assemblyWorkshop.Assemble();
        
        //othre Operation ..
    }
}

这样,客户端需要一辆车的时候,只需要这样

代码语言:javascript复制
Facade facade = new Facade();

facade.Operation();

上述示例中,DesignerPurchasingDepartmentAssemblyWorkshop是三个子系统类,CarFacade是外观类,CarFacade封装了子系统的复杂性,为客户提供了一个简单的接口Operation,而无需了解其实现细节。

结论

外观模式通常用于大型系统中,其中有多个子系统相互依赖,而客户端只需要使用其中一小部分功能。 它可以帮助客户端更容易地使用这些功能,而无需了解子系统的所有细节。 它通过将客户端代码与复杂的子系统代码解耦,简化了客户端与子系统之间的交互。

0 人点赞