go 继承 表驱动

阅读更多

type base interface { //类似基类定义
    virtualfunc() int //类似虚函数抽象定义
}
 
type der1 int //类似派生类1定义
 
func (der1) virtualfunc() int { //类似派生类1虚函数具体实现
    fmt.Printf("I'm der1\n")
    return 1
}
 
type der2 struct { //类似派生类2定义
    //nothing
}
 
func (der2) virtualfunc() int { //类似派生类2虚函数具体实现
    fmt.Printf("I'm der2\n")
    return 2
}
 
func somefunc(b base) { //作为某个函数的形参
    b.virtualfunc()
}




表驱动

func entry() {
    var bi BusinessInstance
    switch businessType {
      case TravelBusiness:
           bi = travelorder.New()
      case MarketBusiness:
          bi = marketorder.New()
      default:
          return errors.New("not supported business")
}


可以修改为:接口和表驱动开发

var businessInstanceMap = map[int]BusinessInstance {
     TravelBusiness : travelorder.New(),
     MarketBusiness : marketorder.New(),
} 

func entry() {
    bi := businessInstanceMap[businessType]
}


表驱动的设计方式,很多设计模式相关的书籍并没有把它作为一种设计模式来讲,
但我认为这依然是一种非常重要的帮助我们来简化代码的手段。在日常的开发工作
中可以多多思考,哪些不必要的 switch case 可以用一个字典和一行代码就可以
轻松搞定。
当然,表驱动也不是缺点,因为需要对输入 key 计算哈希,在性能敏感的场合,
需要多加斟







你可能感兴趣的:(go 继承 表驱动)