-
2021-02-26 18:09:04
GOF《设计模式》一书对Facade模式是这样描述的:
为子系统中的一组接口提供一个统一接口。Facade模式定义了一个更高层的接口,使子系统更加容易使用。
大致意思是说:使用一种比原有方式更简单的办法与系统交互。例如,我们把一个很文件的文件,放在了第二抽屉里,而第二个抽屉的钥匙放在了第一个抽屉里,我们要想取出这个文件,第一步肯定要拿到第一个抽屉的钥匙,然后打开它再拿出第二个抽屉的钥匙,最后打开第二个抽屉取出文件。
我就上面说的那个情形写一下实现代码,首先我们要实现二个子系统,呵呵,把抽屉比喻成系统,有点夸张了(DrawerOne、DrawerTwo):
classDrawerOne {
publicvoidopen(){
System.out.println("第一个抽屉被打开了");
getKey();
}
publicvoidgetKey(){
System.out.println("得到第二个抽屉的钥匙");
}
}
classDrawerTwo{
publicvoidopen(){
System.out.println("第二个抽屉被打开了");
getFile();
}
publicvoidgetFile(){
System.out.println("得到这个重要文件");
}
}
publicclassClient{
publicstaticvoidmain(String []args){
DrawerOne darwerOne=newDrawerOne();
DrawerTwo darwerTwo=newDrawerTwo();
darwerOne.open();
darwerTwo.open();
}
}
由于没有使用Façade模式,可以看到要想得到这个文件要首先打开第一个抽屉,然后再打开第二个抽屉,在我们实际所开发的系统中,有时候客户要实现某一操作,并不需要知道实现这一操作的详细步骤,而是简单地点击某一个按钮就可以得到自己想要的结果。下面对上面的代码使用Façade模式进行改进,建立一个FacadeDrawer类:
classDrawerFacade{
DrawerOnedarwerOne=newDrawerOne();
DrawerTwodarwerTwo=newDrawerTwo();
publicvoidopen(){
darwerOne.open();
darwerTwo.open();
}
}
修改Client类:
publicclassDrawerClient{
publicstaticvoidmain(String []args){
DrawerFacade drawer=newDrawerFacade();
drawer.open();
}
}
输出结果如下:
第一个抽屉被打开了
得到第二个抽屉的钥匙
第二个抽屉被打开了
得到这个重要文件
正如上面所说,客户端client,它并不需要关心子系统,而是关心DrawerFacade所留下来的和外部交互的接口,而子系统在DrawerFacade的聚合。
以上只是个人拙见,哪里有不正确的地方,希望大家多多批评指正。^_^
Facade模式主要适用于以下几种情况:
1)不需要使用一个复杂系统的所有功能,而且可以创建一个新的类,包含访问系统的所有规则。如果只需要使用系统的部分功能,那么你为新类所创建的API将比原系统的API简单的多。
2)希望封装或者隐藏系统原系统。
3)希望使用原系统的功能,而且还希望增加一些新的功能。
4)编写新类的成本小于所有人学会使用或者未来维护原系统上所需的成本。
更多相关内容 -
Python笔记之facade模式
2020-09-18 10:43:06主要为大家详细介绍了Python笔记之facade模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
Facade模式
2019-03-22 01:37:26NULL 博文链接:https://gary0416.iteye.com/blog/904436 -
设计模式-Facade模式
2021-08-17 15:36:52门面(Facade)模式的理解与应用 概念 门面模式,指子系统的外部与其内部的通信必需通过一个统一的门面(Facade)对象进行,示意图如下: 应用场景 为一个复杂子系统提供一个简单接口 子系统常常因为不断...门面(Facade)模式的理解与应用
概念
门面模式,指子系统的外部与其内部的通信必需通过一个统一的门面(Facade)对象进行,示意图如下:
应用场景
- 为一个复杂子系统提供一个简单接口
子系统常常因为不断演变而变得异常复杂,使用门面模式,对于客户端可以提供一个简单的接口,便于客户的调用。
- 保持子系统的独立性
使用Façade,可以分离子系统和客户端,保持子系统的独立性。
- 层次化结构
在构建层次化系统架构时,可以使用Façade模式定义系统中每一层的入口,限定层之间仅能通过Façade进行通信。例如Comtop最小系统中的man层,可以认为是DAO层对于AppService层的Façade。
-
13.设计模式--外观模式(Facade模式)
2021-11-08 15:47:301.定义 Facade模式名为外观模式,是一种结构型模式,外观模式是一种非常简单的设计模式。当系统过于复杂时,如果需要调用多个子系统来完成业务,此时会变的非常的复杂,而外观模式则是开一个窗口,相当于一个中介来...1.定义
Facade模式名为外观模式,是一种结构型模式,外观模式是一种非常简单的设计模式。当系统过于复杂时,如果需要调用多个子系统来完成业务,此时会变的非常的复杂,而外观模式则是开一个窗口,相当于一个中介来帮你整合你要调用的子系统,而调用者只需要关心这个窗口就行了。
例如现在我需要开一家公司,开公司需要工商注册、银行开户、纳税登记而我作为一个开公司的人(不差钱),此时我觉得太麻烦了还有这么多流程,此时我就找了一个叫外观模式的人帮我办理。而我只需要关注这个外观模式的人就行了。
2.外观模式结构图
Facade就是一个窗口,注册公司的流程都由他来处理,而AdminOfIndustry、Bank、Taxation分别表示工商注册、银行开户和纳税登记。
3.外观模式实现
Company就是公司的实体,包含了公司名字,公司法人等字段。还对外提供了构造方法,这是方便于注册公司的时候进行调用,而注册公司则是通过AdminOfIndustry来实现的。
AdminOfIndustry代表的是工商注册,也就是工商局,直接调用Company来生成公司的实例。
Bank代表的银行开户,通过openAccount方法,来根据公司名字注册一个银行卡,其中包括了银行卡属于的公司以及卡号。
Taxation代表的纳税登记,其中applyTaxCode则是通过公司名字进行一个纳税登记,所以Taxation中存放了公司名称。
Facade是帮我们去注册公司的人,名字就叫外观吧,我们只需要给他提供自己要注册的公司名字以及法人,而至于跑工商局,跑银行以及去税务局都是这个人来。所以在Test中我们只是给了要注册的名字以及法人,这样公司就已经注册完成了。通过打印可以看到公司名字以及法人信息。
外观模式中登场的角色
Facade(窗口)角色,用于将复杂的系统进行整合然后暴露出一个窗口提供给调用者,文中由Facade类进行扮演。
构成系统的许多其他角色,这些角色各自完成各自的工作,他们并不知道Facade觉得,而Facade则是对他们的一个整合,文中由AdminOfIndustry、Bank、Taxation进行扮演此角色。
Client(请求者),用于发起调用,也就是注册公司的发起者,文中由Test类扮演此角色。参考文献《图解设计模式》、廖雪峰的官网。
代码获取地址:https://gitee.com/bughong/design-pattern
-
Java设计模式之外观模式(Facade模式)介绍
2020-09-03 22:17:40主要介绍了Java设计模式之外观模式(Facade模式)介绍,外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面,需要的朋友可以参考下 -
facade模式
2021-02-28 22:04:37facade模式:将内部复杂的类关系,整合成一个统一对外的接口,就像银行柜台一样,有柜员给你提供服务,你不用了解内部是怎么流转的。 Client:调用者类 Facade:对外暴露的接口 ClassA:提供具体服务的内部类A ...facade模式:将内部复杂的类关系,整合成一个统一对外的接口,就像银行柜台一样,有柜员给你提供服务,你不用了解内部是怎么流转的。
Client:调用者类
Facade:对外暴露的接口
ClassA:提供具体服务的内部类A
ClassB:提供具体服务的内部类B
ClassC:提供具体服务的内部类C
ClassD:提供具体服务的内部类D -
C++ Facade模式
2015-02-04 10:21:0923种设计模式之十一(结构型模式)Facade模式 -
Java中的Facade模式
2021-03-19 08:03:13什么是Facade模式随着系统越来越复杂,我们需要把细节隐藏起来,给客户端提供一个统一的接口。在这种需求下facade模式诞生了。该模式比较简单,我们只需要在系统变得复杂把它运用上来,这样底层跟客户端就能够很大... -
C++设计模式之Facade模式(外观模式)
2018-07-19 15:01:17Facade模式(外观模式),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。 我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会... -
设计模式:Facade模式
2018-06-09 11:18:01Facade模式——简单窗口 当调用大型程序进行处理时,我们需要格外注意那些数量庞大的类之间错综复杂的关系。不过有一种更简单的做法,就是为这个大型程序提供一个“窗口”。这样,我们就不必单独地关注每个类了,只... -
Facade模式简述
2019-03-23 09:30:01Facade模式的主要思想: 为子系统中的一组接口提供一个统一的接口, 定义了一个更高层的接口, 使子系统更加容易使用. 意思是说, 我们需要用一种比原有方式更简单的办法与系统交互, 或者说, 我们需要以一种特殊方式... -
Facade 模式
2019-12-04 09:25:44使用Facade模式可以为互相关联在一起的错综复杂的类整理出高层接口(API)。其中的Facade角色可以让系统对外只有一个简单的接口(API)。而且,Facade角色还会考虑系统内部各个类之间的责任关系和依赖关系,按照正确... -
Facade模式在EJB中的应用研究 (2006年)
2021-05-22 01:57:24探讨了典型的Facade设计模式,并介绍了设计和使用Facade模式的一些规则。结合Facade模式的特点,将其应用到实例中,表明应用该模式能够缩短软件的开发时间,并能提高软件的复用性、可维护性、和可移植性。 -
外观模式(Facade模式)详解
2021-05-09 00:27:03外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低... -
门面模式(Facade模式)详解
2020-03-18 09:24:36外观模式的定义与特点 外观(Facade)模式的定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的... -
Facade模式练习
2019-03-16 01:30:03NULL 博文链接:https://redhacker.iteye.com/blog/415459 -
设计模式之-------facade模式(应用实例)
2018-12-24 21:21:411. log4j + slf4j 类似JDBC的设计理念。 ...它只是提供一套接口规范,自身不负责日志...在工程中要想使用slf4j + log4j的模式,就额外需要一个适配器(slf4j + log4j12)来解决接口不兼容的问题。 -
设计模式1,FACADE模式,Adapter
2011-05-10 14:38:17设计模式1,FACADE模式,Adapter facade Adapter singleton proxy -
java设计模式之Facade模式
2018-07-05 14:14:17介绍外观模式之前,首先让我们来看下面的例子:假设我们现有一个对外接口FacadeService,里面有一个对外的方法a();public interface FacadeService { public void a();//这个方法是给外部调用的 }他有一个实现类... -
外观模式(Facade模式)
2021-11-08 01:12:04这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。 图 1 给出了客户去当地...