GO设计模式——23、空对象模式(行为型)

2023-12-21 16:40:29

目录

空对象模式(Null Object Pattern)

空对象模式的核心角色:

优缺点

代码实现


空对象模式(Null Object Pattern)

????????空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。在空对象模式中,创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。

空对象模式核心角色

  • 抽象对象(AbstractObject):接口,定义了子struct需要实现的方法
  • 真实对象(RealObject):实现了抽象对象的具体struct
  • 空对象(NullObject):这个就表示了空对象,继承AbstractObject类,对父类方法和属性不做实现和赋值,它的值都是空的。

优缺点

(1)优点:

  • 它可以加强系统的稳固性,能有效地减少空指针报错对整个系统的影响,使系统更加稳定。
  • 它能够实现对空对象情况的定制化的控制,掌握处理空对象的主动权。
  • 它并不依靠Client来保证整个系统的稳定运行。
  • 它通过定义isNull()对使用条件语句==null的替换,显得更加优雅,更加易懂。

(2)缺点:

  • 每一个要返回的真实的实体都要建立一个对应的空对象模型,那样会增加类的数量。

代码实现

package main

import "fmt"

// AbstractCustomer 客户对象接口
type AbstractCustomer interface {
    Isnil() bool
    GetName() string
}

// RealCustomer 真实客户对象类
type RealCustomer struct {
    Name string
}

// NewRealCustomer 实例化真实客户对象
func NewRealCustomer(name string) *RealCustomer {
    return &RealCustomer{
       Name: name,
    }
}

// Isnil 真实客户对象nil判断
func (r *RealCustomer) Isnil() bool {
    return false
}

// GetName 获取真实客户对象名称
func (r *RealCustomer) GetName() (name string) {
    return r.Name
}

// NullCustomer 空客户对象类
type NullCustomer struct {
    Name string
}

// NewNullCustomer 实例化空客户对象
func NewNullCustomer() *NullCustomer {
    return &NullCustomer{}
}

// Isnil 空客户对象nil判断
func (n *NullCustomer) Isnil() bool {
    return true
}

// GetName 空客户对象获取名称
func (n *NullCustomer) GetName() (name string) {
    return "Not Available in Customer Database"
}

// 客户工厂类用于获取客户,如果客户名称不在工厂类中,就返回空对象。
// CustomerFactory 客户工厂类
type CustomerFactory struct {
    Names []string
}

// NewCustomerFactory 实例化客户工厂类
func NewCustomerFactory() *CustomerFactory {
    return &CustomerFactory{
       Names: []string{"Bob", "Lily", "James"},
    }
}

// GetCustomer 从客户工厂类获取客户对象
func (c *CustomerFactory) GetCustomer(name string) AbstractCustomer {
    for _, v := range c.Names {
       if v == name {
          return NewRealCustomer(name)
       }
    }
    return NewNullCustomer()
}

func main() {
    customerFactory := NewCustomerFactory()

    customer1 := customerFactory.GetCustomer("Lily")
    customer2 := customerFactory.GetCustomer("Allen")
    customer3 := customerFactory.GetCustomer("James")
    customer4 := customerFactory.GetCustomer("Bob")
    customer5 := customerFactory.GetCustomer("Jay")

    fmt.Println(customer1.GetName())
    fmt.Println(customer2.GetName())
    fmt.Println(customer3.GetName())
    fmt.Println(customer4.GetName())
    fmt.Println(customer5.GetName())
}

文章来源:https://blog.csdn.net/Gloming__zxy/article/details/135133529
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。