如果一个执行流程是固定的,但是具体调用的部分方法可变,即适用模板方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Muxter {
public:
void DoMux() {
CreateHandle();

uint8_t video_src[100];
int video_src_len = 100;
uint8_t video_dst[100];
int video_src_dst = 100;

uint8_t audio_src[100];
int audio_src_len = 100;
uint8_t audio_dst[100];
int audio_src_dst = 100;

EncVideo(video_src, video_src_len, video_dst, video_src_dst);
EncAudio(audio_src, audio_src_len, audio_dst, audio_src_dst);

mux(m_handle, video_dst, video_src_dst, audio_dst, audio_src_dst);

DestroyHandle();
}
protected:
virtual void EncVideo(uint8_t* src, int src_len, uint8_t* dst, int& dst_len) = 0;
virtual void EncAudio(uint8_t* src, int src_len, uint8_t* dst, int& dst_len) = 0;
private:
void CreateHandle() {
// 创建一个 m_handle 操作
}

void DestroyHandle() {
// 销毁 m_handle
}

void mux(int handle, uint8_t* video_dst, int video_src_dst, uint8_t* audio_dst, int audio_src_dst) {
// 封装操作
}
int m_handle;
};

这个例子中我们可以看到,DoMux方法整个流程是稳定的,但是EncVideo,EncAudio是virtual的,可以做不同的实现,所以我们可以把它当作基类,用一个子类去继承它,然后重写两个方法,最后只需调用DoMux就能实现我们自己编码函数的封装

站在基类的角度来说,你不要调用我,让我来调用你