JAVA设计模式十八:--Facade(外观模式或门面模式)

Façade与Service的区别? 维度Service层Facade层核心职责实现具体业务逻辑整合多个Service,提供统一接口设计目的内聚业务,拆分职责简化调用,隔离复杂度粒度细粒度(单一操作)粗粒度(完整流程)调用方向被Facade或Controller调用被Controller或外部模块调用Service是“做事的人”,Facade是“协调做事的人”——前者负责具体执行,后者负责组织协调,共同构成清晰的业务分层架构。 阅读详情
Facade(外观)模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用。

Facade模式概述
        实际应用中,我们在对付一些老旧的code(尤其是将C的代码转成C++代码)或者即便不是老旧code,但涉及多个子系统时,除了重写全部代码
    (对于老旧code而言),我们还可能采用这样一种策略:重新进行类的设计,将原来分散在源码中的类/结构及方法重新组合,形成新的、统一的接口,
    供上层应用使用。
        这在某种意义上与Adapter及Proxy有类似之处,但是,Proxy(代理)注重在为Client-Subject提供一个访问的中间层,如CORBA可为应
    用程序提供透明访问支持,使应用程序无需去考虑平台及网络造成的差异及其它诸多技术细节;Adapter(适配器)注重对接口的转换与调整;而
    Facade所面对的往往是多个类或其它程序单元,通过重新组合各类及程序单元,对外提供统一的接口/界面。
Facade模式应用
    在遇到以下情况使用Facade模式:
          1、当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系
            统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。
          Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade层。
          2、客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移
        植性。
          3、当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点,如果子系统之间是相互依赖的,你可以让它们仅通过Facade
        进行通讯,从而简化了它们之间的依赖关系。

Facade模式优缺点
    Facade模式有下面一些优点:
      1、它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
      2、它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。
      松耦合关系使得子系统的组件变化不会影响到它的客户。Facade模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。Facade模式可以
    消除复杂的循环依赖关系。这一点在客户程序与子系统是分别实现的时候尤为重要。
      在大型软件系统中降低编译依赖性至关重要。在子系统类改变时,希望尽量减少重编译工作以节省时间。用Facade可以降低编译依赖性,限制重要系统中较
    小的变化所需的重编译工作。Facade模式同样也有利于简化系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。

      3、如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性和通用性之间加以选择。

图实例:

举例代码:

