设计模式-结构型模式-外观模式

server/2024/10/21 0:02:25/

1.外观模式定义

        为子系统中的一组接口提供统一的接口,它定义了一个更高级别的接口,使得子系统更易于使用;相当于公司部门之间通过代表来沟通,这样减少无效、复杂的沟通;

1.1 外观模式的优缺点

优点:

  • 他对客户端屏蔽了子系统组件,减少了客户端所需要处理的对象数,并使子系统使用起来更容易,通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少;
  • 它实现了子系统与客户端之间的松耦合,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可;
  • 一个子系统的修改对其他子系统没有任何影响,而子系统内部变化也不会影响到外观对象;

缺点:

  • 不能很好的控制客户端直接使用子系统类,如果客户端访问子系统类做太多的限制,则减少了可变性与灵活性;
  • 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则;

1.2 外观模式的使用场景

  • 简化复杂系统;
  • 减少客户端处理的系统数量,如web应用中的dao层,专门用来操作数据库;
  • 让一个系统(对象)为多个系统(对象)工作,如线程池;
  • 联合更多的系统来扩展原有系统;

2.外观模式的原理

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

3.外观模式的实现

【实例】

        智能家居

【代码】

        子系统类

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 SmartAppliancesFacade {private Light light;private TV tv;public SmartAppliancesFacade() {this.light =new Light();this.tv = new TV();}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();}
}

        客户端

//创建外观对象
SmartAppliancesFacade facade = new SmartAppliancesFacade();facade.say("打开家电");
facade.say("关闭家电");


http://www.ppmy.cn/server/110566.html

相关文章

无人机 PX4 飞控 | ROS应用层开发:指令(字符串)订阅功能

无人机 PX4 飞控 | ROS应用层开发:指令(字符串)订阅功能 指令(字符串)订阅功能代码测试 指令(字符串)订阅功能 为了通过键盘触发mavros 的不同功能,需要实现一个订阅字符串的功能 该…

Golang | Leetcode Golang题解之第388题文件的最长绝对路径

题目&#xff1a; 题解&#xff1a; func lengthLongestPath(input string) (ans int) {n : len(input)level : make([]int, n1)for i : 0; i < n; {// 检测当前文件的深度depth : 1for ; i < n && input[i] \t; i {depth}// 统计当前文件名的长度length, isFi…

《C++20 特性综述》

《C20 特性综述》 在编程世界中&#xff0c;C一直以其强大的性能和灵活性占据着重要地位。随着时间的推移&#xff0c;C不断发展和演进&#xff0c;C20 带来了一系列令人瞩目的新特性&#xff0c;为开发者提供了更强大的工具和更高效的编程方式。 一、概念&#xff08;Concep…

初识Node.js

大家好久不见&#xff0c;今天我来介绍一下Node.js&#xff0c;对Node.js的安装和对其模块的简要讲解。 Node.js 目录 Node.js 什么是Node.js 安装Node.js Node运行方式 Node.js基础命令 查缺补漏 模块化 原生模块 fs模块 require指令 module对象 小结 什…

stable-diffusion-webui 部署 ,启用 api 服务

stable-diffusion-webui 部署 &#xff0c;启用 api 服务 api 文档参考 https://profaneservitor.github.io/sdwui-docs/api/ api 源码路径是 stable-diffusion-webui/modules/api/api.py 我系统是 ubuntu22.04 conda 环境torchpgu , python 是 3.11.7 安装 stable-diffusi…

【drools】intelj修改JDK版本、进行maven test

以使用drools 8.44.2.Final 版本的工程: 为例子, 使用idea 运行: 修改JDK版本 jdk版本的选择在项目结构:项目结构中 打开是真的慢这里选择jdk 版本自动弹出要设置 web框架 <

VCCAUX_IO

VCCAUX_IO指定给定I/O的VCCAUX.IO轨道的工作电压。 DRC可用于确保VCCAUX_IO属性分配正确&#xff1a; •VCCAUXIOBT&#xff08;警告&#xff09;&#xff1a;确保VCCAUX_IO值为NORMAL或HIGH的端口 仅存放在惠普银行。 •VCCAUXIOSTD&#xff08;警告&#xff09;&#xff1a;确…

Android创建自己的内容提供器(ContentProvider)

文章目录 Android创建自己的内容提供器&#xff08;ContentProvider&#xff09;创建内容提供器的步骤新建MyProvider继承自ContentProvider内容URI的格式修改MyProvider中的代码MIME类型 Android创建自己的内容提供器&#xff08;ContentProvider&#xff09; 在上一节当中&a…