面试题答案
一键面试接口组合模式相较于传统继承方式的优势
- 灵活性更高:继承是一种强耦合关系,子类会继承父类的所有属性和方法,即使某些方法在子类中并不适用。而接口组合模式下,一个类型可以根据自身需求组合多个接口,只实现自己需要的行为,避免了不必要的继承。
- 避免多重继承的复杂性:在一些语言(如C++)中支持多重继承,这可能会导致菱形继承等复杂问题。Go语言没有传统的继承,通过接口组合模式可以更简洁地实现类似多重继承的功能,却不会引入复杂的继承关系。
- 易于维护和扩展:接口组合使得代码结构更加清晰,当需要对某个行为进行修改或添加新行为时,只需要修改或新增对应的接口及实现,而不会影响到其他无关的代码。相比之下,继承体系的修改可能会因为层层依赖而牵一发而动全身。
使用接口组合模式实现简单图形绘制系统
package main
import "fmt"
// 定义绘制接口
type Drawable interface {
Draw()
}
// 圆形结构体
type Circle struct {
Radius float64
}
// 圆形实现Drawable接口的Draw方法
func (c Circle) Draw() {
fmt.Printf("绘制圆形,半径为:%.2f\n", c.Radius)
}
// 矩形结构体
type Rectangle struct {
Width float64
Height float64
}
// 矩形实现Drawable接口的Draw方法
func (r Rectangle) Draw() {
fmt.Printf("绘制矩形,宽为:%.2f,高为:%.2f\n", r.Width, r.Height)
}
func main() {
// 创建圆形实例
circle := Circle{Radius: 5.0}
// 创建矩形实例
rectangle := Rectangle{Width: 4.0, Height: 3.0}
// 定义一个Drawable类型的切片
var shapes []Drawable
shapes = append(shapes, circle)
shapes = append(shapes, rectangle)
// 遍历并绘制所有图形
for _, shape := range shapes {
shape.Draw()
}
}
在上述代码中,首先定义了Drawable
接口,其中包含Draw
方法。然后Circle
和Rectangle
结构体分别实现了该接口的Draw
方法。在main
函数中,创建了圆形和矩形的实例,并将它们添加到Drawable
类型的切片中,通过遍历切片调用每个图形的Draw
方法,实现了图形绘制系统。这种方式通过接口组合,使不同的图形结构体只关注自己的绘制行为,具有良好的灵活性和扩展性。