面试题答案
一键面试接口隔离原则含义
在Go语言函数封装范畴内,接口隔离原则(Interface Segregation Principle,ISP)指客户端不应该依赖它不需要的接口。即一个类对另一个类的依赖应该建立在最小的接口上,将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户端真正需要的方法。
实际场景举例
- 电商系统订单处理:假设电商系统中有处理订单的模块。最初可能有一个大接口
OrderProcessor
包含所有订单处理相关操作,如创建订单、支付订单、发货、取消订单等方法。不同角色的服务只需要部分方法,例如支付服务只需要PayOrder
方法,物流服务只需要ShipOrder
方法。按照接口隔离原则,可以拆分成PaymentProcessor
接口(只包含PayOrder
方法)和LogisticsProcessor
接口(只包含ShipOrder
方法)。这样每个服务只依赖自己需要的接口,降低了耦合度,当支付逻辑或物流逻辑发生变化时,不会影响到其他不相关的服务,提升了代码的可维护性和可扩展性。
示例代码如下:
// 原始大接口
type OrderProcessor interface {
CreateOrder()
PayOrder()
ShipOrder()
CancelOrder()
}
// 拆分后的支付接口
type PaymentProcessor interface {
PayOrder()
}
// 拆分后的物流接口
type LogisticsProcessor interface {
ShipOrder()
}
// 支付服务实现支付接口
type PaymentService struct{}
func (p PaymentService) PayOrder() {
// 支付逻辑
}
// 物流服务实现物流接口
type LogisticsService struct{}
func (l LogisticsService) ShipOrder() {
// 发货逻辑
}
- 图形绘制系统:在图形绘制系统中,可能有一个
Shape
接口,包含Draw
方法用于绘制图形,同时还包含一些针对特定图形(如CalculateArea
计算面积,仅适用于矩形、圆形等有面积概念的图形)的方法。如果所有图形都实现这个大接口,对于没有面积概念的图形(如线段)就会很尴尬。按照接口隔离原则,可以将接口拆分为Drawable
接口(仅包含Draw
方法)和AreaCalculable
接口(包含CalculateArea
方法)。矩形、圆形等实现Drawable
和AreaCalculable
接口,线段只实现Drawable
接口。这样不同类型的图形只依赖自己需要的接口,当新增一种图形时,如果它没有面积计算需求,就不需要实现面积计算相关方法,提升了代码的可扩展性和可维护性。
示例代码如下:
// 绘制接口
type Drawable interface {
Draw()
}
// 面积计算接口
type AreaCalculable interface {
CalculateArea() float64
}
// 矩形结构体,实现绘制和面积计算接口
type Rectangle struct {
width, height float64
}
func (r Rectangle) Draw() {
// 绘制矩形逻辑
}
func (r Rectangle) CalculateArea() float64 {
return r.width * r.height
}
// 线段结构体,只实现绘制接口
type Line struct {
start, end Point
}
func (l Line) Draw() {
// 绘制线段逻辑
}