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