使用撰写

时间:2017-08-21 18:36:33

标签: swift oop inheritance design-patterns composition

假设我们有以下课程(简化):

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

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

所以它记录框架并通知它的代表。 现在我需要使用以下功能扩展它:

  1. 缓冲 - 缓冲X帧数
  2. 间隔录制 - 录制 - 停止1s - 录制 - 停止1s ......
  3. 间隔缓冲 - 以间隔和缓冲区记录
  4. 我无法使用继承,因为如果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中复制播放暂停方法,然后转发到底层对象。

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

1 个答案:

答案 0 :(得分: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])
    }

}