Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go 空对象模式

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

作者: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 空对象模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文