【设计模式】外观模式

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

相关推荐
野犬寒鸦5 小时前
从零起步学习并发编程 || 第七章:ThreadLocal深层解析及常见问题解决方案
java·服务器·开发语言·jvm·后端·学习
云姜.5 小时前
java抽象类和接口
java·开发语言
xyq20245 小时前
Pandas 安装指南
开发语言
xixixin_5 小时前
【JavaScript 】从 || 到??:JavaScript 空值处理的最佳实践升级
开发语言·javascript·ecmascript
m0_736919106 小时前
C++中的委托构造函数
开发语言·c++·算法
lsx2024066 小时前
Python3 SMTP发送邮件教程
开发语言
懈尘6 小时前
从 Java 1.7 到 Java 21:逐版本深入解析新特性与平台演进
java·开发语言
凉辰6 小时前
使用uni.createInnerAudioContext()播放指定音频(踩坑分享功能)
开发语言·javascript·音视频
hello 早上好6 小时前
05_Java 类加载过程
java·开发语言
PPPPPaPeR.6 小时前
光学算法实战:深度解析镜片厚度对前后表面折射/反射的影响(纯Python实现)
开发语言·python·数码相机·算法