[java]  view plain copy print ?
  1. package design.facade;  
  2.   
  3. /** 
  4.  * 文件名称:ServiceA.java 
  5.  * 创建人:Fei Wong 
  6.  * 创建时间: Jun 29, 2012 
  7.  * 电子邮箱:feiwong8@126.com 
  8.  * */  
  9.   
  10. public interface ServiceA {  
  11.     /** 
  12.      * ServiceA 的A方法  
  13.      * */  
  14.     public void methodA() ;  
  15. }  
  16.   
  17.   
  18.   
  19. package design.facade;  
  20.   
  21. /** 
  22.  * 文件名称:ServiceAImpl.java 
  23.  * 创建人:Fei Wong 
  24.  * 创建时间: Jun 29, 2012 
  25.  * 电子邮箱:feiwong8@126.com 
  26.  * */  
  27.   
  28. public class ServiceAImpl implements ServiceA {  
  29.   
  30.     /* (non-Javadoc) 
  31.      * @see design.facade.ServiceA#methodA() 
  32.      */  
  33.     @Override  
  34.     public void methodA() {  
  35.         System.out.println( "methodA--> is runing" );   
  36.     }  
  37.   
  38. }  
  39.   
  40.   
  41.   
  42. package design.facade;  
  43.   
  44. /** 
  45.  * 文件名称:ServiceB.java 
  46.  * 创建人:Fei Wong 
  47.  * 创建时间: Jun 29, 2012 
  48.  * 电子邮箱:feiwong8@126.com 
  49.  * */  
  50.   
  51. public interface ServiceB {  
  52.     /** 
  53.      * ServiceB 的B方法 
  54.      * */  
  55.     public void methodB() ;  
  56. }  
  57.   
  58.   
  59.   
  60. package design.facade;  
  61.   
  62. /** 
  63.  * 文件名称:ServiceAImpl.java 
  64.  * 创建人:Fei Wong 
  65.  * 创建时间: Jun 29, 2012 
  66.  * 电子邮箱:feiwong8@126.com 
  67.  * */  
  68.   
  69. public class ServiceBImpl implements ServiceB {  
  70.       
  71.   
  72.     /* (non-Javadoc) 
  73.      * @see design.facade.ServiceA#methodA() 
  74.      */  
  75.     @Override  
  76.     public void methodB() {  
  77.         System.out.println( "methodB--> is runing" );   
  78.     }  
  79.   
  80. }  
  81.   
  82.   
  83.   
  84. package design.facade;  
  85.   
  86. /** 
  87.  * 文件名称:ServiceC.java 
  88.  * 创建人:Fei Wong 
  89.  * 创建时间: Jun 29, 2012 
  90.  * 电子邮箱:feiwong8@126.com 
  91.  * */  
  92.   
  93. public interface ServiceC {  
  94.     /** 
  95.      * ServiceC 的C方法 
  96.      * */  
  97.     public void methodC() ;    
  98. }  
  99.   
  100.   
  101.   
  102. package design.facade;  
  103.   
  104. /** 
  105.  * 文件名称:ServiceAImpl.java 
  106.  * 创建人:Fei Wong 
  107.  * 创建时间: Jun 29, 2012 
  108.  * 电子邮箱:feiwong8@126.com 
  109.  * */  
  110.   
  111. public class ServiceCImpl implements ServiceC {  
  112.       
  113.   
  114.     /* (non-Javadoc) 
  115.      * @see design.facade.ServiceA#methodA() 
  116.      */  
  117.     @Override  
  118.     public void methodC() {  
  119.         System.out.println( "methodC--> is runing" );    
  120.     }  
  121.   
  122. }  
  123.   
  124.   
  125.   
  126. package design.facade;  
  127. /** 
  128.  * 文件名称:Facade.java 
  129.  * 创建人:Fei Wong 
  130.  * 创建时间: Jun 29, 2012 
  131.  * 电子邮箱:feiwong8@126.com 
  132.  *  
  133.  * 外观模式 核心类 
  134.  * */  
  135.   
  136. public class Facade {  
  137.     ServiceA sa;  
  138.     ServiceB sb;  
  139.     ServiceC sc;  
  140.   
  141.     public Facade() {  
  142.         sa = new ServiceAImpl();  
  143.         sb = new ServiceBImpl();  
  144.         sc = new ServiceCImpl();  
  145.     }  
  146.   
  147.     public void methodA() {  
  148.         sa.methodA();  
  149.         sb.methodB();  
  150.     }  
  151.   
  152.     public void methodB() {  
  153.         sb.methodB();  
  154.         sc.methodC();  
  155.     }  
  156.   
  157.     public void methodC() {  
  158.         sc.methodC();  
  159.         sa.methodA();  
  160.     }  
  161.       
  162. }  
  163.   
  164.   
  165.   
  166. package design.facade;  
  167.   
  168. /** 
  169.  * 文件名称:Client.java 
  170.  * 创建人:Fei Wong 
  171.  * 创建时间: Jun 29, 2012 
  172.  * 电子邮箱:feiwong8@126.com 
  173.  * */  
  174.   
  175. public class Client {  
  176.   
  177.     /** 
  178.      * @param args 
  179.      */  
  180.     public static void main(String[] args) {  
  181.         ServiceA sa = new ServiceAImpl();  
  182.           ServiceB sb = new ServiceBImpl();  
  183.           sa.methodA();  
  184.           sb.methodB();  
  185.           System.out.println("=====================");  
  186.           Facade f = new Facade();  
  187.           f.methodA();  
  188.           f.methodB();  
  189.           f.methodC() ;  
  190.     }  
  191.   
  192. }  
HFSS仿真平行线定向耦合器学习笔记 材料:FR4(玻璃纤维环氧树脂),介电常数:4.4,损耗角正切:0.02,厚度0.8mm。扫频方式:快速扫频,扫频范围:1.0GHz~3.0GHz,步进:0.01GHz。端口2是端口1关于Y轴对称,端口3,端口4是端口1和端口2关于X轴对称得到。求解中心频率:2.0GHz,迭代次数:20,收敛误差为0.02。右键设置边界条件----辐射边界。激励方式:集总端口激励。 阅读详情

相关推荐

手把手教你用ArduPilot搭建低成本无人车(附APM飞控+有刷电调配置清单)

本文提供了一份基于ArduPilot开源平台搭建低成本智能无人车的详细实战指南。核心内容包括APM架构飞控的选型、双向有刷电调的兼容性配置与校准、系统连接逻辑,以及通过Mission Planner地面站进行参数调校和自主导航功能设置的完整流程,帮助爱好者快速实现从手动控制到自主行驶的跨越。

