Java设计模式 十一 外观模式 (Facade Pattern)

【Java设计模式】Java设计模式之(二十二)外观模式(Facade Pattern) 这种类型的设计模式属于结构型模式。 一、组合模式介绍 1.1 含义 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。 这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。 在日常编码工作中,我们都在有意无意的大量使用外观模式。只要是上层模块需要调度多个子系统(2个以上的类对象),我们都会自觉地创建一个新的类封装这些子系统,提供 阅读详情

外观模式 (Facade Pattern)

外观模式是一种结构型设计模式,其核心思想是为子系统中的一组接口提供一个统一的高层接口,使得子系统的使用更加简单。外观模式通过创建一个外观类(Facade),将复杂的子系统接口封装起来,客户端只需要与外观类交互,而不需要直接与子系统的各个类交互。


1. 外观模式的组成

外观模式通常包括以下角色:

  • Facade(外观类): 提供一个统一的接口,简化客户端与子系统的交互。外观类是客户端与子系统之间的桥梁。
  • Subsystem(子系统类): 完成实际的工作。外观类通过它们提供的接口来简化对外提供的服务。
  • Client(客户端): 客户端只通过外观类与子系统进行交互,而无需直接访问子系统的复杂接口。

2. 外观模式的优点

  1. 简化接口: 为复杂的子系统提供了一个简洁的接口,简化了客户端的使用。
  2. 解耦: 客户端与子系统之间的交互通过外观类来完成,减少了客户端与多个子系统类的耦合。
  3. 提高可维护性: 随着系统的复杂性增加,外观模式能使代码更加模块化,便于维护和扩展。

3. 外观模式的缺点

  1. 可能引入不必要的复杂性: 如果子系统本身并不复杂,使用外观模式可能会增加系统的复杂性。
  2. 不符合“开闭原则”: 外观模式有时可能会使得子系统的扩展受到限制,特别是在子系统内部需要提供更多的功能时,外观类可能需要不断修改。

4. 外观模式的实现

场景示例:智能家居系统

我们假设有一个智能家居系统,包含多个子系统:照明系统、空调系统、音响系统等。每个子系统都有自己的复杂接口,客户端需要控制这些设备。

我们使用外观模式提供一个统一的接口,让客户端通过外观类简单地控制所有设备。


1) 定义子系统

每个子系统代表一个设备,如照明、空调和音响。

// 照明系统
public class Light {
    public void turnOn() {
        System.out.println("The light is ON.");
    }

    public void turnOff() {
        System.out.println("The light is OFF.");
    }
}

// 空调系统
public class AirConditioner {
    public void turnOn() {
        System.out.println("The air conditioner is ON.");
    }

    public void turnOff() {
        System.out.println("The air conditioner is OFF.");
    }

    public void setTemperature(int temperature) {
        System.out.println("The air conditioner temperature is set to " + temperature + "°C.");
    }
}

// 音响系统
public class SoundSystem {
    public void turnOn() {
        System.out.println("The sound system is ON.");
    }

    public void turnOff() {
        System.out.println("The sound system is OFF.");
    }

    public void setVolume(int volume) {
        System.out.println("The sound system volume is set to " + volume + ".");
    }
}

2) 定义外观类

外观类将所有子系统功能封装到一起,提供一个简洁的接口。

// 外观类
public class SmartHomeFacade {
    private Light light;
    private AirConditioner airConditioner;
    private SoundSystem soundSystem;

    public SmartHomeFacade(Light light, AirConditioner airConditioner, SoundSystem soundSystem) {
        this.light = light;
        this.airConditioner = airConditioner;
        this.soundSystem = soundSystem;
    }

    public void turnOnAll() {
        System.out.println("Turning on all systems...");
        light.turnOn();
        airConditioner.turnOn();
        soundSystem.turnOn();
    }

    public void turnOffAll() {
        System.out.println("Turning off all systems...");
        light.turnOff();
        airConditioner.turnOff();
        soundSystem.turnOff();
    }

    public void setAirConditionerTemperature(int temperature) {
        airConditioner.setTemperature(temperature);
    }

    public void setSoundSystemVolume(int volume) {
        soundSystem.setVolume(volume);
    }
}

3) 客户端代码

客户端只需要与外观类交互,而不需要关心各个子系统的具体操作。

