24.Golang设计模式之空对象模式

ShawnLee_123 · · 887 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

空对象模式

GitHub代码链接

什么是空对象模式

空对象模式(Null Object Pattern),使用空对象来取代Null对象实例的检测。

解决了什么问题

Null对象不是空值,而是返回一个不做任何动作的空对象。这样Null对象也可以在数据
不可用的时候执行一些默认动作。

代码实现

1. 抽象接口实现

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

2. 实例对象类实现

//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
}

3. 空对象类实现

//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"
}

4. 客户工厂类

客户工厂类用于获取客户,如果客户名称不在工厂类中,就返回空对象。

//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()
}

5. 测试

func NullObjectPatternTest(t *testing.T) {
    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())
}

上一篇

23.Golang设计模式之状态模式


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:ShawnLee_123

查看原文:24.Golang设计模式之空对象模式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

887 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传