首页 > 其他分享 >设计模式---- 门面模式

设计模式---- 门面模式

时间:2024-09-17 14:50:43浏览次数:11  
标签:fmt Amplifier ---- Lights 门面 设计模式 子系统 客户端

门面模式
门面模式(Facade Pattern)是一种结构型设计模式,用于为复杂子系统提供一个统一、简单的接口,隐藏系统的复杂性。通过门面模式,客户端无需直接与系统的内部组件交互,而是通过门面类与系统打交道,简化了客户端的使用,降低了系统的复杂性和耦合度。

门面模式的主要概念

  1. 定义:门面模式通过提供一个高级接口,简化了子系统的使用。这个接口称为“门面”,它封装了复杂的子系统中的一系列方法或功能。客户端与门面类交互,门面类再去调用复杂子系统的各个模块。
  2. 参与者:
    • 门面类(Facade):它是客户端与复杂子系统之间的接口。它知道哪些子系统类负责处理请求,并将请求委托给相应的子系统对象。
    • 子系统类(Subsystems):这些是实际处理工作并执行请求的类。它们不需要知道门面的存在,通常是门面类将请求转发给它们。
  3. 客户端:客户端通过门面类来访问系统。它不需要知道子系统的内部结构,只需要与门面类交互即可。
    主要作用
  4. 简化接口:门面模式为客户端提供一个简化的接口,避免直接与复杂的子系统交互。
  5. 松散耦合:门面模式将客户端与子系统解耦,客户端只需要知道门面类的接口,而不需要了解系统的详细实现。
  6. 更好的维护性:当系统需要扩展或修改时,可以只修改门面类或子系统中的部分模块,而不影响客户端。
    门面模式的优缺点
    优点
  7. 简化客户端使用:通过门面,客户端可以更轻松地使用复杂的子系统,而无需了解其内部细节。
  8. 降低耦合:门面将客户端和复杂系统解耦,修改子系统的实现不会影响客户端。
  9. 提高灵活性:可以轻松地对系统进行扩展或调整,门面类可以为子系统增加额外功能。
    缺点
  10. 增加类的数量:引入了新的门面类,可能会使类的数量增加。
  11. 可能的性能开销:如果门面类过于庞大,可能会降低系统性能,特别是当所有请求都要经过门面时。
    使用场景
  12. 简化复杂系统的访问:当系统非常复杂,包含多个模块,且这些模块经常需要被客户端使用时,可以引入门面模式。
  13. 减少耦合:当不希望客户端直接与子系统交互,希望通过一个简化的接口进行访问时,可以使用门面模式。
  14. 提供统一的接口:当需要提供一个标准的接口,供不同的客户端访问时,可以使用门面模式。
    类比理解
    可以将门面模式类比为现实中的“客服中心”。假设一家大公司有多个部门,如技术支持、财务、销售等。如果客户想要与这些部门交互,而不需要了解公司内部结构,客户可以打电话到客服中心,客服会根据客户需求连接到相应的部门,这个“客服中心”就是门面。

代码示例(伪代码):音响系统门面
设想我们有一个复杂的家庭影院系统,包含多个子系统组件,比如音响、DVD播放器、灯光控制等。我们希望通过一个门面接口来控制这些组件,而不是每次直接操作每个子系统。

  1. 子系统类
    package main

import "fmt"

// 子系统1:音响系统
type Amplifier struct{}

func (a *Amplifier) On() {
fmt.Println("Amplifier is turned ON")
}

func (a *Amplifier) SetVolume(volume int) {
fmt.Printf("Amplifier volume is set to %d\n", volume)
}

func (a *Amplifier) Off() {
fmt.Println("Amplifier is turned OFF")
}

// 子系统2:DVD播放器
type DVDPlayer struct{}

func (d *DVDPlayer) Play(movie string) {
fmt.Printf("DVD Player is playing movie: %s\n", movie)
}

func (d *DVDPlayer) Stop() {
fmt.Println("DVD Player has stopped playing")
}

func (d *DVDPlayer) Eject() {
fmt.Println("DVD Player has ejected the disk")
}

// 子系统3:灯光控制
type Lights struct{}

func (l *Lights) Dim(level int) {
fmt.Printf("Lights dimmed to %d%%\n", level)
}

func (l *Lights) On() {
fmt.Println("Lights are ON")
}

func (l *Lights) Off() {
fmt.Println("Lights are OFF")
}
2. 门面类
// 门面类:家庭影院控制
type HomeTheaterFacade struct {
amplifier *Amplifier
dvdPlayer *DVDPlayer
lights *Lights
}

// 创建门面类的构造函数
func NewHomeTheaterFacade(amp *Amplifier, dvd *DVDPlayer, lights *Lights) *HomeTheaterFacade {
return &HomeTheaterFacade{
amplifier: amp,
dvdPlayer: dvd,
lights: lights,
}
}

// 通过门面类简化使用流程
func (ht *HomeTheaterFacade) WatchMovie(movie string) {
fmt.Println("Get ready to watch a movie...")
ht.lights.Dim(10)
ht.amplifier.On()
ht.amplifier.SetVolume(5)
ht.dvdPlayer.Play(movie)
}

