外观模式(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、存档怎么操作;
【设计模式】外观模式
大飞pkz2025-09-26 15:32