外观模式(Facade Pattern)

简介: 外观模式(Facade Pattern)是一种结构型设计模式,为子系统中的一组接口提供一个一致的接口。它通过一个高层接口简化子系统的复杂性,使客户端更容易使用。外观模式的核心角色包括外观(Facade)和子系统(Subsystems),主要优点是降低复杂性和松耦合,适用于简化接口、分层设计和遗留代码集成等场景。

外观模式(Facade Pattern)详解

定义

外观模式是一种结构型设计模式,为子系统中的一组接口提供一个一致的接口。外观模式定义了一个高层接口,使得子系统更易于使用。


核心概念

角色组成

  1. 外观(Facade)
    为复杂子系统提供简单的接口,负责协调子系统的调用。
  2. 子系统(Subsystems)
    一组实现功能的复杂模块,对外部隐藏其内部细节。

特性

  • 降低复杂性:屏蔽子系统的实现细节,提供简单接口。
  • 松耦合:客户端与子系统之间通过外观解耦。

外观模式的类图


使用场景

  1. 简化接口:隐藏复杂系统的内部细节,为外部提供一个简单的调用接口。
  2. 分层设计:降低客户端与复杂子系统之间的耦合。
  3. 遗留代码集成:在使用遗留代码时,通过外观模式统一管理,避免直接依赖。

优缺点分析

优点

  1. 简化接口:隐藏复杂实现细节。
  2. 松耦合:子系统的变化不影响客户端代码。
  3. 更易维护:减少直接依赖,增强系统的可维护性。

缺点

  1. 不完全封装:若客户端仍直接调用子系统,外观的效果会减弱。
  2. 职责单一性可能被破坏:外观可能成为“大接口”,过于复杂。

使用案例

案例 1:智能家居控制

  • 描述:智能家居系统包含灯光、空调和安防模块。外观模式可提供一个统一的接口,如“回家模式”,一键控制所有子系统。
  • 实现:灯光、空调、安防模块作为子系统,外观封装具体调用逻辑。

案例 2:数据库访问

  • 描述:在复杂的数据库操作中,外观模式可统一处理查询、事务管理和日志记录。
  • 实现:将底层数据库驱动操作封装为统一接口,客户端仅需调用外观。

知识点对比表

特性 外观模式 直接调用子系统
接口复杂度 简单统一 复杂,需了解多个接口
耦合性 松耦合 紧耦合
适应性 易于扩展和修改 扩展时影响客户端
使用场景 封装复杂子系统 客户端需灵活控制子系统

C++ 实现

#include <iostream>
using namespace std;

// 子系统A
class SubsystemA {
public:
   void methodA() const {
       cout << "SubsystemA: methodA executed." << endl;
   }
};

// 子系统B
class SubsystemB {
public:
   void methodB() const {
       cout << "SubsystemB: methodB executed." << endl;
   }
};

// 子系统C
class SubsystemC {
public:
   void methodC() const {
       cout << "SubsystemC: methodC executed." << endl;
   }
};

// 外观类
class Facade {
private:
   SubsystemA subsystemA;
   SubsystemB subsystemB;
   SubsystemC subsystemC;

public:
   void operation1() {
       cout << "Facade: operation1 executing." << endl;
       subsystemA.methodA();
       subsystemB.methodB();
   }

   void operation2() {
       cout << "Facade: operation2 executing." << endl;
       subsystemC.methodC();
   }
};

// 客户端代码
int main() {
   Facade facade;
   facade.operation1();
   facade.operation2();
   return 0;
}


C# 实现

using System;

// 子系统A
public class SubsystemA {
   public void MethodA() {
       Console.WriteLine("SubsystemA: MethodA executed.");
   }
}

// 子系统B
public class SubsystemB {
   public void MethodB() {
       Console.WriteLine("SubsystemB: MethodB executed.");
   }
}

// 子系统C
public class SubsystemC {
   public void MethodC() {
       Console.WriteLine("SubsystemC: MethodC executed.");
   }
}

// 外观类
public class Facade {
   private SubsystemA subsystemA = new SubsystemA();
   private SubsystemB subsystemB = new SubsystemB();
   private SubsystemC subsystemC = new SubsystemC();

   public void Operation1() {
       Console.WriteLine("Facade: Operation1 executing.");
       subsystemA.MethodA();
       subsystemB.MethodB();
   }

   public void Operation2() {
       Console.WriteLine("Facade: Operation2 executing.");
       subsystemC.MethodC();
   }
}