func (ht *HomeTheaterFacade) EndMovie() {
fmt.Println("Shutting movie theater down...")
ht.dvdPlayer.Stop()
ht.dvdPlayer.Eject()
ht.amplifier.Off()
ht.lights.On()
}
3. 客户端代码
func main() {
// 创建子系统对象
amplifier := &Amplifier{}
dvdPlayer := &DVDPlayer{}
lights := &Lights{}

// 创建门面对象
homeTheater := NewHomeTheaterFacade(amplifier, dvdPlayer, lights)

// 使用门面对象控制子系统,简化客户端操作
homeTheater.WatchMovie("Inception")
fmt.Println()
homeTheater.EndMovie()

}
4. 输出结果
Get ready to watch a movie...
Lights dimmed to 10%
Amplifier is turned ON
Amplifier volume is set to 5
DVD Player is playing movie: Inception

Shutting movie theater down...
DVD Player has stopped playing
DVD Player has ejected the disk
Amplifier is turned OFF
Lights are ON
解释

  1. 子系统类:Amplifier、DVDPlayer 和 Lights 是家庭影院系统的子系统类,每个类都有自己的方法,比如打开/关闭设备、播放电影、调节灯光等。
  2. 门面类:HomeTheaterFacade 类是门面,它封装了对多个子系统的操作,通过提供简单的方法(WatchMovie 和 EndMovie),隐藏了子系统的复杂性。
  3. 客户端:客户端只需要调用门面类的接口,无需直接与子系统交互,从而简化了操作流程。
    总结
    门面模式的核心思想是“将复杂的系统隐藏起来,通过简单的接口与外部世界交互”,从而简化系统的使用,减少系统的耦合度,并提高系统的灵活性和可维护性。

中秋快乐

标签:fmt,Amplifier,----,Lights,门面,设计模式,子系统,客户端
From: https://www.cnblogs.com/zhifwu/p/18417169

相关文章

  • 探讨九种人格类型在职场环境中的行为表现和应对方式
    全爱型助人型(Helper/Giver)【给予者】*【欲望特质】:追求服待〖基本困思〗:我若不帮助人,就没有人会爱我。〖主要特征〗:渴望别人的爱或良好关系、甘愿迁就他人、以人为本、要别人觉得需要自己、常忽略自己;很在意别人的感情和需要,十分热心,愿意付出爱给别人,看到别人满足地接受......
  • 人工智能生成合成内容标识方法解读
        随着生成式人工智能技术快速发展,利用人工智能技术生成或合成文字、图像、音乐、视频、3D等数字内容成为网络空间内容的主要生产方式,不断为数字经济、产业发展甚至社会变革注入强大动力。然而,伴随内容生成合成门槛的不断降低,新技术的滥用也对网络空间治理提出了更大......
  • 【生成对抗网络GAN】最全的关于生成对抗网络Generative Adversarial Networks,GAN的介
    【生成对抗网络GAN】最全的关于生成对抗网络GenerativeAdversarialNetworks,GAN的介绍!!【生成对抗网络GAN】最全的关于生成对抗网络GenerativeAdversarialNetworks,GAN的介绍!!文章目录【生成对抗网络GAN】最全的关于生成对抗网络GenerativeAdversarialNetworks,GAN的......
  • 简单文本进度条案例
    python用PyCharm软件文本进度条进度条一般以图形的方式显示已完成任务量和未完成任务量,并以动态文字的方式显示任务的完成度。实例目标通过完成本实例,读者应掌握以下知识或技能:熟练使用format()方法格式化字符串。了解time模块中sleep()函数的用法实例分析本实例要实......
  • 【数据结构】线性表作业——归并排序
    【问题描述】有一个含n(n<=200000)个整数的无序序列,采用链表的二路归并排序实现递增排序【输入形式】一行字符串,包含多个整数,每个数之间用空格分开。【输出形式】递增排序的结果,每个数之间用空格分开。【样例输入】947625813【样例输出】12345......
  • 指针详解(中秋版)
       久违的键盘声,熟悉的思绪,仿佛时间在这一刻凝固。距离我上一次敲击键盘写下文字,已不知过了多少个日夜。但文字的魅力就在于,它总能跨越时间的长河,将我们的心灵再次相连。今天,我带着满心的感慨与新的故事,重新坐到了屏幕前。让我们一起,再次启程,探索文字的奥秘。(一)理解......
  • 开学日志7
    学习了数据元素、数据项等的识别:数据项是数据元素的组成部分,就像是我们的身体器官,而数据对象是同种类型的数据元素的集合。java中的基本数据类型和引用数据类型(方法传递参数的两种类型):基本数据类型的数据值是存储在自己空间中的,给其他变量赋值时赋的是真实的值,也就是说,其他变量的......
  • 使用 Spring Boot 的yml配置文件读取方式
    在Java项目中读取YML(YAML)配置文件有多种方式,尤其在使用SpringFramework(包括SpringBoot)时,更是提供了丰富的支持。以下是几种常见的方式来读取YML配置文件:1.使用SpringBoot的自动配置SpringBoot提供了对YML文件的自动化支持,这也是最常用的方式。1.1使用@Value......
  • 【LeetCode Hot 100】5. 最长回文子串
    题目描述考虑回文字符串的特点,从左往右和从右往左读都是一样的,就是说字符串成了“轴对称”。要求一字符串的最长回文子串,我们可以遍历每个字符,求以该字符为轴对称中心的最长对称子串(或者以该字符和下一个字符为中间两个字符的对称子串),在所有这样的子串中长度最长的那个就是我们要......
  • 代码整洁之道--读书笔记(11)
    代码整洁之道简介:本书是编程大师“Bob大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更高台阶。本......