设计模式-外观模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 外观模式和里氏替换原则的区别
    • 代码示例
      • Java实现外观模式
      • python实现外观模式
    • 外观模式在spring中的应用


模式介绍

外观模式(Facade Pattern)是一种结构性设计模式,它隐藏了系统的复杂性,并向客户端提供了一个简洁且方便的接口。

外观模式将一个系统中的每一项称为一个子系统,为这一组子系统提供一个高层接口。这个接口使得这一子系统更加容易被人使用。通俗的来讲就是,将一系列的行为封装为一个接口,在这个接口中统一来调用这些行为,这样在程序员使用的时候就不需要一个一个接口的调用,而只需要调用统一的接口就可以了,以此来降低整个流程的复杂度。

但是需要注意的是,Facade只是为了方便一般用户调用,当有特殊的需求需要访问某个或者某些个别子系统时,也可以自己通过调用各个子系统来完成自己的需求。Facade对于子系统来说,其实是另一个客户端而已。

外观模式的目的是简化客户端与子系统之间的交互,使得客户端不需要了解子系统的内部结构和实现细节,同时提供一种简洁的接口来使用子系统的功能。这有助于降低系统的复杂性,提高可维护性和可扩展性。

在这里插入图片描述

模式特点

外观模式的主要特点包括:

  1. 简化接口 :外观模式为复杂的子系统提供了一个统一的、简化的接口,隐藏了子系统的内部细节,使得客户端可以更加便捷地使用子系统的功能。
  2. 隔离依赖 :外观模式将客户端与子系统的直接依赖关系隔离开来,客户端只需要与外观对象进行交互,而不需要关心子系统的具体实现和相互关系,降低了客户端与子系统之间的耦合度。
  3. 提供高层接口 :外观模式定义了一个高层接口,将各个子系统的操作打包在一起,为客户端提供一致性的访问点,减少了客户端需要处理的对象数量,降低了系统的复杂性。
  4. 隐藏实现细节 :外观模式隐藏了子系统的实现细节,使得客户端可以独立于子系统的实现进行使用。这样,即使子系统的内部实现发生变化,只要不影响到外观对象的接口,客户端的使用就不会受到影响。
  5. 提高可维护性和可扩展性 :由于外观模式将子系统的复杂性隐藏在内部,并提供了一个简化的接口给客户端使用,因此可以更容易地对子系统进行修改、扩展和维护,而不会影响到客户端的使用。

外观模式通过简化接口、隔离依赖、提供高层接口、隐藏实现细节以及提高可维护性和可扩展性等特点,有效地降低了系统的复杂性,提高了系统的可维护性和可扩展性。

在这里插入图片描述

应用场景

外观模式的应用场景包括但不限于以下几种情况:

  1. 子系统复杂,相互依赖,可以通过引入外观类来简化客户端与子系统的交互。

  2. 需要降低代码的耦合度,提高系统的可维护性和可扩展性,通过外观模式可以使客户端仅与外观类交互,无需关注子系统的内部变化。

  3. 需要将一个复杂系统与其他系统进行集成,可以引入一个外观类作为系统之间的接口,使外部系统无需了解内部系统的具体实现,只需通过外观类与内部系统进行交互。

  4. 需要在客户端和子系统之间建立一个隔离层,以保护子系统不受外部干扰。通过引入外观类,可以在客户端和子系统之间建立一个隔离层,使得客户端无法直接访问子系统内部的细节,从而保护子系统不受外部干扰。

  5. 需要在客户端和子系统之间建立一个统一的接口,以方便客户端的使用。通过引入外观类,可以定义一个统一的接口,使得客户端可以通过这个接口与子系统进行交互,而无需了解子系统的内部结构和实现细节。

  6. 需要在多个子系统之间进行协调,以实现整体功能。当有多个子系统需要相互协作时,可以通过引入外观类来协调这些子系统之间的交互,以确保整体功能的实现。

在这里插入图片描述

外观模式和里氏替换原则的区别

外观模式和里氏替换原则是面向对象设计的两个重要原则,它们的目的和关注点有所不同。

外观模式是一种结构性设计模式,它通过提供一个统一的接口来简化客户端与子系统之间的交互,隐藏了子系统的内部细节,使得客户端可以更加便捷地使用子系统的功能。外观模式关注的是系统的高层接口和客户端的使用体验,它通过简化接口和隔离依赖来降低系统的复杂性,提高可维护性和可扩展性。

