
回复
还记得第一次设计设备驱动框架时,面对多设备适配的混乱代码,直到用抽象类和接口重构后才豁然开朗。这套架构方案在智能家居项目中经受住了10+设备类型的考验,今天分享其中的核心设计思路。
特性 | 抽象类 | 接口 |
---|---|---|
定位 | 算法骨架(带部分实现) | 能力契约(纯行为定义) |
使用场景 | 数据处理流程标准化 | 跨模块能力抽象 |
典型案例 | 日志框架基础实现 | 通信协议定义 |
协作黄金法则:
// 定义日志接口(契约)
interface LogContract {
func log(msg: String)
func logError(msg: String)
}
// 抽象类实现公共逻辑
abstract class BaseLogger <: LogContract {
// 模板方法:统一日志格式
public func log(msg: String) {
let time = getFormattedTime()
appendLog("[\(time)] \(msg)") // 抽象方法由子类实现
}
public func logError(msg: String) {
log(msg: "[ERROR] \(msg)") // 复用普通日志逻辑
}
protected abstract func appendLog(formattedMsg: String)
private func getFormattedTime() -> String { /* 通用时间格式化 */ }
}
// 具体实现类(文件日志)
class FileLogger <: BaseLogger {
private var fileHandler: FileHandler
protected override func appendLog(formattedMsg: String) {
fileHandler.write(formattedMsg)
}
}
关键优势:
// 定义设备控制接口
interface Controlable {
func powerOn()
func powerOff()
}
// 定义状态上报接口
interface Reportable {
func getStatus() -> String
}
// 抽象类整合双重能力
abstract class DeviceDriver <: Controlable, Reportable {
// 开机模板方法
public func powerOn() {
checkPermission() // 通用权限检查
doPowerOn() // 抽象:子类实现具体开机逻辑
logStatus() // 通用状态记录
}
public func getStatus() -> String { /* 通用状态格式 */ }
protected abstract func doPowerOn()
private func checkPermission() { /* 通用权限逻辑 */ }
}
// WiFi模块驱动实现
class WiFiDriver <: DeviceDriver {
protected override func doPowerOn() {
// WiFi芯片初始化逻辑
println("WiFi模块已启动")
}
}
interface A { func action() }
interface B { func action() }
// 抽象类统一冲突处理
abstract class ConflictHandler <: A, B {
public func action() {
// 统一预处理逻辑
handleAction() // 抽象方法由子类实现
}
protected abstract func handleAction()
}
初版问题:
public abstract func release()
~init() { release() } // 确保资源释放
// 插件基础接口
interface Plugin {
func init(params: Any) -> Bool
func execute() -> Any
}
// 插件抽象类(实现公共逻辑)
abstract class BasePlugin <: Plugin {
public func init(params: Any) -> Bool {
// 通用初始化检查
return doInit(params)
}
protected abstract func doInit(params: Any) -> Bool
public abstract func execute() -> Any
}
// 网络插件实现
class NetworkPlugin <: BasePlugin {
protected override func doInit(params: Any) -> Bool {
// 网络插件特有初始化
}
public func execute() -> Any { /* 网络请求逻辑 */ }
}
插件化优势: