找回密码
 立即注册
首页 业界区 业界 外观模式

外观模式

鞣谘坡 2025-6-6 19:54:21
外观式定义

为子系统中的一组接口提供一个一致的界面,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
界面

在这里提到的界面,主要指的是从一个组件外部来看这个组件,能够看到什么,这就是这个组件的界面,也就是所说的外观。
接口

在这里提到的接口,主要指的是外部和内部交互的这么一个通道,通常是指一些方法,可以是类的方法,也可以是 interface 的方法。也就是说,这里所说的接口,并不等价于 interface,也有可能是一个类。
外观模式的结构和说明

Facade

定义子系统的多个模块对外的高层接口,通常需要调用内部多个模块,从而把客户的请求代理给适当的子系统对象。
模块

接受 Facade 对象的委派,真正实现功能,各个模块之间可能有交互。
但是请注意,Facade 对象知道各个模块,但是各个模块不应该知道 Facade 对象。
代码示例
  1. using System;
  2. namespace NetCore3Console.Facade
  3. {
  4.     /// <summary>
  5.     /// A模块的接口
  6.     /// </summary>
  7.     public interface AModuleApi
  8.     {
  9.         /// <summary>
  10.         /// 示意方法,A模块 对外的一个功能方法
  11.         /// </summary>
  12.         void TextA();
  13.     }
  14.     public class AModuleImpl : AModuleApi
  15.     {
  16.         public void TextA()
  17.         {
  18.             Console.WriteLine("现在在A模块里面操作testA方法");
  19.         }
  20.     }
  21.     /// <summary>
  22.     /// B模块的接口
  23.     /// </summary>
  24.     public interface BModuleApi
  25.     {
  26.         /// <summary>
  27.         /// 示意方法,A模块 对外的一个功能方法
  28.         /// </summary>
  29.         void TextB();
  30.     }
  31.     public class BModuleImpl : BModuleApi
  32.     {
  33.         public void TextB()
  34.         {
  35.             Console.WriteLine("现在在B模块里面操作testB方法");
  36.         }
  37.     }
  38.     /// <summary>
  39.     /// C模块的接口
  40.     /// </summary>
  41.     public interface CModuleApi
  42.     {
  43.         /// <summary>
  44.         /// 示意方法,A模块 对外的一个功能方法
  45.         /// </summary>
  46.         void TextC();
  47.     }
  48.     public class CModuleImpl : CModuleApi
  49.     {
  50.         public void TextC()
  51.         {
  52.             Console.WriteLine("现在在B模块里面操作testC方法");
  53.         }
  54.     }
  55.     /// <summary>
  56.     /// 外观对象
  57.     /// </summary>
  58.     public class Facade
  59.     {
  60.         /// <summary>
  61.         /// 示意方法,满足客户需要的功能
  62.         /// </summary>
  63.         public void Test()
  64.         {
  65.             //在内部实现的时候,可能会调用到内部的多个模块
  66.             AModuleApi a = new AModuleImpl();
  67.             a.TextA();
  68.             BModuleApi b = new BModuleImpl();
  69.             b.TextB();
  70.             CModuleApi c = new CModuleImpl();
  71.             c.TextC();
  72.         }
  73.     }
  74. }
复制代码
模式讲解

外观模式的目的

外观模式的目的不是给子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交瓦,松散耦合,从而让外部能够更简单地使用子系统。
外观模式的实现

Facade的实现

对于一个子系统而言,外观类不需要很多,通常可以实现成为一个单例。也可以直接把外观中的方法实现成为静态的方法,这样就可以不需要创建外观对象的实例而直接调用,这种实现相当于把外观类当成一个辅助工具类实现。
Facade的方法实现

Facade的方法实现中,一般是负责把客户端的请求转发给子系统内部的各个模块进行处理,Facade 的方法本身并不进行功能的处理,Facade 的方法实现只是实现一个功能的组合调用。
思考外观模式

外观模式的本质

外观模式的本质是:封装交互,简化调用。
Facade 封装了子系统外部和子系统内部多个模块的交互过程,从而简化了外部的调用。通过外观,子系统为外部提供一些高层的接口,以方便它们的使用。
对设计原则的体现

外观模式很好地体现了“最少知识原则”。
外观模式就是新添加了个Facede类,在这里面组合调用其他方法呀。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册