C#设计模式10——外观模式的写法

什么是外观模式?

外观模式(Facade Pattern)又称门面模式,是一种结构型设计模式,它提供了一个统一的接口,用来访问一个子系统中一群功能相关联的接口。外观模式定义了一个高层接口,让子系统更容易使用。

为什么要使用外观模式?

在一个大型系统中,有时候可能会存在大量的复杂的子系统,它们之间的关系错综复杂,对客户端来说直接访问会非常困难,甚至不可行。而外观模式可以为客户端提供一个简单的接口,帮助客户端访问这些子系统,从而降低了复杂度,提高了可维护性和可扩展性。

外观模式的优点有哪些?

1. 简化了客户端与子系统之间的交互,客户端只需要调用一个简单的接口即可完成操作。

2. 将复杂的子系统封装起来,对客户端隐藏了系统的复杂性,提高了可维护性和可扩展性。

3. 降低了客户端与子系统的耦合度,使得子系统的变化对客户端的影响降到最低。

如何使用外观模式?

外观模式包含以下几个角色:

1. Facade(门面):提供了一个统一的接口,用来访问子系统中一群功能相关联的接口。

2. Subsystem classes(子系统类):实现了子系统的功能,处理由Facade对象指派的任务。 

3. Client(客户端):通过门面访问子系统的功能。

在使用外观模式时,首先需要定义好Facade接口,然后按需调用子系统类来实现这个接口,并作为外界的统一接口提供给客户端调用。客户端只需要调用Facade接口,即可完成与子系统的交互。

何时使用外观模式?

在以下情况下,可以考虑使用外观模式:

1. 需要简化客户端与复杂子系统之间的交互,提高交互效率。

2. 有多个子系统之间互相交互且关系复杂,需要对它们进行统一管理。

3. 为了降低系统中模块间的耦合度,需要引入一个中间层来进行解耦。

4. 需要提高系统的可维护性和可扩展性,以方便后期的维护和拓展。


下面我们来看一个简单的C#外观模式的示例代码:

首先我们需要定义一个门面接口:

public interface IShapeFacade
{
    void DrawCircle();
    void DrawRectangle();
    void DrawTriangle();
}

然后我们定义三个子系统类,它们实现了门面接口:

public class Circle : IShapeFacade
{
    public void DrawCircle()
    {
        Console.WriteLine("Drawing a circle...");
    }

    public void DrawRectangle()
    {
        //空实现
    }

    public void DrawTriangle()
    {
        //空实现
    }
}

public class Rectangle : IShapeFacade
{
    public void DrawCircle()
    {
        //空实现
    }

    public void DrawRectangle()
    {
        Console.WriteLine("Drawing a rectangle...");
    }

    public void DrawTriangle()
    {
        //空实现
    }
}

public class Triangle : IShapeFacade
{
    public void DrawCircle()
    {
        //空实现
    }

    public void DrawRectangle()
    {
        //空实现
    }

    public void DrawTriangle()
    {
        Console.WriteLine("Drawing a triangle...");
    }
}

最后,我们定义一个门面类,它包含了三个子系统类的实例,并将它们的方法封装在一个方法中实现:

public class ShapeMaker : IShapeFacade
{
    private Circle circle;
    private Rectangle rectangle;
    private Triangle triangle;

    public ShapeMaker()
    {
        circle = new Circle();
        rectangle = new Rectangle();
        triangle = new Triangle();
    }

    public void DrawCircle()
    {
        circle.DrawCircle();
    }

    public void DrawRectangle()
    {
        rectangle.DrawRectangle();
    }

    public void DrawTriangle()
    {
        triangle.DrawTriangle();
    }
}

在客户端代码中,我们只需要创建一个ShapeMaker对象,并调用它的DrawCircle、DrawRectangle和DrawTriangle方法即可:

代码运行结果如下:


Drawing a circle...
Drawing a rectangle...
Drawing a triangle...

 

这样,在客户端中,我们只需要和门面类ShapeMaker进行交互,而无需知道子系统类的具体实现。这个示例虽然非常简单,但它很好地演示了外观模式的特点和作用。

posted @ 2023-05-09 21:10  明志德道  阅读(78)  评论(0编辑  收藏  举报