golang接口
接口像是一个公司里面的领导,他会定义一些通用规范,只设计规范,而不实现规范。
go语言的接口,是一种新的类型定义,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。
语法格式和方法非常类似。
接口的语法格式
/* 定义接口 */
type interface_name interface {
method_name1 [return_type]
method_name2 [return_type]
method_name3 [return_type]
...
method_namen [return_type]
}
/* 定义结构体 */
type struct_name struct {
/* variables */
}
/* 实现接口方法 */
func (struct_name_variable struct_name) method_name1() [return_type] {
/* 方法实现 */
}
...
func (struct_name_variable struct_name) method_namen() [return_type] {
/* 方法实现*/
}
在接口定义中定义,若干个空方法。这些方法都具有通用性。
接口实例
下面我定义一个USB接口,有读read和写write两个方法,再定义一个电脑Computer和一个手机Mobile来实现这个接口。
package main
import (
"fmt"
)
type USB interface {
read()
write()
}
type Computer struct {
driver_name string
}
type Mobile struct {
driver_name string
}
func (m Mobile) read() {
fmt.Printf("设备名称是,ags read:%v\n", m.driver_name)
}
func (m Mobile) write() {
fmt.Printf("设备名称是,ags write:%v\n", m.driver_name)
}
func (c Computer) read() {
fmt.Printf("设备名称是,ags read:%v\n", c.driver_name)
}
func (c Computer) write() {
fmt.Printf("设备名称是,ags write:%v\n", c.driver_name)
}
func main() {
c := Mobile{"apple"}
m := Computer{"lenovo"}
c.read()
c.write()
m.read()
m.write()
}
输出结果
设备名称是,ags read:apple
设备名称是,ags write:apple
设备名称是,ags read:lenovo
设备名称是,ags write:lenovo
ocp设计原则
按照上面的例子,我们可以看到,如果我们新增一台平板设备,那么我们需要新增一个平板,在定义他的读写功能,那么ocp是什么?
而面向对象的可复用设计的第一块基石,便是所谓的”开-闭“原则(Open-Closed Principle,常缩写为OCP)。虽然,go不是面向对象语言,但是也可以模拟实现这个原则。对扩展是开放的,对修改是关闭的。
使用ocp设计原则之前的代码扩容平板接口
package main
import (
"fmt"
)
type USB interface {
read()
write()
}
type Computer struct {
driver_name string
}
type Mobile struct {
driver_name string
}
type Pad struct {
driver_name string
}
func (p Pad) read() {
fmt.Printf("设备名称是,ags read:%v\n", p.driver_name)
}
func (p Pad) write() {
fmt.Printf("设备名称是,ags write:%v\n", p.driver_name)
}
func (m Mobile) read() {
fmt.Printf("设备名称是,ags read:%v\n", m.driver_name)
}
func (m Mobile) write() {
fmt.Printf("设备名称是,ags write:%v\n", m.driver_name)
}
func (c Computer) read() {
fmt.Printf("设备名称是,ags read:%v\n", c.driver_name)
}
func (c Computer) write() {
fmt.Printf("设备名称是,ags write:%v\n", c.driver_name)
}
func main() {
c := Mobile{"apple"}
m := Computer{"lenovo"}
p := Pad{"apple"}
p.read()
p.write()
c.read()
c.write()
m.read()
m.write()
}
使用ocp思想之后设计
package main
import (
"fmt"
)
type USB interface {
read()
write()
}
type Computer struct {
driver_name string
}
type Mobile struct {
driver_name string
}
type Pad struct {
driver_name string
}
func (p Pad) read() {
fmt.Printf("设备名称是,ags read:%v\n", p.driver_name)
}
func (p Pad) write() {
fmt.Printf("设备名称是,ags write:%v\n", p.driver_name)
}
func (m Mobile) read() {
fmt.Printf("设备名称是,ags read:%v\n", m.driver_name)
}
func (m Mobile) write() {
fmt.Printf("设备名称是,ags write:%v\n", m.driver_name)
}
func (c Computer) read() {
fmt.Printf("设备名称是,ags read:%v\n", c.driver_name)
}
func (c Computer) write() {
fmt.Printf("设备名称是,ags write:%v\n", c.driver_name)
}
type Person struct {
}
func (person Person) care(u USB) {
u.read()
u.write()
}
func main() {
Computer := Computer{"lenovo"}
Mobile := Mobile{"lenovo"}
Pad := Pad{"xiaomi"}
Person := Person{}
Person.care(Computer)
Person.care(Mobile)
Person.care(Pad)
}