// 客户端代码
class Program {
   static void Main(string[] args) {
       Facade facade = new Facade();
       facade.Operation1();
       facade.Operation2();
   }
}


总结

  1. 高层接口:外观模式简化了复杂子系统的使用。
  2. 降低耦合:实现了客户端与子系统的解耦。
  3. 推荐场景:适用于隐藏复杂实现逻辑,统一接口调用的场景。
相关文章
|
数据采集 Java 开发者
OpenSource - Spring Startup Ananlyzer
OpenSource - Spring Startup Ananlyzer
647 1
|
8月前
|
存储 人工智能 开发工具
Claude Code自动记忆来了!配合老金三层记忆系统全开源!加强Plus!
昨天晚上,老金我照例打开 Claude Code 准备写代码。 随便聊了几句项目架构,Claude突然冒出一句: "Based on our previous discussions, this project uses pnpm and TypeScript strict mode." 老金我愣了一下。 上次提到pnpm是三天前的事了,这中间重启了好几次。 打开 ~/.claude/p
|
人工智能 自然语言处理 Java
Spring AI,搭建个人AI助手
本期主要是实操性内容,聊聊AI大模型,并使用Spring AI搭建属于自己的AI助手、知识库。本期所需的演示源码笔者托管在Gitee上(https://gitee.com/catoncloud/spring-ai-demo),读者朋友可自行查阅。
4968 44
Spring AI,搭建个人AI助手
|
6月前
|
供应链 安全 API
企业股权穿透图-企业股权穿透信息查询-公司股权穿透查询-公司股权结构-公司股权结构查询
本服务通过关键词智能检索企业上下游产业链及对外投资关联信息,整合直接/间接投资、参股控股等多层级经营关系,清晰呈现股权结构与产业脉络,助力商业尽调、信贷风控、投资决策、招投标审查及并购交易,提供全面可靠的数据支撑。
541 0
|
设计模式 存储 算法
「全网最细 + 实战源码案例」设计模式——命令模式
命令模式(Command Pattern)是一种行为型设计模式,将请求封装成独立对象,从而解耦请求方与接收方。其核心结构包括:Command(命令接口)、ConcreteCommand(具体命令)、Receiver(接收者)和Invoker(调用者)。通过这种方式,命令的执行、撤销、排队等操作更易扩展和灵活。 适用场景: 1. 参数化对象以操作。 2. 操作放入队列或远程执行。 3. 实现回滚功能。 4. 解耦调用者与接收者。 优点: - 遵循单一职责和开闭原则。 - 支持命令组合和延迟执行。 - 可实现撤销、恢复功能。 缺点: - 增加复杂性和类数量。
639 14
「全网最细 + 实战源码案例」设计模式——命令模式
|
JavaScript 前端开发 API
浏览器节能机制导致Websocket断连的坑
浏览器的节能机制虽然有助于节省系统资源和延长电池寿命,但也可能导致WebSocket连接的不稳定性。通过保持活跃连接、实现自动重连机制和利用 `Page Visibility API`检测页面状态,开发者可以有效应对这些挑战,确保WebSocket连接的稳定性和可靠性。这些措施在实际项目中的应用,可以显著提升WebSocket通信的稳定性,提供更好的用户体验。
1269 13
|
XML 监控 负载均衡
Jacoco的覆盖率原理
JaCoCo(Java Code Coverage)是一种广泛使用的代码覆盖率工具,通过在字节码中插入探针(Probe)来收集覆盖率信息。
1953 5
Jacoco的覆盖率原理
|
存储 设计模式 数据可视化
DDD新手入门:领域模型设计的七个核心概念
小米,29岁程序员,分享领域模型落地知识。文章解析领域、子域、限界上下文、领域对象、聚合、工厂与仓库等概念,助你理解领域驱动设计。
1563 1
|
设计模式 Java C#
装饰模式(Decorator Pattern)
装饰模式是一种结构型设计模式,允许在不修改原有对象的情况下动态添加功能。它通过装饰类层层叠加实现功能扩展,适用于需要在运行时动态添加、修改或移除对象行为的场景。装饰模式的核心角色包括抽象组件、具体组件、抽象装饰和具体装饰。该模式的优点在于动态扩展功能、避免类爆炸和遵守开放-封闭原则,但可能会导致对象数量增加和调试困难。常见使用场景包括图形系统中的动态效果和输入流的功能扩展。