java5的博客 851

【设计模式】Java 设计模式之门面模式(Facade)

门面模式作为一种重要的设计模式,在简化复杂系统接口和提高可维护性方面发挥关键作用。它通过提供一个统一的高层接口,使得客户端无需关心底层实现的细节。在实际应用中,门面模式可根据需求进行扩展和变体设计,如分层门面、组合门面等。此外,门面模式常与其他设计模式结合使用,如中介者模式、工厂模式和单例模式,以构建更灵活的系统。未来,随着技术的发展,门面模式将可能面向云原生、结合AI技术,并注重跨平台与跨语言支持,同时加强安全与隐私保护。总之,门面模式将持续发挥重要作用,并在新的领域和场景中展现更多可能性,为构建高效、健

新手村长的专栏 2129

GD32F450以太网(2-2): PHY芯片IP101GR介绍

IP101是台湾省九阳电子公司生产制造的,符合IEEE 802.3/802.3u标准单端口快速以太网收发器100Mbps和10Mbps操作,它支持自动MDI/MDIX功能,简化网络安装和减少系统维护成本。支持Auto MDI/MDIX已内置4个49.9欧的精密电阻支持中断功能支持 MII/RMII 接口超低功耗

Zhichao_Zhang的博客 1万+

关于分层原则疑惑——Facade层与Service层的划分标准?

    传统的J2EE系统的分层,一般是WEB展示层、Web控制层、业务逻辑层、数据访问层。 各层的职责比较简单,控制层仅处理Web参数与数据并传递给业务逻辑层。而具体的业务逻辑放在Service层即业务逻辑层中。同时,事务的控制边界也在这一层。Dao层对数据库的操作,更简单的理解为对SQL的拼装。 上面的各层泛泛来讲,都容易理解。具体用法上,又会有一些延伸。比如说Dao层,有的由一...

三问飞絮 6251

手把手教你用LTspice仿真扬声器阻抗曲线(附Dayton/Focal型号库)

本文详细介绍了如何使用LTspice仿真软件构建高精度扬声器模型,包括获取Dayton/Focal等厂商的SPICE模型库、模型导入方法、阻抗测试电路搭建及仿真设置。通过手把手教学,帮助读者快速掌握扬声器阻抗曲线的仿真技术,提升音响系统设计效率。

weixin_26897585的博客 389

用Matlab搞定Delta并联机器人运动学:从建模到正逆解完整流程(附代码)

本文详细介绍了如何使用Matlab实现Delta并联机器人的运动学分析,包括几何建模、正逆解求解及可视化验证。通过符号计算和数值迭代法,解决非线性方程组问题,并提供完整代码示例,帮助读者快速掌握Delta机器人的运动学计算与应用。

weixin_30955617的博客 177

Java设计模式-外观模式(Facade)

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。

qq_37400096的博客 2371

立创开源PEX88048 8盘位M.2扩展卡硬件设计与PCIE4.0交换机应用解析

本文详细解析了基于Broadcom PEX88048 PCIe 4.0交换芯片的8盘位M.2扩展卡硬件设计。文章深入探讨了核心芯片选型、关键供电与安全设计、引脚配置、固件刷写方法,并重点剖析了PCIe 4.0时钟架构与高速PCB布局的核心思想,旨在帮助开发者理解如何设计高性能、高可靠性的存储扩展方案,并有效控制成本。

weixin_28949937的博客 620

Java设计模式-外观模式Facade

【代码】Java设计模式-外观模式Facade。

老徐的博客只有干货 1450

SPEI计算避坑指南:gma中Distribution和FitMethod参数怎么选?

本文深入探讨了在SPEI计算中如何科学选择gma库中的Distribution和FitMethod参数,帮助研究者避开常见陷阱。详细分析了LogLogistic、Gamma和Pearson3三种分布的适用场景,以及LMoment与MLE拟合方法的优缺点,为气象干旱研究提供实用指南。

weixin_30308101的博客 250

用一组可复现实验讲清 ABAP 内表 Standard / Sorted / Hashed 的性能差异

