当比方说,我们有下面的类(简体)分享:代码中使用组成
class AudioRecorder {
private func onRecord(data: [Float]) {
self.delegate?.audioRecorder(self, didRecordFrame: audioData)
public func record() { ... }
public func stop() { ... }
}
所以它记录框架,并通知一下它的委托。 现在我需要它具有以下功能扩展:
- 缓冲 - 帧缓冲X号
- 间隔记录 - 记录 - 停止1秒 - 记录 - 停止秒...
- 间隔缓冲 - 记录在间隔和缓冲
因为如果IntervalRecorder
和BufferingRecorder
是子类,然后我有实现IntervalBufferingRecorder
问题我不能使用继承这一点。
在另一方面,使用组合物的溶液时,可以是这个样子:
class BufferingRecorder {
private let recorder: AudioRecorder
func audioRecorder(recorder: AudioRecorder, didRecordFrame: [Float]) {
// buffering logic
}
// need to duplicate play and stop
func record() {
self.recorder.startRecording()
}
func stop() {
self.recorder.stop()
}
}
我需要复制所有的IntervalRecorder
,BufferingRecorder
和IntervalBufferingRecorder
播放暂停的方法,只是期待底层对象。
对这个问题有什么好的方法?语言很快,但我想这不是很重要。
有一个着名的WWDC视频关于面向协议的编程,这里是另一个教程https://www.raywenderlich.com/148448/introducing-protocol-oriented-programming。通过它,你会明白这个主意。 – adev
你的问题对我来说有点含糊,如果你可以尝试解释更多关于你的类和子类的话可能会更好。如果您想避免继承,请尝试使用默认实现的协议。 – KeranMarinov
'play'和'stop'不是记录函数,这违反了接口分离的原则(对吧?)。我将在它自己的类中分离“Recorder”行为并使用“Decorator”模式。一个'AudioWidget'应该有默认的'play'和'stop'方法,它们可以在你的'recorder'实例上工作,你可以随意配置。 – Fuhrmanator