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

Java设计模式 —— 【结构型模式】外观模式详解

文章目录

  • 概述
  • 结构
  • 案例实现
  • 优缺点


概述

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

举个例子,在没有只能家居的时候,我们开灯,开空调,开电视等等一系列操作,都需要我们一件一件来完成;在有了智能家居以后,在智慧生活设定指定的程序,就可以实现一键开启指定的家居。
在这里插入图片描述


结构

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

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

案例实现

以我们熟知的智能家居为例:

智能音箱就相当于我们的外观类,而家居就相当于一个一个的系统,只需要操作智能音箱就可以实现所有家电的开关。
在这里插入图片描述

子系统【电灯、电视、空调】:

//电灯类
public class Light {public void on() {System.out.println("打开电灯....");}public void off() {System.out.println("关闭电灯....");}
}//电视类
public class TV {public void on() {System.out.println("打开电视....");}public void off() {System.out.println("关闭电视....");}
}//空调类
public class AirCondition {public void on() {System.out.println("打开空调....");}public void off() {System.out.println("关闭空调....");}
}

外观类【智能音箱】:

//智能音箱类
public class SmartAppliancesFacade {private Light light;private TV tv;private AirCondition airCondition;public SmartAppliancesFacade() {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 on() {light.on();tv.on();airCondition.on();}//一键关电器private void off() {light.off();tv.off();airCondition.off();}
}

测试:

public class Client {public static void main(String[] args) {//创建外观对象SmartAppliancesFacade facade = new SmartAppliancesFacade();//客户端直接与外观对象进行交互facade.say("打开");System.out.println("================");facade.say("关闭");}
}

在这里插入图片描述


优缺点

优点:

  • 简化了调用过程,无需了解深入子系统,防止带来风险;
  • 减少系统依赖、松散耦合,外观模式讲客户端和子系统之间进行解耦;
  • 更好的划分访问层次;
  • 符合迪米特法则,即最少知道原则。

缺点:

  • 增加子系统、扩展子系统行为容易引入风险;
  • 不符合开闭原则,如果需要新增或者修改子系统的功能,可能需要修改外观类。
http://www.lryc.cn/news/508361.html

相关文章:

  • 线性表实验
  • 003无重复字符的最长子串
  • 记录--uniapp 安卓端实现录音功能,保存为amr/mp3文件
  • 前端生成docx文档、excel表格、图片、pdf文件
  • c++---------流类
  • 3、基本复用原理和复用单元
  • Vue与React:前端框架的巅峰对决
  • Java 中的面向对象编程 (OOP) 概念
  • 十二月第20讲:Python中指数概率分布函数的绘图详解
  • 汽车IVI中控开发入门及进阶(44):杰发科智能座舱芯片
  • 【py脚本+logstash+es实现自动化检测工具】
  • Zookeeper的选举机制
  • 2024-05-18 前端模块化开发——ESModule模块化
  • Linux IPV6 地址配置 | IPv6 禁用 | ping6 过程细节剖析 | IPv6 排障
  • 【YashanDB知识库】XMLAGG方法的兼容
  • echarts加载区域地图,并标注点
  • echarts画风向杆
  • 【LeetCode每日一题】LeetCode 345.反转字符串中的元音字母
  • 蓝桥杯练习生第四天
  • cesium 常见的 entity 列表
  • Java旅程(五)Spring 框架与微服务架构 了解 JVM 内部原理和调优
  • Niushop-master靶场漏洞
  • 35道面向初中级前端的基础面试题
  • MFC用List Control 和Picture控件实现界面切换效果
  • 1. 解决前端vue项目 vite打包内存溢出问题
  • Springboot高并发乐观锁
  • 【WPS安装】WPS编译错误总结:WPS编译失败+仅编译成功ungrib等
  • pytorch MoE(专家混合网络)的简单实现。
  • 虚拟机VMware的安装问题ip错误,虚拟网卡
  • Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门hello world输出【入门一】