里氏替换原则是面向对象设计的基本原则之一,它规定了子类可以替换其基类,并且软件单位的功能不受到影响的原则。里氏替换原则关注的是基类和子类的关系,只有当这种关系存在时,里氏代换关系才存在。它强调了继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。

虽然外观模式和里氏替换原则有所不同,但它们之间也有一定的关联。外观模式可以看作是里氏替换原则的一种应用,它通过提供一个高层接口来简化客户端与子系统的交互,使得子类可以更容易地替换基类,并且不会影响到客户端的使用。同时,里氏替换原则也是实现外观模式的关键步骤之一,它规范了基类和子类的关系,使得衍生类可以替换掉基类,并且不会影响到软件单位的功能。

外观模式和里氏替换原则都是面向对象设计的重要原则,它们分别关注不同的方面,但都是为了提高软件的可维护性和可扩展性。

在这里插入图片描述

代码示例

Java实现外观模式

下面是一个简单的Java实现外观模式的示例:

// 子系统类
class Subsystem {
    public void operation1() {
        System.out.println("Subsystem operation 1");
    }
    public void operation2() {
        System.out.println("Subsystem operation 2");
    }
}

// 外观类
class Facade {
    private Subsystem subsystem;
    public Facade(Subsystem subsystem) {
        this.subsystem = subsystem;
    }
    public void operation() {
        subsystem.operation1();
        subsystem.operation2();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Subsystem subsystem = new Subsystem();
        Facade facade = new Facade(subsystem);
        facade.operation(); // 调用外观类的方法,实际上会调用子系统的操作1和操作2方法
    }
}

在这个示例中,我们定义了一个Subsystem类,它代表了一个子系统,包含了两个操作方法operation1和operation2。然后我们定义了一个Facade类,它代表了外观类,通过构造函数将子系统作为参数传入,并在operation方法中调用了子系统的操作方法。最后,我们在客户端代码中创建了一个Subsystem对象和一个Facade对象,并将Subsystem对象作为参数传入Facade对象的构造函数中。在客户端代码中,我们只需要调用Facade对象的operation方法即可完成对子系统的操作。

python实现外观模式

在Python中,可以使用类来实现外观模式。下面是一个简单的示例,其中有一个子系统类和一个外观类:

# 子系统类
class SubSystem:
    def operation1(self):
        print("SubSystem operation 1")
        
    def operation2(self):
        print("SubSystem operation 2")

# 外观类
class Facade:
    def __init__(self):
        self.subsystem = SubSystem()
        
    def operation(self):
        self.subsystem.operation1()
        self.subsystem.operation2()

在上面的示例中,SubSystem类有两个方法operation1operation2,这些方法可以被视为子系统的操作。Facade类是一个外观类,它有一个SubSystem对象作为其属性,并定义了一个operation方法,该方法调用了子系统的两个操作。这样,客户端代码只需要与Facade对象交互,而无需了解子系统的内部结构和实现细节。客户端代码可以像下面这样使用外观模式:

# 创建外观对象
facade = Facade()

# 调用外观对象的方法,实际上会调用子系统的操作1和操作2方法
facade.operation()

在这里插入图片描述

外观模式在spring中的应用

外观模式在Spring框架中有着广泛的应用。Spring框架中的外观模式主要用于简化客户端与复杂子系统的交互。下面是一些Spring中外观模式的应用示例:

  1. Spring MVC框架中的Controller层就是一个典型的外观模式的例子。Controller层为客户端提供了一个统一的接口,用于处理用户请求并返回响应。它隐藏了业务逻辑层的具体实现细节,使得客户端可以更加方便地使用业务逻辑。
  2. Spring Boot中的AutoConfiguration机制也用到了外观模式。AutoConfiguration通过定义一组条件和默认配置,使得开发者无需过多关注底层的配置和实现细节,只需要关注核心功能的开发。
  3. Spring Batch中的JobLauncher和JobRepository也是外观模式的典型应用。它们为批处理作业的启动和执行提供了一个统一的接口,隐藏了批处理作业的具体实现细节。
  4. Spring Integration中的Channel接口和MessageHandler接口也是外观模式的例子。它们为消息传递提供了统一的接口,使得开发者无需关注消息传递的具体实现细节。

Spring框架中外观模式的应用非常广泛,主要用于简化客户端与子系统的交互、隐藏实现细节、提高可维护性和可扩展性等。

在这里插入图片描述

设计模式-原型模式

设计模式-建造者模式

设计模式-工厂模式

设计模式-单例模式

设计模式-适配器模式

设计模式-装饰器模式

设计模式-代理模式

你可能感兴趣的:(设计模式,设计模式,外观模式,服务器)