GO设计模式——23、空对象模式(行为型)
2023-12-21 16:40:29
目录
空对象模式(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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!