笨蛋学设计模式结构型模式-外观模式【10】

结构型模式-外观模式

    • 7.4外观模式:arrow_up::arrow_up::arrow_up:
      • 7.4.1概念
      • 7.4.2场景
      • 7.4.3优势 / 劣势
      • 7.4.4外观模式可分为
      • 7.4.5外观模式
      • 7.4.6实战
        • 7.4.6.1题目描述
        • 7.4.6.2输入描述
        • 7.4.6.3输出描述
        • 7.4.6.4实战
      • 7.4.7总结
      • 外观模式

7.4外观模式⬆️⬆️⬆️

7.4.1概念

​ 外观模式也称门面模式,外观模式定义了一个高层接口,该接口为子系统中的一组接口提供一个统一的接口,从而简化了子系统的使用。同时隐藏了子系统内部的复杂性,并向客户端提供了一个更简单的接口,使得子系统变得更加容易。

7.4.2场景

​ 当我们想看电视时,在电视上或者电视遥控器上都有一个电源启动 / 关闭按钮,这个按钮掩盖了电视机内部的所有复杂性,当我们想看电视时按下遥控器上的电源启动按钮,或者想调整电视音量时,又或者想调换电视节目等,也是通过电视遥控器上的某一个按钮来控制电视机,完成对应的电视复杂操作。

7.4.3优势 / 劣势

  • 简化代码:提高了代码的可读性以及可维护性
  • 提高代码重用性:对子系统进行修改时,只需要修改外观类
  • 模块化设计:将子系统封装在一个外观对象中,可以更容易地进行模块化设计和维护

  • 过度抽象:若过度抽象,可能会隐藏子系统的重要信息,导致难以进行有效的调试和维护
  • 性能影响:由于多了一层封装,可能会对性能产生一定的影响

7.4.4外观模式可分为

  • 外观类:对外提供一个统一的高层次接口,使复杂的子系统变得更易使用
  • 子系统类:实现子系统的功能,处理外观类指派的任务

7.4.5外观模式

package com.technologystatck.designpattern.mode.appearance;public class Appearance {public static void main(String[] args) {//创建外观对象Facade facade = new Facade();//客户端通过外观类调用子系统的操作facade.facadeOperation();}
}//子系统A
class SubsystemA{public void operationA(){System.out.println("SubsystemA operation");}
}//子系统B
class SubsystemB{public void operationB(){System.out.println("SubsystemB operation");}
}//子系统C
class SubsystemC{public void operationC(){System.out.println("SubsystemC operation");}
}//外观类
class Facade{private SubsystemA subsystemA;private SubsystemB subsystemB;private SubsystemC subsystemC;//实例化三个子系统public Facade() {this.subsystemA = new SubsystemA();this.subsystemB = new SubsystemB();this.subsystemC = new SubsystemC();}//外观方法,封装了对子系统的操作public void facadeOperation(){subsystemA.operationA();subsystemB.operationB();subsystemC.operationC();}
}

7.4.6实战

7.4.6.1题目描述

小明家的电源总开关控制了家里的三个设备:空调、台灯和电视机。每个设备都有独立的开关密码,分别用数字1、2和3表示。即输入1时,空调关闭,输入2时,台灯关闭,输入3时,电视机关闭,当输入为4时,表示要关闭所有设备。请你使用外观模式编写程序来描述电源总开关的操作。

7.4.6.2输入描述

第一行是一个整数 N(1 <= N <= 100),表示后面有 N 行输入。

接下来的 N 行,每行包含一个数字,表示对应设备的开关操作(1表示关闭空调,2表示关闭台灯,3表示关闭电视机,4表示关闭所有设备)。

7.4.6.3输出描述

输出关闭所有设备后的状态,当输入的数字不在1-4范围内时,输出Invalid device code.

7.4.6.4实战
package com.technologystatck.designpattern.mode.appearance;import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int nums = scanner.nextInt();
//        scanner.nextLine();//创建外观类对象,也就是电源开关
//        PowerFacade powerFacade =null;
//        for(int i=0;i<nums;i++){
//            int systemType = scanner.nextInt();
//            powerFacade= new PowerFacade();
//            powerFacade.facadeOperation(systemType);
//        }//定义数组存放用户输入int[] inputs=new int[nums];for(int i=0;i<nums;i++){inputs[i]=scanner.nextInt();}//创建外观类对象,也就是电源开关PowerFacade powerFacades=new PowerFacade();for(int j=0;j<nums;j++){powerFacades.facadeOperation(inputs[j]);}}
}//创建三个子系统
//电视机子系统
class Television{public void operationTV(){System.out.println("Television is turned off.");}
}
//空调子系统
class AirConditioner{public void operationAC(){System.out.println("Air Conditioner is turned off.");}
}//台灯子系统
class TableLamp{public void operationTL(){System.out.println("Table Lamp is turned off.");}
}//创建外观类,来操控三个子系统
class PowerFacade{private Television television;private AirConditioner airConditioner;private TableLamp tableLamp;//实例化三个子系统public PowerFacade(){this.television=new Television();this.airConditioner=new AirConditioner();this.tableLamp=new TableLamp();}//外观方法,封装了对子系统的操作public void facadeOperation(int type){if(type==1){television.operationTV();}else if (type ==2 ) {this.airConditioner.operationAC();}else if(type==3){tableLamp.operationTL();}else if(type==4){System.out.println("All devices are off.");}else{System.out.println("Invalid device code.");}}
}

