Go设计模式之空对象模式实战

 更新时间:2025年09月18日 09:56:58   作者:liushen0528  
空对计模式是Go语言中一种行为型设计模式,它通过返回实现了相同接口但不执行任何操作的空对象来替代nil值,从而避免因访问nil指针而导致的程序panic,感兴趣的可以了解一下

一、什么是空对象模式?

空对计模式是Go语言中一种行为型设计模式。它通过返回实现了相同接口但不执行任何操作的空对象来替代nil值,从而避免因访问nil指针而导致的程序panic。这种模式特别适用于处理对象可能为nil的情况。

二、如何实现空对象模式?

空对象模式中有三种关键角色:接口对象、真实对象、空对象。

1)接口对象:定义接口方法。

2)真实对象:实现接口对象类,实现接口对象类定义的所有方法,向调用者提供实现业务逻辑的方法。

3)空对象:实现接口对象类,实现接口对象类定义的所有方法,但方法内无具体的业务实现。

以日志输出为例,首先定义一个接口类Logger,并定义一个日志输出方法Write,代码示例如下:

type Logger interface {
    Write(str string)
}

定义一个空对象实现Logger接口类,实现的Write方法中无具体内容,代码示例如下:

// 空logger
type NullLogger struct {
}

func (n * NullLogger) Write(str string) {
    // 无具体内容
}

定义两个真实对象实现Logger接口类,实现Write方法中有具体的操作内容,代码示例如下:

// 真实对象FileLogger
type FileLogger struct {
}

func (f *FileLogger) Write(str string) {
    fmt.Println("将日志写入文件:",str)
}

// 真实对象 ConsoleLogger
type ConsoleLogger struct {
}

func (c *ConsoleLogger) Write(str string) {
    fmt.Println("控制台输出日志:",str)
}

当调用者获取日志输出时,没有具体实现对象时,则返回空对象,代码实录如下:

func main() {
    logger := getLogger("file")
    logger.Write("file")
    logger = getLogger("console")
    logger.Write("console")
    logger = getLogger("log")
    logger.Write("console")
}
func getLogger(loggerType string) Logger {
    if "file" == loggerType {
        return &FileLogger{}
    }
    if "console" == loggerType {
        return &ConsoleLogger{}
    }
    return &NullLogger{}
}

通过调用getLogger方法获取logger对象,当传入file和console时,能够返回具体真实对象,当传入非file和console时,返回空对象。执行结果如下:

三、空对象模式优缺点

优点:

1)提升系统稳定性,有效减少空指针异常的发生。

2)优化代码结构,消除冗余的nil检查,使逻辑更加简洁清晰。

缺点:

1)每个实体类需创建对应的空对象,增加类的数量。

2)过度使用可能隐藏潜在逻辑错误。

四、空对象应用场景

1)日志系统:当未配置日志器时默认返回 NilLogger,消除调用方的空指针判断逻辑。

2)插件架构:插件未加载时自动返回空实现,确保主流程不受影响继续执行。

3)单元测试:通过空对象模式模拟依赖组件(如数据库访问层),简化测试环境搭建。

到此这篇关于Go设计模式之空对象模式实战的文章就介绍到这了,更多相关Go 空对象模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GO使用socket和channel实现简单控制台聊天室

    GO使用socket和channel实现简单控制台聊天室

    今天小编给大家分享一个简单的聊天室功能,聊天室主要功能是用户可以加入离开聊天室,实现思路也很简单明了,下面小编给大家带来了完整代码,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • go处理线程之间的交互示例代码

    go处理线程之间的交互示例代码

    Go语言以goroutine为核心实现并发编程,其中线程间交互主要通过Channels、WaitGroup、Mutex和Select实现,Channels提供goroutine间的数据传递,本文给大家介绍go处理线程之间的交互示例代码,感兴趣的朋友一起看看吧
    2024-10-10
  • MacOS下本地golang环境搭建详细教程

    MacOS下本地golang环境搭建详细教程

    这篇文章主要介绍了MacOS下本地golang环境搭建详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Golang的md5 hash计算操作

    Golang的md5 hash计算操作

    这篇文章主要介绍了Golang的md5 hash计算操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言LeetCode500键盘行题解示例详解

    Go语言LeetCode500键盘行题解示例详解

    这篇文章主要为大家介绍了Go语言LeetCode500键盘行题解示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 详解golang的切片扩容机制

    详解golang的切片扩容机制

    golang的切片扩容机制是golang面试者绕不开的一扇大门,无论在面试提问,或者面试情景上都绕不开它,今天就说说我理解下的切片扩容机制,感兴趣的小伙伴跟着小编一起来看看吧
    2023-07-07
  • Go语言简介和环境配置

    Go语言简介和环境配置

    Go语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发速度和易维护性,有人形容Go语言:Go= C + Python , 说明Go语言既有C静态语言程序的运行速度,又能达到Python动态语言的快速开发,这篇文章主要介绍了Go介绍和环境配置,需要的朋友可以参考下
    2022-07-07
  • Golang Mutex互斥锁源码分析

    Golang Mutex互斥锁源码分析

    本篇文章,我们将一起来探究下Golang Mutex底层是如何实现的,知其然,更要知其所以然。文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-10-10
  • GO语言中创建切片的三种实现方式

    GO语言中创建切片的三种实现方式

    这篇文章主要介绍了GO语言中创建切片的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 一文带你熟悉Go语言中的for循环

    一文带你熟悉Go语言中的for循环

    这篇文章主要和大家分享一下Go语言中for循环的定义与使用,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考一下
    2022-11-11

最新评论