Go 设计模式中外观模式

鱼弦:CSDN内容合伙人、CSDN新星导师、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)

 

外观模式原理详细解释:
外观模式(Facade Pattern)是一种结构型设计模式,提供了一个统一的接口,用于访问子系统中的一组接口。外观模式隐藏了子系统的复杂性,使得客户端可以通过简单的接口与子系统进行交互,而不需要了解子系统的内部实现细节。

外观模式通过引入一个外观类(Facade Class),将一组子系统的接口封装起来。客户端只需与外观类进行交互,而不需要直接与各个子系统进行通信。外观类负责将客户端的请求转发给适当的子系统对象,并返回结果给客户端。

外观模式的核心思想是简化客户端与子系统之间的交互,并降低客户端对子系统的依赖。它提供了一种高层次的接口,使得客户端可以更方便地使用子系统。

底层结构图:
以下是外观模式的经典结构图:

+----------------------------+
|          Client            |
+----------------------------+
| + Operation()               |
+----------------------------+

        ^
        |
        |
        |
        |
        v

+----------------------------+
|         Facade             |
+----------------------------+
| - subsystem1              |
| - subsystem2              |
| + Operation()               |
+----------------------------+

        ^
        |
        |
        |
        |
        v

+----------------------------+
|    Subsystem1            |
+----------------------------+
| + Operation1()             |
+----------------------------+

+----------------------------+
|    Subsystem2            |
+----------------------------+
| + Operation2()             |
+----------------------------+

在上述结构图中,Client 是客户端,通过调用 Operation() 方法来与子系统进行交互。

Facade 是外观类,封装了一组子系统的接口,负责将客户端的请求转发给适当的子系统对象。

Subsystem1 和 Subsystem2 是子系统,实现了具体的功能,但客户端直接访问它们的接口比较复杂。

使用场景解释:
外观模式适用于以下场景:

  1. 当需要简化复杂子系统的接口并提供一个统一的高层次接口时,可以使用外观模式。外观模式使得客户端可以更方便地使用子系统,而不需要了解其内部实现细节。
  2. 当存在多个子系统,并且客户端需要与多个子系统进行交互时,可以使用外观模式。外观模式可以将这些交互集中到一个外观类中,简化客户端的代码。

代码示例实现:
以下是一个使用Go语言实现外观模式的示例:

package main

import "fmt"

// Subsystem1 子系统1
type Subsystem1 struct{}

// Operation1 子系统1的操作
func (s *Subsystem1) Operation1() {
	fmt.Println("Subsystem1: Operation1")
}

// Subsystem2 子系统2
type Subsystem2 struct{}

// Operation2 子系统2的操作
func (s *Subsystem2) Operation2() {
	fmt.Println("Subsystem2: Operation2")
}

// Facade 外观类
type Facade struct {
	subsystem1 *Subsystem1
	subsystem2 *Subsystem2
}

// NewFacade 创建外观类实例
func NewFacade() *Facade {
	return &Facade{
		subsystem1: &Subsystem1{},
		subsystem2: &Subsystem2{},
	}
}

// Operation 客户端调用的操作
func (f *Facade) Operation() {
	fmt.Println("Facade: Operation")
	f.subsystem1.Operation1()
	f.subsystem2.Operation2()
}

func main() {
	facade := NewFacade()
	facade.Operation()
}

在上述示例中,我们定义了子系统1(Subsystem1)和子系统2(Subsystem2),它们分别实现了具体的操作。

外观类(Facade)封装了子系统的接口,并提供了一个统一的接口 Operation()。客户端可以通过调用外观类的 Operation() 方法来间接访问子系统。

在 main() 函数中,我们创建了外观类的实例 facade,然后调用了 facade.Operation() 方法来执行操作。输出结果如下:

Facade: Operation
Subsystem1: Operation1
Subsystem2: Operation2

文献材料链接:
以下是关于外观模式的一些文献材料链接,你可以通过它们了解更多关于外观模式的详细信息:

  1. Design Patterns: Elements of Reusable Object-Oriented Software - Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
    Link

  2. Head First Design Patterns - Eric Freeman, Elisabeth Robson, Bert Bates, Kathy Sierra
    Link

  3. Refactoring Guru - Facade Pattern
    Link

  4. Tutorialspoint - Facade Design Pattern in Go
    Link

以上链接提供了一些书籍和在线教程,可以进一步学习和了解外观模式的概念、实现和应用。

当前都有哪些产品在使用:
外观模式是一种常见的设计模式,广泛应用于软件开发中的各个领域。许多软件产品和框架都使用了外观模式来简化复杂的子系统接口。

以下是一些当前常见的产品和框架,它们使用了外观模式或类似的概念:

  1. Java Servlet API:Java Servlet API 提供了一个 Servlet 外观类(HttpServlet),用于简化开发 Web 应用程序的接口。

  2. Spring Framework:Spring Framework 提供了一个统一的外观接口(ApplicationContext)来管理应用程序的各个组件和依赖关系。

  3. jQuery:jQuery 是一个流行的 JavaScript 库,它提供了一个简化的接口,用于处理浏览器兼容性和操作 DOM。

猜你喜欢

转载自blog.csdn.net/feng1790291543/article/details/132159670