随笔 - 77  文章 - 1 评论 - 10 阅读 - 68913
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

外观(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 }
View Code
复制代码

通常来说,只需要一个Facade,因此Facade的设计经常设计为单例模式,但是这里没给出那么具体的实现,从宏观上讲,外观模式提供的是一种封装,将子系统进行“封装”起来(这些子系统有各自的定义),在设计原则中,有一个“迪米特法则”,就是“只与你直接的朋友通信”,只要可能,朋友越少越好,因为这也就意味着系统耦合度降低,不管怎样,我们都应该尽量避免不必要的直接通信。

 

posted on   Judy518  阅读(113)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示