【设计模式】Java设计模式 - 外观模式
Java设计模式 - 外观模式
不断学习才是王道
继续踏上学习之路,学之分享笔记
总有一天我也能像各位大佬一样
原创作品,更多关注我CSDN: 一个有梦有戏的人
准备将博客园、CSDN一起记录分享自己的学习心得!!!
分享学习心得,欢迎指正,大家一起学习成长!
简介
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
———— 菜鸟联盟
外观模式之理解
对于外观模式,我们可以理解为他是将一些复杂的接口或类进行隐藏,自己暴露出更为简单的操作方法,使得以我们不需要去对复杂方法的操作。就比如要完成一道工序,工序又有许多步骤,在不同情况要使用不同工序的方法,如果是传统的方式,一个一个调用,那么到一定量就会显得调用的复杂并且维护起来困难,因此可以使用外观模式,将一起使用的方法封装在一起,这样只需要调用这个外观的方法即可完成。
我们看一下外观模式的UML图:
实例
采用智能家居的例子来理解外观模式,例子很简单,当我们按下一键启动开关,就可以为我们打开/关闭窗户、电视、空调、灯光等。
先看一些类图:
具体代码如下:
①、定义子系统
子系统分为:灯光、空调、电视、窗户。采用单例模式,并且声明开启、关闭的方法。
这里只粘贴一个,其他的代码类似。
package com.lyd.demo.subsystem;
/**
* @Author: lyd
* @Description: 子系统 - 空调
* @Date: 2022-08-31
*/
public class AirConditioner {
private static AirConditioner airConditioner = new AirConditioner();
public static AirConditioner getAirConditioner() {
return airConditioner;
}
public void on() {
System.out.println("智能家居为您打开[空调]");
}
public void off() {
System.out.println("智能家居为您关闭[空调]");
}
}
②、外观类
采用单例模式,实例化对象,并且根据需要去调用方法,暴露出接口即可完成,这里是启动所有设备,还可以根据需要去选择。
package com.lyd.demo.faced;
import com.lyd.demo.subsystem.AirConditioner;
import com.lyd.demo.subsystem.Lights;
import com.lyd.demo.subsystem.Tv;
import com.lyd.demo.subsystem.Windows;
/**
* @Author: lyd
* @Description: 外观模式
* @Date: 2022-08-31
*/
public class SmartHomeFaced {
private Lights[] lights = new Lights[4]; // 4盏灯
private Tv tv;
private AirConditioner airConditioner;
private Windows windows;
public SmartHomeFaced() {
this.lights[0] = Lights.getLights();
this.lights[1] = Lights.getLights();
this.lights[2] = Lights.getLights();
this.lights[3] = Lights.getLights();
this.tv = Tv.getTv();
this.airConditioner = AirConditioner.getAirConditioner();
this.windows = Windows.getWindows();
}
public void openAll() {
lights[0].on(0);
lights[1].on(1);
lights[2].on(2);
lights[3].on(3);
tv.on();
airConditioner.on();
windows.on();
}
public void offAll() {
lights[0].off(0);
lights[1].off(1);
lights[2].off(2);
lights[3].off(3);
tv.off();
airConditioner.off();
windows.off();
}
}
③、测试
调用外观暴露的接口方法就可以。
package com.lyd.demo.test;
import com.lyd.demo.faced.SmartHomeFaced;
/**
* @Author: lyd
* @Description: 测试
* @Date: 2022-08-31
*/
public class FacedTest {
public static void main(String[] args) {
SmartHomeFaced smartHomeFaced = new SmartHomeFaced();
smartHomeFaced.openAll();
smartHomeFaced.offAll();
}
}
运行结果:
好文推荐
- 阿里云 - 开发者社区 https://developer.aliyun.com/article/420326
- 掘金 https://juejin.cn/post/6844903680303431693
今天的内容还算是简单好理解的,多看看,多动手理解就会更快!
创作不易,可能有些语言不是很通畅,如有错误请指正,感谢观看!记得一键三连哦!
【设计模式】Java设计模式 - 外观模式的更多相关文章
- Java设计模式之《外观模式》及应用场景
原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6484128.html 1.外观模式简介 外观模式,一般用在子系统与访问之间,用于对访问屏蔽复 ...
- Java设计模式学习记录-外观模式
前言 这次要介绍的是外观模式(也称为门面模式),外观模式也属于结构型模式,其实外观模式还是非常好理解的,简单的来讲就是将多个复杂的业务封装成一个方法,在调用此方法时可以不必关系具体执行了哪些业务,而只 ...
- 重学 Java 设计模式:实战外观模式「基于SpringBoot开发门面模式中间件,统一控制接口白名单场景」
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你感受到的容易,一定有人为你承担不容易 这句话更像是描述生活的,许许多多的磕磕绊绊总 ...
- java设计模式-----12、外观模式
Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种.Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面.这个一致的简单的界面被称作facade. ...
- Java描述设计模式(12):外观模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 在移动互联网没有普及之前,去饭店吃饭的流程大致如下:选座位,排队,点菜,结账.后来移动互联网普及,通过手机APP就 ...
- Java设计模式11:外观模式
外观模式 外观模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的外观对象进行.外观模式是一个高层次的接口,使得子系统更易于使用. 医院的例子 现代的软件系统都是比较复杂的.假如把医院比作一 ...
- java设计模式之九外观模式(Facade)
外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口 ...
- 设计模式学习心得<外观模式 Facade>
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及 ...
- PHP设计模式之:外观模式
外观模式: 外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用: 外观模式又称为门面模 ...
- C#设计模式之十一外观模式(Facade)【结构型】
一.引言 快12点半了,要开始今天的写作了.很快,转眼设计模式已经写了十个了,今天我们要讲[结构型]设计模式的第五个模式,该模式是[外观模式],英文名称是:Facade Pattern.我们先从名字上 ...
随机推荐
- python小题目练习(六)
需求:编写一个猜数字的小游戏,随机生成1到10(包含1和10)之间的数字作为基准数,玩家每次通过键盘输入一个数字,如果输入的数字跟基准数相同,则闯关成功,否则重新输入,如果玩家输入的是-1,则表示退出 ...
- python做小游戏——做个马里奥分分钟解决
一.前言 嗨喽,大家好呀!这里是小熊猫 在你的童年记忆里,是否有一个蹦跳.顶蘑菇的小人已经被遗忘? 马里奥是靠吃蘑菇成长,闻名世界的超级巨星.特征是大鼻子.头戴帽子.身穿背带工作服.还留着胡子.帽子加 ...
- Turtle绘图——python简单上手小案例
Turtle绘图 Turtle模块提供了在二维平面上移动的环境. Turtle可以实现位置.航向和各种可能的状态和动作. import turtle as tu roo = tu.Turtle() # ...
- spring boot 打包为war包方法
刚刚接触spring boot,其快速开发的特性吸引我去研究一下.于是我写了个demo,用spring boot内置的tomcat运行的很好,但是我需要把它部署到外部的tomcat中,于是从网上查找资 ...
- 使用 spring-security-oauth2 体验 OAuth 2.0 的四种授权模式
目录 背景 相关代码 授权码模式 第一步 访问GET /oauth/authorize 第二步 访问POST /oauth/authorize 第三步 访问POST /oauth/token 简化模式 ...
- rust实战系列-base64编码
前言 某些只能使用ASCII字符的场景,往往需要传输非ASCII字符的数据,这时就需要一种编码可以将数据转换成ASCII字符,而base64编码就是其中一种. 编码原理很简单,将原始数据以3字节(24 ...
- 关于 Flink 状态与容错机制
Flink 作为新一代基于事件流的.真正意义上的流批一体的大数据处理引擎,正在逐渐得到广大开发者们的青睐.就从我自身的视角看,最近也是在数据团队把一些原本由 Flume.SparkStreaming. ...
- JS中的数据类型及转换
js的六大类型 js中有六种数据类型,Boolean: 布尔类型 Number:数字(整数int,浮点数float ) String:字符串 Object:对象 (包含Array数组 ) 特殊数据类型 ...
- PHP反向代理(转)
<?php class PhpReverseProxy{ public $publicBaseURL; public $outsideHeaders; public $XRequestedWit ...
- 「SDOI2016」征途 题解
「SDOI2016」征途 先浅浅复制一个方差 显然dp,可以搞一个 \(dp[i][j]\)为前i段路程j天到达的最小方差 开始暴力转移 \(dp[i][j]=min(dp[k][j-1]+?)(j- ...