外观(Facade)模式又称门面模式,感觉这是设计模式中一个比较容易理解的模式,GOF对其所起作用描述为:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层的接口,这个接口使得这一子系统更加容易使用。Facade的形象化描述可以借用GOF一书中的插图进行表述,如下:
《Java与模式》一书中举了一个例子,就是医院就诊问题,如果说医院是一个系统的话,其中各个室相当于一个子系统,运营管理差的医院可能需要病人自行去办理各个室的业务,运营管理好的医院则可以为病人提供有关接待员,由这个接待员为病人办理相关手续,病人不需要折腾地去与各个室打交道,而且病人也不了解各个室的情况,由接待员办理岂不是效率更高,这个接待员就相当于Facade,也就是医院系统的外观,它能与医院的子系统进行交互,而不需要病人亲自去与子系统交互。
对上述例子的代码实现效果如下:

1 class Patients{ 2 private Server server; 3 public Patients(Server server){ 4 this.server=server; 5 } 6 public void kanbin(){ 7 System.out.println("我要看病"); 8 server.server(); 9 } 10 } 11 class Server{ 12 public void server(){ 13 System.out.println("我是接待员,我来为您服务"); 14 (new GuaHao()).guahao(); 15 (new MenZen()).menzen(); 16 (new HuaJia()).huajia(); 17 (new QuYao()).quyao(); 18 } 19 } 20 class MenZen{ 21 public MenZen(){} 22 public void menzen(){ 23 System.out.println("门诊"); 24 } 25 } 26 class GuaHao{ 27 public GuaHao(){} 28 public void guahao(){ 29 System.out.println("挂号"); 30 } 31 } 32 class QuYao{ 33 public QuYao(){} 34 public void quyao(){ 35 System.out.println("取药"); 36 } 37 } 38 class HuaJia{ 39 public HuaJia(){} 40 public void huajia(){ 41 System.out.println("划价"); 42 } 43 } 44 public class Test{ 45 46 public static void main(String[] args){ 47 Patients p=new Patients(new Server()); 48 p.kanbin(); 49 } 50 }
通常来说,只需要一个Facade,因此Facade的设计经常设计为单例模式,但是这里没给出那么具体的实现,从宏观上讲,外观模式提供的是一种封装,将子系统进行“封装”起来(这些子系统有各自的定义),在设计原则中,有一个“迪米特法则”,就是“只与你直接的朋友通信”,只要可能,朋友越少越好,因为这也就意味着系统耦合度降低,不管怎样,我们都应该尽量避免不必要的直接通信。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?