摘要(150字): SAP项目中性能问题常源于ABAP内表选型不当。标准表(STANDARD TABLE)写入快但查找慢(线性扫描),适合遍历场景;排序表(SORTED TABLE)保持有序,支持二分查找,适合范围查询;哈希表(HASHED TABLE)基于唯一键实现常数级查找,适合高频精确匹配。实验表明:标准表+BINARY SEARCH需预排序,成本可能高于直接使用排序表;哈希表在键匹配时性能最优。Gateway和RAP场景中,内表选型直接影响接口响应,建议根据读写负载(追加/遍历/精确查找)选择对应类

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 203

Java中的24种设计模式

一、策略模式【STRATEGY PATTERN】 二、代理模式【PROXY PATTERN】 三、单例模式【SINGLETON PATTERN】 四、多例模式【MULTITION PATTERN】 五、工厂方法模式【FACTORY METHOD PATTERN】 六、抽象工厂模式【ABSTRACT FACTORY PATTERN】 七、门面模式【FACADE PATTERN】 八、适

814

【代码审计】专栏文章汇总

代码审计基础 代码审计基础 源代码审计思路(上) 源代码审计思路(下) 常见漏洞审计 认证会话管理(上) 认证会话管理(下) 输入输出验证 授权管理审计 业务安全审计 第三方组件审计

武天旭的博客 4845

Java设计模式视频讲解

设计模式(JAVA) 视频网址: http://www.qghkt.com/ 设计模式(JAVA)视频地址: https://ke.qq.com/course/318643?tuin=a508ea62 目 录一、设计模式简介二、面向对象设计七大原则三、UML图例说明四、Singleton五、Builder六、Factory Method七、Abstract ...

weixin_30636089的博客 234

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java中23种常见的设计模式

转自 http://geek.youkuaiyun.com/news/detail/112634?ref=myreadJava总共有23中常见的设计模式。它们主要可以分为3类,创建型,结构型以及行为型。 创建型的设计模式有:一、Singleton,单例模式:保证一个类只有一个实例,并提供一个唯一的全局访问点。二、Abstract Factory,抽象工厂:提供一个创建一系列相关或者互相依赖的对象的接口,而无

司马懿的西山居 1410

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

java 23种设计模式

设计模式主要分三个类型:创建型、结构型和行为型。 其中创建型有: 一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。 三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类

我的编程之路 697

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java设计模式分类

设计模式主要分三个类型:创建型、结构型和行为型。 其中创建型有: 一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点。 二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。 三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个

LXM的专栏 597

27种设计模式

经过几天时间的努力,整理,设计模式的demo和资料基本整理完成,首先声明,这些资料部分从网上找的,还有部分是用了>书中的例子,里面的模式也是照着这书上的划分的,很不错的一本书,想学习设计模式的同学可以看看。先说说我的体会,每次看设计模式,总会有新的体会,这是第三次我复习复习这方面的知识了,感觉还不错,但是时间久了估计还是会忘,所以最好的办法还是找个例子,忘得时候看看怎么用就行了,我的demo把27

zhang31jian的专栏 2202

java设计模式总结

java设计模式总结,方便大家一起学习,我把相关的设计模式列在一起,希望对大家有用:设计模式之Factory(一) 设计模式之Prototype(二) 设计模式之Builder(三) 设计模式之Singleton(四) 设计模式之Facade(五) 设计模式之Proxy(六) 设计模式之Adapter(七) 设计模式之Composite(八) 设计模式之Decorator(九) ...

iteye_4343的博客 162

JAVA23种设计模式

设计模式主要分三个类型:创建型、结构型和行为型。 其中创建型有: 一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。 三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决...

xiaoxia 107

java 模式 三

 结构型有:     十七、Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。     十八、Facade,外观模式:为子系统中的一组接口提供一致的界面,fa?ade提供了一高层接口,这个接口使得子系统更容易使用。     十九、Proxy,代理模式:为其他对象提供一种代理以控制对这个对象的访问

滕巍的专栏 570

java面试 之设计模式

设计模式主要分三个类型:创建型、结构型和行为型。 其中创建型有: 一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。 三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类...

810364804 84

java 设计模式

设计模式主要分三个类型:创建型、结构型和行为型。 其中创建型有: 一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。 三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化

莹未来 449

JAVA设计模式

设计模式主要分三个类型:创建型、结构型和行为型。 其中 创建型有:   一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点   二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。   三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化...

weixin_30678821的博客 68

Java常用设计模式

其中创建型有:  一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。 三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。 四、Builde...

weixin_34378922的博客 70
上一篇: JAVA设计模式十七:--Composite(组合模式)
下一篇: 【Android】应用语言切换的三种方法
SuperDream
博客等级 码龄14年 5粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值