public class Client {
    public static void main(String[] args) {
        // 创建子系统对象
        Light light = new Light();
        AirConditioner airConditioner = new AirConditioner();
        SoundSystem soundSystem = new SoundSystem();

        // 创建外观对象
        SmartHomeFacade smartHome = new SmartHomeFacade(light, airConditioner, soundSystem);

        // 使用外观类简化操作
        smartHome.turnOnAll();
        smartHome.setAirConditionerTemperature(22);
        smartHome.setSoundSystemVolume(50);
        smartHome.turnOffAll();
    }
}

运行结果:
Turning on all systems...
The light is ON.
The air conditioner is ON.
The sound system is ON.
The air conditioner temperature is set to 22°C.
The sound system volume is set to 50.
Turning off all systems...
The light is OFF.
The air conditioner is OFF.
The sound system is OFF.

通过外观类,客户端不需要直接控制每个设备,只需调用外观类的方法来实现对所有设备的控制。


5. 外观模式的应用场景

  1. 复杂子系统的简化接口:
    当有多个复杂的子系统时,外观模式能够为客户端提供简单易用的接口,隐藏复杂的实现。

  2. 第三方库的整合:
    当我们使用多个第三方库时,可以通过外观模式为这些库提供统一的接口,简化客户端的使用。

  3. 系统集成:
    在一个大型系统中,多个子系统可能存在较强的耦合,外观模式能够帮助降低耦合,使得系统更加模块化。


6. 外观模式与其他模式的比较

设计模式主要用途与外观模式的区别
代理模式控制对对象的访问,通常用于延迟初始化或保护对象的访问。代理模式通常用于访问控制,而外观模式简化子系统的接口。
适配器模式将一个接口转换为另一个接口,使得两个不兼容的接口能协同工作。适配器模式解决接口兼容性问题,外观模式简化子系统的复杂性。
桥接模式分离抽象部分和实现部分,使其可以独立扩展。桥接模式强调将抽象和实现解耦,而外观模式关注简化接口。

7. 总结

外观模式是一种非常实用的设计模式,它通过为子系统提供一个统一的接口,简化了客户端的使用,降低了客户端与子系统的耦合。外观模式适用于系统复杂度较高或存在多个子系统的场景,能够帮助简化客户端代码,提高系统的可维护性。

通过使用外观模式,我们可以将复杂的系统操作封装在外观类中,避免客户端需要直接与多个复杂子系统交互,从而使得代码更加简洁易用。

【愚公系列】二十三种设计模式(十)-外观模式(Facade Pattern) 设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。 阅读详情

相关推荐

【实战指南】从零构建UNet多分类分割数据集:标注、转换与训练全流程

本文提供了一份从零构建UNet多分类分割数据集的完整实战指南。详细介绍了使用Labelme进行图像标注的核心技巧与规范,并通过Python脚本将标注结果转换为模型可用的VOC格式。最后,指导如何修改经典的PyTorch版UNet代码,以适配自定义数据集并进行训练与测试,帮助读者完成从数据准备到模型训练的全流程。

arduino9maker的博客 287

Java中外观模式 (Facade Pattern)

Java中外观模式 (Facade Pattern)

sanmansan的博客 718

stackelberg博弈_博弈论、多智能体、强化学习(随便记点东西)

多智能体应用场景:已实现:游戏AI。正在努力:UAV,物资运输,快递分发,交通系统。未来:社会学,预测群体行为,城市区域合作,国际关系。博弈论基本定义:玩家集合: 策略集合: 收益函数: 囚徒困境:两智能体矩阵博弈坦白抵赖坦白1,13,0抵赖0,32,2占优策略与最佳应对:上表中两者均具有占优策略,即无论如何都应该选坦白。那么构造下表。坦白抵赖坦白1,13,0抵赖0,12,2对于玩家一来说,坦白...

weixin_39611722的博客 2997

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

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

qq_37400096的博客 2371

【IEEE】从Accept到Online:详解Proof校样阶段的关键操作与避坑指南

本文详细解析了IEEE论文从Accept到Online的Proof校样阶段关键操作流程与避坑指南。重点介绍了IEEE Author Gateway平台的使用技巧、校样稿首页的风险点检查,以及多人协作校对策略,帮助作者高效完成论文出版前的最后审核,确保学术成果准确呈现。

weixin_30591551的博客 357

