【设计模式】外观模式

外观模式(Facade Pattern)

概念:

· 一种结构型设计模式;

· 为子系统中的一组复杂接口提供一个统一的高层接口,使得子系统更加容易被使用;

· 客户端只需要和外观模式打交道,无需在意具体每个子系统的调度;

UML结构:

复制代码
        +----------------+
        |    Client      |
        +----------------+
                |
                v
        +----------------+
        |    Facade      |   外观类
        +----------------+
        | + Operation1() |
        | + Operation2() |
        +----------------+
           /     |     \
          /      |      \
         v       v       v
+----------------+  +----------------+  +----------------+
|   SubSystemA   |  |   SubSystemB   |  |   SubSystemC   |
+----------------+  +----------------+  +----------------+
| + OperationA() |  | + OperationB() |  | + OperationC() |
+----------------+  +----------------+  +----------------+

代码示例:

cs 复制代码
/// <summary>
/// 子系统A
/// </summary>
public class SubSystemA
{
    public void OperationA()
    {
        Console.WriteLine("子系统A的操作");
    }
}

/// <summary>
/// 子系统B
/// </summary>
public class SubSystemB
{
    public void OperationB()
    {
        Console.WriteLine("子系统B的操作");
    }
}

/// <summary>
/// 子系统C
/// </summary>
public class SubSystemC
{
    public void OperationC()
    {
        Console.WriteLine("子系统C的操作");
    }
}

/// <summary>
/// 外观类
/// </summary>
public class Facade
{
    private SubSystemA a = new();
    private SubSystemB b = new();
    private SubSystemC c = new();

    private void Operation1()
    {
        Console.WriteLine("执行外观方法 Operation1:");
        a.OperationA();
        b.OperationB();
    }

    public void Operation2()
    {
        Console.WriteLine("执行外观方法 Operation2:");
        b.OperationB();
        c.OperationC();
    }
}

/// <summary>
/// 客户端
/// </summary>
public class Client
{
    public static void Main()
    {
        Facade facade = new Facade();

        // 客户端只调用外观方法,而不直接访问子系统
        facade.Operation1();
        Console.WriteLine();
        facade.Operation2();
    }
}

特点:
优点:

· 简化调用:隐藏子系统的复杂性,客户端只需要和外观交互;

· 降低耦合:外观类和子系统之间相对独立,方便维护和扩展;

· 更好的分层结构;
缺点:

· 可能过度封装:如果外观类封装得太多,客户端将失去对子系统的灵活控制;

· 单点问题:外观类本身可能成为系统演化的瓶颈或单点故障;

· 扩展性受限:如果需求变动频繁,外观接口可能需要频繁修改,增加维护成本;

适用场景:

· 复杂系统需要简化调用时:子系统很多,调用步骤复杂,希望提供一个简单的接口;

· 分层架构中,层与层之间解耦:在三层架构、MVC 等场景里,外观模式能减少子系统之间的依赖;

· 客户端与多个子系统存在依赖时:外观可以作为"中间人",避免客户端直接依赖多个子系统,降低耦合度;

举例:

· 影院系统

· 战斗系统外观:客户端只需调用攻击敌人,而不用自己去调用角色、技能、Buff、动画、音效等多个系统;

· 游戏启动流程 :StartGame():统一完成"加载资源 → 播放BGM → 显示UI → 连接服务器",ExitGame():统一关闭网络、释放资源、保存进度;

· 背包系统:只需调用添加物品、减少物品,无需知道物品管理、UI、存档怎么操作;

相关推荐
mldong4 小时前
C# 开发者也有自己的轻量工作流引擎了:NuGet 装包,5 分钟跑通一条审批流
后端·c#·.net
kruptos5 小时前
分布式系统怎么“选主“?Raft 共识一次讲清
开发语言·分布式·php·共识算法
吴声子夜歌5 小时前
ApacheCommons——commons-cli(命令行参数解析)
java·开发语言·apache
benchmark_cc6 小时前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
王的宝库6 小时前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
Tairitsu_H6 小时前
[C++] 深入理解红黑树:封装set与map
开发语言·c++·set·map·红黑树·模拟实现
泡海椒6 小时前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
小智老师PMP6 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
samble7 小时前
从零搭建工业控制系统(二十二):线程安全与并发控制
c#·wpf·并发·mvvm·线程安全·工业控制
江畔柳前堤8 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native