2017-08-21 75 views
0

当比方说,我们有下面的类(简体)分享:代码中使用组成

class AudioRecorder { 
    private func onRecord(data: [Float]) { 
     self.delegate?.audioRecorder(self, didRecordFrame: audioData) 

    public func record() { ... } 
    public func stop() { ... } 
} 

所以它记录框架,并通知一下它的委托。 现在我需要它具有以下功能扩展:

  1. 缓冲 - 帧缓冲X号
  2. 间隔记录 - 记录 - 停止1秒 - 记录 - 停止秒...
  3. 间隔缓冲 - 记录在间隔和缓冲

因为如果IntervalRecorderBufferingRecorder是子类,然后我有实现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() 
    } 
} 

我需要复制所有的IntervalRecorderBufferingRecorderIntervalBufferingRecorder播放暂停的方法,只是期待底层对象。

对这个问题有什么好的方法?语言很快,但我想这不是很重要。

+0

有一个着名的WWDC视频关于面向协议的编程,这里是另一个教程https://www.raywenderlich.com/148448/introducing-protocol-oriented-programming。通过它,你会明白这个主意。 – adev

+0

你的问题对我来说有点含糊,如果你可以尝试解释更多关于你的类和子类的话可能会更好。如果您想避免继承,请尝试使用默认实现的协议。 – KeranMarinov

+0

'play'和'stop'不是记录函数,这违反了接口分离的原则(对吧?)。我将在它自己的类中分离“Recorder”行为并使用“Decorator”模式。一个'AudioWidget'应该有默认的'play'和'stop'方法,它们可以在你的'recorder'实例上工作,你可以随意配置。 – Fuhrmanator

回答

1

这可能会让您了解如何在默认实现中使用协议。

protocol Bufferable { 
    func buffer(data: [Float]) 
} 

extension Bufferable { 
    func buffer(data: [Float]) { 
     print("buffering") 
    } 
} 

protocol Recordable { 
    func record(data: [Float]) 
} 

extension Recordable { 
    func record(data: [Float]) { 
     print("recording") 
    } 
} 

class AudioPlayer: Bufferable, Recordable { 

    func start() { 
     buffer(data: [2.0, 1.0, 1.0]) 
     record(data: [2.0, 1.0, 1.0]) 
    } 

} 

class VideoPlayer: Bufferable, Recordable { 

    func start() { 
     buffer(data: [2.0, 1.0, 1.0]) 
     record(data: [2.0, 1.0, 1.0]) 
    } 

} 
+0

感谢您的回答,但我认为这不能回答我的问题。我不希望污染AudioRecorder与其他任何东西然后录音。 – josip04