https://blog.csdn.net/qibin0506/article/details/51749759
- 部分方法子类继承父类共享,其他用接口交给子类实现
设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。
取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。

SetName是各类共享的初始化方法,Out()也是各类共享但是是所有子类共享的抽象步骤合集。interface作为子类自由发挥的部分作为父类成员指向子类,通过 接口.BeforeOut()
在父类指针中调用子类的自由发挥方法。

package main
import "fmt"
type IPerson interface {
SetName(name string)
BeforeOut()
Out()
}
type Person struct {
Specific IPerson
name string
}
func (this *Person) SetName(name string) {
this.name = name
}
func (this *Person) Out() {
this.BeforeOut()
fmt.Println(this.name + " go out...")
}
func (this *Person) BeforeOut() {
if this.Specific == nil {
return
}
this.Specific.BeforeOut()
}
type Boy struct {
Person
}
func (_ *Boy) BeforeOut() {
fmt.Println("get up..")
}
type Girl struct {
Person
}
func (_ *Girl) BeforeOut() {
fmt.Println("dress up..")
}
func main() {
var p *Person = &Person{}
p.Specific = &Boy{}
p.SetName("Boy")
p.Out()
p.Specific = &Girl{}
p.SetName("Girl")
p.Out()
}
网友评论