【设计模式】外观模式

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

相关推荐
gugucoding9 小时前
46. 【Java】JUC并发工具:让并发更简单
java·开发语言
Nebula_g10 小时前
JavaSE基础语法:面向对象高级(代码中的成分)
java·开发语言·编程·javase·技术栈·高级语法
for_ever_love__10 小时前
python基础语法学习: 异常的传递性
开发语言·python·学习
依然鸣11 小时前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
库玛西12 小时前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
liulilittle13 小时前
无锁并发容器的设计与实现原理
开发语言·c++·set·map·并发·无锁·lock-free
朋克洛德的码农13 小时前
Go并发-sync包四剑客:Mutex、RWMutex、WaitGroup、Once-从入门到原理
开发语言·后端·golang
艺艺生辉13 小时前
从if-else到策略模式
后端·设计模式
小林ixn14 小时前
单例模式:从弹窗管理到全局状态,一个模式搞定
前端·javascript·设计模式
淼澄研学14 小时前
Kimi API黑产倒卖技术解析与Python合规接入指南
开发语言·网络·python