如果一个执行流程是固定的,但是具体调用的部分方法可变,即适用模板方法
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() { }
void DestroyHandle() { }
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就能实现我们自己编码函数的封装
站在基类的角度来说,你不要调用我,让我来调用你