7.4.7总结

  • 外观模式

  • 优点:隐藏系统的内部细节,简化复杂的子系统,只需要通过已经封装好了的方法去调用

  • 总结:将一个或多个难度过于复杂的子系统包装为一个单独的接口,以供客户端只需要与外观对象交互

  • 场景

    • 当系统的接口过于复杂时,可以使用外观模式将系统的接口进行封装,让客户端调用简单的方法完成操作
    • 当系统存在多个子系统,且子系统之间存在依赖时,外观模式可以将不同子系统之间的依赖关系进行解耦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/632396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

橘子学K8S04之重新认识Docker容器

我们之前分别从 Linux Namespace 的隔离能力、Linux Cgroups 的限制能力&#xff0c;以及基于 rootfs 的文件系统三个角度来理解了一下关于容器的核心实现原理。 这里一定注意说的是Linux环境&#xff0c;因为Linux Docker (namespaces cgroups rootfs) ! Docker on Mac (bas…

JAVA开发工作笔记

Android开发 1、解决notifyDataSetChanged()刷新数据的时候&#xff0c;edittext的焦点就会自动消失 第一步&#xff1a;在adapter中复写此方法 Override public long getItemId(int position) { return position; }第二步&#xff1a;在创建Adapter的时候设置setHasStabl…

Mybatis面试题(一)

MyBatis 面试题 1、什么是 Mybatis&#xff1f; 1、Mybatis 是一个半 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了 JDBC&#xff0c;开发时只需要关注 SQL 语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程…

在PyCharm中创建Flask项目

在 PyCharm 中创建 Flask 项目的步骤如下&#xff1a; 打开 PyCharm&#xff0c;并选择 "Create New Project"&#xff08;新建项目&#xff09;。在弹出的窗口中&#xff0c;选择左侧的 "Python" 选项&#xff0c;然后选择右侧的 "Flask" 项目…

【开发实践】前端jQuery+gif图片实现载入界面

一、需求分析 载入界面&#xff08;Loading screen&#xff09;是指在计算机程序或电子游戏中&#xff0c;当用户启动应用程序或切换到新的场景时&#xff0c;显示在屏幕上的过渡界面。它的主要作用是向用户传达程序正在加载或准备就绪的信息&#xff0c;以及提供一种视觉上的反…

科技的成就(五十五)

519、Machine Learning "1959 年 7 月&#xff0c;塞缪尔首创 Machine Learning 一词。塞缪尔在“Some Studies in Machine Learning Using theGame of Checkers”一文中给 Machine Learning 下了个非正式定义&#xff1a;没有明确编程指令的情况下&#xff0c;能让计算机…

(C语言)冒泡排序

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现buble_sort函数&#xff1b; void buble_sort(int arr[], int sz) {//初始化变量值&#xff1b;int i 0;//嵌套循环冒泡排序&#xff1b;//外层循环&…

VPS与母机

VPS技术是将一台服务器分割成多个虚拟专享服务器的优质服务。实现VPS的技术分为容器技术&#xff0c;和虚拟化技术。在容器或虚 拟机中&#xff0c;每个VPS都可选配独立公网IP地址、独立操作系统、实现不同VPS间磁盘空间、内存、CPU资源、进程和系统配置的 隔离&#xff0c;为用…

HBase学习三:集群部署