主流双目相机技术参数横向评测:从ZED到国产新锐

本文对主流双目相机技术参数进行了横向评测,涵盖ZED、Bumblebee等国际品牌及国产新锐产品。详细分析了分辨率、帧率、视场角等关键参数,并针对机器人导航、AR/VR交互、工业检测等场景提供选型建议。特别推荐ZED相机在科研领域的成熟应用,以及国产方案在长基线设计和主动双目技术上的创新突破。

weixin_33670786的博客 318

【Java设计模式】外观模式

外观设计模式为子系统中的一组接口提供了一个统一的接口。这个Java设计模式简化了复杂系统的交互。

道长的博客 1291

Vue3 - 详细实现移动端H5网页调用摄像头拍照功能,微信公众号网页h5页面打开本地摄像头并点击按钮照相,vue3获取摄像头画面执行拍照保存,调整摄像头前置后置抓拍图片给用户展示或保存手机上传服务器

vue3,H5网页,手机移动端,vue3摄像头拍照,前端h5调用手机摄像头,移动端网页调用摄像头,H5实现手机拍照和选择上传,调用本地摄像头实现拍照,vue3调用摄像头拍照,手机浏览器开启摄像头并进行拍照,H5移动端网页中调用手机摄像头,H5实现web调用摄像头在线照相,vue3h5调用摄像头,微信公众号网页如何调用摄像头拍照,公众号H5页面实现打开摄像头照相,怎么生成临时图片,vue3项目调用摄像头实现拍照功能,摄像头打不开没反应,浏览器不兼容怎么办,摄像头权限不弹出,只能在本地运行,拒绝权限后怎么办,

🏆 前端领域优质创作者 1万+

Java设计模式:外观模式

外观模式(Facade Pattern)是一种结构型设计模式,旨在为系统提供一个统一的接口,以简化系统的使用。它定义了一个高级接口,使得客户端可以更容易地与系统交互。外观模式通过提供一个简化的接口,封装了系统中多个模块的复杂逻辑,从而隐藏系统的复杂性,使客户端更容易使用。这种模式的核心思想是通过一个外观类,将客户端与系统的详细实现隔离开来,提供一个更简单和统一的接口。

Java技术一点通 1511

5、快速入门

点击启动实例按钮,并设计一个business key,每个实例会有一个business key, 业务主键,也相当于一个流程实例唯一key,一般会与一次业务强相关,比如一个订单号 ,此处取为shopping_1;付款程序完成后会流转到物流发货任务,此时java工程的相应订阅会收到任务,并进入断点,且读到到toWhere变量。单击shopping可以进入实时流程图的执行图,此时流程流转到第一个任务,需要业务系统完成此任务,并通知引擎。添加类,分别订阅流程中的加入购物车任务和物流发货任务。

leyoliu的博客 3501

AI产品经理面试宝典第9天:关于AI产品经理的挑战与转型怎么回答

AI技术重构产品逻辑,AI产品经理需直面三大核心命题:用户定位差异、技术融合边界、商业价值转化。本文从千道真题中提炼出面试高频考点,剖析AI产品经理如何突破传统思维定式,在B端需求与C端体验间构建价值桥梁,用数据驱动产品创新,破解技术落地的隐性壁垒。掌握这三重跃迁法则,助你在AI浪潮中脱颖而出。

打造全国最全的AI Agent开发知识领域的博客 175

Java设计模式-外观模式Facade

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

老徐的博客只有干货 1450

高通SDX55平台:5G速率问题排查分析方法

和大家分享一下高通5G平台5G速率问题排查分析方法。

四儿家的小祖宗的博客 5219

23种设计模式——外观模式(Facade Pattern)详解

本文介绍了23种设计模式之——外观模式(Facade Pattern)的说明及使用

Meteors.的博客 1230

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

外观模式 定义 又叫门面模式,提供一个统一的接口,用来访问子系统中的一群接口。 外观模式定义了一个高层接口,让子系统更容易使用,隐藏了子系统的复杂性。 类型 这种类型的设计模式属于结构型模式。 使用场景 子系统越来越复杂,增加外观模式可以提供简单调用接口。 为一个复杂的模块或子系统提供一个外界访问的接口。 子系统相对独立,外界对子系统的访问只要黑箱操作即可。 优点 简化了调用过程,无须了解、...

