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

九、外观模式

外观模式(Facade Pattern)是一种结构型设计模式,有叫门面模式,它为一个复杂子系统提供一个简单的接口,隐藏系统的复杂性。通过使用外观模式,客户端可以更方便地和复杂的系统进行交互,而无需直接与系统内部的各个组成部分打交道。

主要组成部分:

  1. 外观类(Facade)

    • 提供一个简单的接口,供客户端调用。
  2. 子系统类(SubSystem)

    • 复杂的子系统,提供具体的功能实现。
  3. 客户端(Client)

    • 需要通过外观与复杂子系统交互的对象。

优点:

  1. 简化接口:外观模式提供的接口使客户端与复杂系统的交互变得简单明了。
  2. 降低耦合度:客户端与复杂系统的具体实现解耦,减少了依赖关系。
  3. 提高可维护性:通过外观模式,可以轻松更改和维护内部系统的实现,而不影响客户端代码。

使用场景:

  • 当需要为一个复杂的系统提供一个简单的入口时。
  • 当多个类一起工作时,可以用外观模式将其封装,提高系统的可用性。
  • 提升模块之间的解耦性。

JAVA:

演示如何为一个复杂的家庭影院系统提供一个简单的接口

// 子系统-音响系统
public class Amplifier {public void on() {System.out.println("音响打开:");}public void setVolume(int level) {System.out.println("音响音量设置: " + level);}
}
// 子系统-DVD播放器
public class DVDPlayer {public void on() {System.out.println("DVD 开关打开:");}public void play(String movie) {System.out.println("播放电影: " + movie);}
}
// 子系统-投影仪
public class Projector {public void on() {System.out.println("投影仪开关打开:");}public void wideScreenMode() {System.out.println("投影仪在宽屏模式");}
}
// 外观类
public class HomeTheaterFacade {private Amplifier amplifier; //音响private DVDPlayer dvdPlayer; //播放器private Projector projector; //投影仪// 构造public HomeTheaterFacade(Amplifier amp, DVDPlayer dvd, Projector proj) {this.amplifier = amp;this.dvdPlayer = dvd;this.projector = proj;}public void watchMovie(String movie) {System.out.println("准备好看电影……");amplifier.on();amplifier.setVolume(5);dvdPlayer.on();dvdPlayer.play(movie);projector.on();projector.wideScreenMode();}
}

 

@Test(description = "外观模式")public void facadeTest(){Amplifier amplifier = new Amplifier();DVDPlayer dvdPlayer = new DVDPlayer();Projector projector = new Projector();HomeTheaterFacade homeTheater = new HomeTheaterFacade(amplifier, dvdPlayer, projector);homeTheater.watchMovie("《盗梦空间》");}

GO: 

package facadeimport "fmt"// IHomeTheater 接口
type IHomeTheater interface {On()
}// Amplifier 子系统-音响系统
type Amplifier struct{}func NewAmplifier() *Amplifier {return &Amplifier{}
}
func (a Amplifier) On() {fmt.Println("音响开关打开、")
}
func (a Amplifier) setVolume(level int64) {fmt.Println("音响音量设置: ", level)
}// DVDPlayer 子系统-DVD播放器
type DVDPlayer struct{}func NewDVDPlayer() *DVDPlayer {return &DVDPlayer{}
}
func (D DVDPlayer) On() {fmt.Println("DVD播放器开关打开:")
}
func (D DVDPlayer) play(movie string) {fmt.Println("播放电影:", movie)
}// Projector 子系统-投影仪
type Projector struct{}func NewProjector() *Projector {return &Projector{}
}
func (p Projector) On() {fmt.Println("投影仪开关打开")
}
func (p Projector) wideScreenMode() {fmt.Println("投影仪在宽屏模式")
}// HomeTheater 外观类
type HomeTheater struct {amplifier *AmplifierdVDPlayer *DVDPlayerprojector *Projector
}func NewHomeTheater(amp *Amplifier, dVD *DVDPlayer, pro *Projector) *HomeTheater {return &HomeTheater{amplifier: amp,dVDPlayer: dVD,projector: pro,}
}
func (h HomeTheater) watchMovie(movie string) {fmt.Println("准备好看电影……")h.amplifier.On()h.amplifier.setVolume(5)h.dVDPlayer.On()h.dVDPlayer.play(movie)h.projector.On()h.projector.wideScreenMode()
}
package facadeimport "testing"func TestFacade(t *testing.T) {amplifier := NewAmplifier()dvdplayer := NewDVDPlayer()projector := NewProjector()theater := NewHomeTheater(amplifier, dvdplayer, projector)theater.watchMovie("《盗梦空间》")
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • android BLE 蓝牙的连接(二)
  • turbo译码算法MAX, MAX_SCALE and MAX_STAR的比较
  • 算法打卡:第九章 动态规划part13
  • 【python爬虫】之scrapy框架介绍
  • 绕过CDN查找真实IP方法
  • Spring Cloud集成Eurake
  • 重学SpringBoot3-SpringApplicationRunListener
  • 【MPC】无人机模型预测控制复现Data-Driven MPC for Quadrotors项目(Part 1)
  • 【docker npm】npm 私库
  • 关于HarmonyOS的学习
  • SQL注入(数据库)简介
  • 堆叠沙漏网络(stacked hourglass network)学习
  • 使用python来保存键盘输入情况,可保存到sqlite3数据库
  • 什么是幂等
  • stm32单片机个人学习笔记3(GPIO输出)
  • @angular/forms 源码解析之双向绑定
  • 11111111
  • github从入门到放弃(1)
  • k8s 面向应用开发者的基础命令
  • Node项目之评分系统(二)- 数据库设计
  • Promise面试题,控制异步流程
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • 百度小程序遇到的问题
  • 将 Measurements 和 Units 应用到物理学
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 全栈开发——Linux
  • 软件开发学习的5大技巧,你知道吗?
  • 追踪解析 FutureTask 源码
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (四)React组件、useState、组件样式
  • (转)JAVA中的堆栈
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Core中Emit的使用
  • .NetCore 如何动态路由
  • .net反编译的九款神器
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @RequestMapping处理请求异常
  • [14]内置对象
  • [2010-8-30]
  • [20171101]rman to destination.txt
  • [Algorithm][动态规划][01背包问题][目标和][最后一块石头的重量Ⅱ]详细讲解
  • [ARC066F]Contest with Drinks Hard
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [C#学习笔记]LINQ
  • [C++]高精度 bign (重载运算符版本)
  • [Cloud Networking] Layer Protocol (continue)
  • [DAX] MAX函数 | MAXX函数
  • [EFI]Acer Aspire A515-54g电脑 Hackintosh 黑苹果efi引导文件