第10章 外观模式(Façade Pattern)

简介: 原文   第10章 外观模式(Façade Pattern) 概述:      在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?这就是要说的Façade 模式。

原文   第10章 外观模式(Façade Pattern)

概述:

 

   在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?这就是要说的Façade 模式。

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

 

结构图:

 

这里在附上一个有助于理解的图

未使用外观模式

 

使用外观模式后

 

 

外观模式在我们的开发中其实用的非常的多,随处可见,我这里就随便举个例子(可能不是很恰当,但是一看基本就懂了)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
     /// <summary>
     /// 方法一
     /// </summary>
     public   class  Method1
     {
         public  void  GetMsg()
         {
             Console.WriteLine( "男的" );
          }
     }
     /// <summary>
     /// 方法二 
     /// </summary>
     public  class  Method2
     {
         public  void  GetMsg()
         {
             Console.WriteLine( "女的" );
         }
     }

客户端调用,男的调用方法一,女的调用方法二(好吧这个是个公厕入口)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
     class  Program
     {
         static  void  Main( string [] args)
         {
            //平常的方法
             string  sex =  "男" ;
             
             if  (sex ==  "男" )
             {
                 Method1 m =  new  Method1();
                 m.GetMsg();
             }
             else  if  (sex ==  "女" )
             {
                 Method2 m =  new  Method2();
                 m.GetMsg();
             }
             Console.ReadLine();
         }
     }

这样做是合理的,但是我们在调用的时候希望更简单,不需要这么多的逻辑判断,你给一个接口给我,我把参数传进去,就完事了。好,我们用外观来实现这种效果。

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
32
33
34
35
36
37
38
39
40
41
     /// <summary>
     /// 外观场景
     /// </summary>
     public  class  Facade
     {
         public  void  GetMsg( string  sex)
         {
 
             if  (sex ==  "男" )
             {
                 Method1 m =  new  Method1();
                 m.GetMsg();
             }
             else  if  (sex ==  "女" )
             {
                 Method2 m =  new  Method2();
                 m.GetMsg();
             }
           
         }
     }
     /// <summary>
     /// 方法一
     /// </summary>
     public  class  Method1
     {
         public  void  GetMsg()
         {
             Console.WriteLine( "男的" );
         }
     }
     /// <summary>
     /// 方法二 
     /// </summary>
     public  class  Method2
     {
         public  void  GetMsg()
         {
             Console.WriteLine( "女的" );
         }
     }

客户端调用

1
2
3
4
5
6
7
8
9
10
11
12
     class  Program
     {
         static  void  Main( string [] args)
         {
             //平常的方法
             string  sex =  "男" ;
             Facade facde =  new  Facade();
             facde.GetMsg(sex);
             Console.ReadLine();
 
         }
     }

使用外观模式之后,是不是感觉调用起来非常的简介。相信这个模式大家都会用!

 

适用性:

 

1.为一个复杂子系统提供一个简单接口。

2.提高子系统的独立性。

3.在层次化结构中,可以使用Facade模式定义系统中每一层的入口。

 

总结:

 

Façade模式注重的是简化接口,它更多的时候是从架构的层次去看整个系统,而并非单个类的层次。

从客户程序的角度来看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果----内部子系统的任何变化不会影响到Facade接口的变化

 

设计模式系列文章http://www.diyibk.com/post/39.html

目录
相关文章
|
安全 Linux 程序员
在Linux中,什么是系统调用?举例说明其作用是什么?
在Linux中,什么是系统调用?举例说明其作用是什么?
|
存储 算法 大数据
倚天性能优化--基于倚天优化后的zstd在大数据场景应用:降低存储成本+提升重IO场景性能
倚天性能优化--基于倚天优化后的zstd在大数据场景应用:降低存储成本+提升重IO场景性能
|
7天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1167 3
|
6天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
854 12
|
16天前
|
人工智能 运维 安全
|
5天前
|
机器学习/深度学习 物联网
Wan2.2再次开源数字人:Animate-14B!一键实现电影角色替换和动作驱动
今天,通义万相的视频生成模型又又又开源了!Wan2.2系列模型家族新增数字人成员Wan2.2-Animate-14B。
445 10
|
7天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
329 0
|
14天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!