【设计模式】外观模式

外观模式(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、存档怎么操作;

相关推荐
普通人640 分钟前
php+html+canvas实现树状打开的结构
开发语言·javascript·html5·1024程序员节
电商API_180079052471 小时前
反向海淘多币种结算:汇率该在哪个时点被冻结
java·开发语言·数据库·跨境电商·1688 api
开开心心就好2 小时前
多份文档怎么批量打印?支持多种格式
java·服务器·开发语言·pdf·ocr·散列表·启发式算法
Want5952 小时前
Python炫酷烟花①
开发语言·python
星夜离尘562 小时前
MATLAB 线性去趋势为何损伤低频正弦:联合最小二乘估计幅相与漂移
开发语言·matlab
bigbread3 小时前
策略模式 + 工厂方法模式在项目中的实战应用
设计模式
用户788477316343 小时前
用 C# 把每周 6 小时的 PDF 录入干到 20 分钟:一份可复制的桌面 OCR 方案
c#
程序员清风3 小时前
双指针与滑动窗口:高效处理连续区间
开发语言·算法
高晶3 小时前
C 语言实现 BMS 系统中 SPI 通信协议实战指南
设计模式·程序员
代钦塔拉3 小时前
【C++/Qt 进阶】设计模式系列(2):工厂模式——从游戏角色到披萨店
c++·算法·设计模式