kaven 4680

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java设计模式——外观模式【Facade Pattern】

Java设计模式、外观模式、Facade Pattern

scorpio的博客 560

计算机控制技术及应用

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

【JAVA设计模式】外观模式(Facade Pattern)

外观模式 -- JAVA实现

C_son的专栏 1523

【23种设计模式】外观模式(Facade Pattern)

Facade模式,又叫外观模式。它属于结构型设计模式的一种。Facade模式旨在为复杂的子系统提供一个简化的接口,从而隐藏系统的复杂性,使客户端能够更方便地使用系统。 在软件开发中,大型系统通常由多个子系统组成,每个子系统都有自己的一组接口和功能。这些子系统之间的交互可能会变得非常复杂,对于客户端来说,直接与这些子系统进行交互可能会变得困难和繁琐。 外观模式(Facade模式)可以视为面向对象中封装的一种应用。给外界提供清晰明了的使用方式,不用关心内部的复杂逻辑。

金鳞踏雨 950

设计模式之外观模式(Facade Pattern)(即门面模式)

优点1)降低耦合度:即减少相互依赖,客户端与子系统之间的耦合度降低,客户端只与外观角色交互,不需要了解子系统的具体实现。2)简化操作:客户端不再需要了解子系统的内部实现和具体细节,只需要与外观角色交互,简化了客户端的操作。3)易于维护:当子系统内部发生变化时,只需要修改外观角色,而不需要修改客户端代码,降低了维护成本。缺点1)不符合“开闭原则”:如果新增子系统或删除子系统,可能需要修改外观角色的代码,这在一定程度上违反了“开闭原则”。

红军不怕远征难,万水千山只等闲 1605

外观模式-Facade Pattern

在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了。 软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观...

心猿意碼 6445

2.5 外观模式(Facade Pattern)

外观模式(Facade Pattern)是一种结构型设计模式,它为复杂的子系统提供一个简化的接口。通过引入外观模式,客户端可以更简单地与子系统进行交互,而不需要了解子系统的内部细节。这种模式通过一个统一的接口来隐藏子系统的复杂性,使得子系统更易于使用。外观模式的主要目的是减少系统间的耦合,提供一个高层次的接口,让客户端能够更加容易地使用子系统。外观模式通过引入一个统一的接口,隐藏了子系统的复杂性,从而简化了客户端与子系统之间的交互。

qq_28791753的博客 1973

外观模式 (Facade Pattern)

外观模式是一种结构型设计模式,它为子系统中的一组接口提供一个一致的界面。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

懵萌长颈鹿的博客 683

PHP中的facade pattern(外观模式)

本文来自pilishen.com----原文链接 该篇属于《Laravel底层核心技术实战揭秘》这一课程《laravel底层核心概念解析》这一章的扩展阅读。考虑到学员们的基础差异,为了避免视频当中过于详细而连篇累牍,故将一些laravel底层实现相关的PHP知识点以文章形式呈现,供大家预...

chengkuangmu1012的博客 234

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

简介 外观模式是一种使用频率非常高的结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便。 1. 外观模式概述       不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶、茶具和开水,如图1(A)所示,而去茶馆喝茶,最简单的方式就是跟茶馆服务员说想要一杯什...

潘建南的博客 2502

设计模式系列(十一)外观模式(Facade Pattern)

设计模式系列(十一)外观模式(Facade Pattern)     外观模式提供了统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。外观模式的意图是简化接口,让用户更加方便使用。举例来说,如果在家里布置了一个家庭影院,包括电影显示器,遥控器,爆米花机器等,当你想要享受一场电影的时候,你需要打开显示器、操作遥控器的一系列按钮、打开爆米花机器等,也就是说享

君临天下的博客 804

转载Java设计模式之外观模式Facade模式

原文地址为:https://blog.youkuaiyun.com/zz_ddup/article/details/80798347 外观模式(Facade Pattern):隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。 何时使用: 1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员...

meihao1203dick的博客 209
上一篇: Java设计模式 十 装饰模式 (Decorator Pattern)
下一篇: Java设计模式 十二 享元模式 (Flyweight Pattern)
十方来财
十方来财 新星创作者: 编程框架技术领域 新星创作者: 编程框架技术领域
博客等级 码龄14年 8358粉丝 346原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十方来财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值