【设计模式】外观模式

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

相关推荐
weixin_5134499619 分钟前
walk_these_ways项目学习记录第八篇(通过行为多样性 (MoB) 实现地形泛化)--策略网络
开发语言·人工智能·python·学习
飞Link24 分钟前
逆向兼容的桥梁:3to2 自动化降级工具实现全解析
运维·开发语言·python·自动化
曾阿伦32 分钟前
Python3 文件 (夹) 操作备忘录
开发语言·python
dong__csdn41 分钟前
jdk添加信任证书
java·开发语言
南 阳1 小时前
Python从入门到精通day64
开发语言·python
花千树-0102 小时前
Java 接入多家大模型 API 实战对比
java·开发语言·人工智能·ai·langchain·ai编程
UXbot2 小时前
AI原型设计工具评测:从创意到交互式Demo,5款产品全面解析
前端·ui·设计模式·ai·ai编程·原型模式
上海合宙LuatOS2 小时前
LuatOS扩展库API——【exremotecam】网络摄像头控制
开发语言·网络·物联网·lua·luatos
feng_you_ying_li2 小时前
C++11,{}的初始化情况与左右值及其引用
开发语言·数据结构·c++
xiaotao1312 小时前
JS new 操作符完整执行过程
开发语言·前端·javascript·原型模式