浅析Go设计模式之Facade(外观)模式
作者:程序员祝融 发布时间:2023-07-16 19:23:08
我们在日常开发中,我们经常会面对复杂的子系统,其中包含许多相互关联的类和接口。直接使用这些类和接口可能会导致代码的复杂性增加,使得系统难以维护和理解。为了解决这个问题,我们可以使用外观模式来提供一个简化的接口,隐藏底层子系统的复杂性,使得客户端可以更方便地使用子系统功能。
什么是外观模式?
外观模式(Facade Pattern)是一种结构型设计模式,通过提供一个统一的接口,封装了一个或多个复杂的子系统,为客户端提供简化的访问方式。外观模式将复杂子系统的接口和实现细节与客户端代码解耦,使得客户端只需要与外观对象进行交互,而不需要了解底层子系统的复杂性。
外观模式的结构
外观模式包含以下几个角色:
Facade(外观):外观对象是客户端与子系统之间的中间层,它提供了一个简化的接口,将客户端的请求委派给子系统处理。外观对象知道哪些子系统类负责处理请求,并将请求分派给它们。
Subsystem(子系统):子系统是实现具体功能的一组类或接口。外观对象将客户端的请求转发给适当的子系统类进行处理。
Client(客户端):客户端通过外观对象来访问子系统的功能,它只需要与外观对象进行交互,而不需要直接与子系统类打交道。
工作原理
客户端通过实例化外观对象来访问子系统的功能。
外观对象接收客户端的请求,并根据请求的类型和参数,将请求委派给适当的子系统类处理。
子系统类接收到请求后,执行相应的功能逻辑。
外观对象将子系统的处理结果返回给客户端。
代码实现
在Golang中,可以通过定义一个外观结构体来实现外观模式。外观结构体封装了底层子系统的复杂性,并提供简化的方法供客户端使用。以下是一个简单的Golang外观模式的示例:
func NewAPI() API {
return &apiImpl{
a: NewAModuleAPI(),
b: NewBModuleAPI(),
}
}
// API is facade interface of facade package
type API interface {
Test() string
}
// apiImpl facade implement
type apiImpl struct {
a AModuleAPI
b BModuleAPI
}
func (a *apiImpl) Test() string {
aRet := a.a.TestA()
bRet := a.b.TestB()
return fmt.Sprintf("\n%s\n%s\n", aRet, bRet)
}
// NewAModuleAPI return new AModuleAPI
func NewAModuleAPI() AModuleAPI {
return &aModuleImpl{}
}
// AModuleAPI ...
type AModuleAPI interface {
TestA() string
}
type aModuleImpl struct{}
func (*aModuleImpl) TestA() string {
return "A module running"
}
// NewBModuleAPI return new BModuleAPI
func NewBModuleAPI() BModuleAPI {
return &bModuleImpl{}
}
// BModuleAPI ...
type BModuleAPI interface {
TestB() string
}
type bModuleImpl struct{}
func (*bModuleImpl) TestB() string {
return "B module running"
}
func TestFacadeAPI(t *testing.T) {
api := NewAPI()
ret := api.Test()
t.Log(ret)
}
/**输出
A module running
B module running
**/
可以看到,客户端只需要与外观对象进行交互,通过调用外观对象的方法来完成相应的操作,而无需了解底层子系统的复杂性。
外观模式在实际开发中可以帮助我们简化复杂子系统的使用,并提供一致的接口供客户端使用。它可以降低代码的耦合度,提高代码的可维护性和可读性。
总结:
本文介绍了外观模式的概念、结构和工作原理,并提供了一个简单的 Golang 实现示例。外观模式在实际开发中可以帮助我们简化复杂子系统的使用,提供一致的接口供客户端调用。通过使用外观模式,可以降低代码的耦合度,提高代码的可维护性和可读性。
来源:https://juejin.cn/post/7234436390281183289


猜你喜欢
- 本文实例讲述了python获取从命令行输入数字的方法。分享给大家供大家参考。具体如下:#--------------------------
- 每次遇到pandas的dataframe某列日期格式问题总会哉坑,下面记录一下常用时间日期函数....1、字符串转化为日期 str—>
- 一,VSCODE配置Markdown 打开左侧的extensions,或者使用 Ctrl+Shift+X,输入Markdown(1
- 看到Django和layim实现websocketde资料很少,自己就琢磨了下,顺便搭建出来了。自己要去找闲心大神授权呀。先来看图这是初次搭
- 正确的安装1、先安装packagingpython3 -m pip install packaging执行这个命令后会提示这样安装成功Def
- def cndebug(obj=False): """ Author : Nemon Update : 200
- Qt中正确的设置窗体的背景图片的方法大致有两种,下面将逐个讲解:一. 利用styleSheet设置窗体的背景图片使用stylesheet设置
- 2012年,Hinton的学生Alex Krizhevsky提出了深度卷积神经网络模型AlexNet,它可以算是LeNet的一种更深更宽的版
- 在爬一个网站的时候,端点包含中文浏览器是可以自动解决这个转换的,在代码中就需要处理一下了。请求过程的异常如下:self._output(re
- 首次安装、运行MySQL时,你可能会遇到一些错误,使MySQL服务器不能启动。本节的目的是帮助你诊断并纠正这些错误。解决服务器问题时你的第一
- 清空服务器缓存asp代码: <%Call RemoveAllCache()Sub RemoveAllCa
- 作者:Scott Gerber原标题:Mobile App Development: 10 Tips for Small Business
- 我不知道没有他们我该如何生活我编写Python已有5年以上了,我的工具集通常变得越来越小,而不是越来越大。 许多工具不是必需的或无用的,而其
- 前言本文通过一个小范例来学习java中通过正则表达式如何获得一个字符串中的数字,下面话不多说,来看看详细的介绍吧。示例代码如下:import
- 1. 使用readline模块逐行读取流数据1.1. 创建Interface对象在readline模块中,通过Interface对象的使用来
- Pygame 中提供了一个draw模块用来绘制一些简单的图形状,比如矩形、多边形、圆形、直线、弧线等。pygame.draw模块的常用方法如
- /* --注意:准备数据(可略过,非常耗时) CREATE TABLE CHECK1_T1 ( ID INT, C1 CHAR(8000)
- 前言可能很多小伙伴会因为pycharm全是英文而烦恼吧,本博主呢也是一个英语刚过四级的小白,深知大家的难处,所以会奉上最详细的修改中文的教程
- asp之家注:防止表单重复提交的方法,在客户端其实很容易实现,只要使用js让用户第一次点击提交按钮后,把提交按钮设置为disabled,这样
- pycharm一般安装完毕,就是默认是自动保存的,但是......但是....既然是程序,既然是软件,就难免出现bug。也许会 * 友出现头天