集群启停顺序:启动Hadoop—>启动HBase—>关闭HBase—>关闭Hadoop 1 环境准备 1.0 环境前期准备 参考基础环境配置 1.1 机器准备 hostnameipvm1ip1vm2ip2vm3ip31.2 机器分配 hdfs的集群搭建可以参考 hdfs集群搭建 hdfs集群机器分配 NameNodeDataNodeJournalNode…

基于SSM的在线宠物商城设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue、HTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是…

Spring MVC学习——解决请求参数中文乱码

解决请求参数中文乱码问题 1.POST请求方式解决乱码问题 在web.xml里面设置编码过滤器 <filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><…

【Java数据结构 -- 栈相关算法:中缀表达式转后缀、最小栈、括号匹配、和出栈入栈次序匹配】

栈相关算法 1.逆波兰表达式求值2. 最小栈3. 括号匹配4. 出栈入栈次序匹配 1.逆波兰表达式求值 思路&#xff1a; // 中缀 : 12*3(4*56)*7 // 后缀 : ( (1 (2*3) ) ((4*5)6)*7) ) // ( (1 (23)* ) ((45)*6)7)* ) // 1 23* 45*6 7* //给你一个字符串数组…

react native Gradle的原国外地址、本地下载、国内阿里腾讯镜像三种下载配置

一、国外地址&#xff1a;&#xff08;初始项目默认&#xff09; 下载地址&#xff1a;https://services.gradle.org/distributions/ 文件地址见下图&#xff1a; 注意&#xff1a;这个地址下载十次就有九次是连接超时&#xff0c;建议换另外两种方法 二、下载到本地&#x…

查看pip及Python版本

Python环境正确安装之后&#xff0c;按“WinR”组合键打开“运行”对话框&#xff0c;输入“cmd”&#xff0c;如下图 打开命令提示符窗口后&#xff0c;输入以下命令查看Python及pip的版本。 pip -V 如果命令提示符窗口能够正确显示pip及Python版本&#xff0c;则说明Python…

Mybatis之关联

一、一对多关联 eg&#xff1a;一个用户对应多个订单 建表语句 CREATE TABLE t_customer (customer_id INT NOT NULL AUTO_INCREMENT, customer_name CHAR(100), PRIMARY KEY (customer_id) ); CREATE TABLE t_order ( order_id INT NOT NULL AUTO_INCREMENT, order_name C…

用Python的logging库记录日志

Python的logging模块提供了一种灵活可配置的日志记录系统&#xff0c;可用于监测程序运行时的信息&#xff0c;方便开发者进行故障排查和性能优化。 下面的代码利用 basicConfig() 配置了一个简单的日志记录器&#xff0c;通过logging库记录程序运行日志&#xff0c;其中&…

【备战蓝桥杯】吃奶酪问题 / 超硬核,文附template拓展知识!

蓝桥杯备赛 | 洛谷做题打卡day9 文章目录 蓝桥杯备赛 | 洛谷做题打卡day9再来了解一下状压dp**简介(Introduction)****描述(Description)** - 吃奶酪题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示数据规模与约定提示 * template拓展知识我的一些话 【引入】今天…

python数字图像处理基础(十)——背景建模

目录 背景建模背景消除-帧差法混合高斯模型 背景建模 背景建模是计算机视觉和图像处理中的一项关键技术&#xff0c;用于提取视频中的前景对象。在视频监控、运动检测和行为分析等领域中&#xff0c;背景建模被广泛应用。其基本思想是通过对视频序列中的像素进行建模&#xff…

如何设置Windows 11的WSL系统用作备用桌面环境

如何设置Windows 11的WSL系统用作开发环境&#xff08;含Astrill设置&#xff09; 如何设置Windows 11的WSL系统用作备用桌面环境 引子&#xff1a; 2023年末&#xff0c;公司突然遭遇网络攻击&#xff0c;调整了防火墙设置&#xff0c;连接VPN用来飞X软件&#xff0c;与原来…

GoZero微服务个人探究之路(零)个人对微服务产生原因的思考,对前三篇的补充

为什么产生了微服务架构--必要性 这里我觉得看GoZero作者写的博文就可以有很好的体会 具体的&#xff0c;他画了这一张图&#xff08;以电商后台系统为例子&#xff09; 所以&#xff0c;我个人产生了如下思考 1.业务逻辑越来越复杂&#xff0c;层层嵌套&#xff0c;分解成微…