当前位置: 首页 > news >正文

Gof23设计模式之桥接外观模式

1.概述

又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

2.结构

外观(Facade)模式包含以下主要角色:

  • 外观(Facade)角色:为多个子系统对外提供一个共同的接口。
  • 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。

3.案例

/*** @author 晓风残月Lx* @date 2023/7/12 14:19*      电灯类(子系统)*/
public class Light {public void on() {System.out.println("打开了灯......");}public void off() {System.out.println("关闭了灯.......");}
}
/*** @author 晓风残月Lx* @date 2023/7/12 14:22*      电视机类*/
public class TV {public void on() {System.out.println("打开了电视......");}public void off() {System.out.println("关闭了电视.......");}}
/*** @author 晓风残月Lx* @date 2023/7/12 14:19*      电灯类(子系统)*/
public class AirCondition {public void on() {System.out.println("打开了空调......");}public void off() {System.out.println("关闭了空调.......");}
}

/*** @author 晓风残月Lx* @date 2023/7/12 14:21*      外观类,用户主要和该类交互*/
public class SmartApplicationFacade {//聚合电灯对象,电视机对象,空调对象private Light light;private TV tv;private AirCondition airCondition;public SmartApplicationFacade() {light = new Light();tv = new TV();airCondition = new AirCondition();}public void say(String message) {if (message.contains("打开")) {on();} else if (message.contains("关闭")) {off();} else {System.out.println("我还听不懂你说的");}}// 一键关闭private void off() {light.off();tv.off();airCondition.off();}// 一键打开private void on() {light.on();tv.on();airCondition.on();}}
/*** @author 晓风残月Lx* @date 2023/7/12 14:38*/
public class Client {public static void main(String[] args) {// 创建智能音箱对象SmartApplicationFacade smartApplicationFacade = new SmartApplicationFacade();// 控制家电smartApplicationFacade.say("打开家电");// 关闭家电smartApplicationFacade.say("关闭家电");}
}

4.优缺点

好处:

  • 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
  • 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。

缺点:

  • 不符合开闭原则,修改很麻烦

5.使用场景

  • 对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
  • 当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
  • 当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。
http://www.lryc.cn/news/104224.html

相关文章:

  • 微服务性能分析工具 Pyroscope 初体验
  • 工作记录------单元测试(持续更新)
  • C#再windowForm窗体中绘画扇形并给其填充颜色
  • MBA拓展有感-见好就收,还是挑战到底?MBA拓展有感-见好就收,还是挑战到底?
  • 综合布线系统光缆分类及其特点?
  • 前端构建(打包)工具发展史
  • 【数据可视化】(一)数据可视化概述
  • GoogleLeNet Inception V2 V3
  • 【css】背景图片附着
  • 解决运行flutter doctor --android-licenses时报错
  • 在使用Python爬虫时遇到503 Service Unavailable错误解决办法汇总
  • 小研究 - 主动式微服务细粒度弹性缩放算法研究(一)
  • 【LeetCode】215.数组中的第K个最大元素
  • MySQL学习记录:第七章 存储过程和函数
  • Docker中gitlab以及gitlab-runner的安装与使用
  • 一起学SF框架系列5.12-spring-beans-数据绑定dataBinding
  • 火热报名中 | 赛宁独家技术支持第七届“蓝帽杯”网络安全技能大赛
  • 无涯教程-jQuery - Ajax Tutorial函数
  • Android日志
  • 【Golang 接口自动化08】使用标准库httptest完成HTTP请求的Mock测试
  • SpringBoot自定义注解 + AOP+分布式Redis 防止重复提交
  • 3.yum安装分布式LNMP--剧本
  • 论文笔记:Fine-Grained Urban Flow Prediction
  • 系统集成|第八章(笔记)
  • 【分布式】分布式唯一 ID 的 几种生成方案以及优缺点snowflake优化方案
  • FFmpeg5.0源码阅读——av_interleaved_write_frame
  • 力扣 70. 爬楼梯
  • AVFoundation - 媒体捕捉
  • 【新版系统架构补充】-嵌入式技术
  • fpga开发--蜂鸣器发出连续不同的音调