目录
创建适配器类(继承自目标抽象类):UffmpegAdapter、UVLCAdapter
将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,又称包装器(Wrapper)

自定义一个媒体模仿器,接口已经写好,为了使第三方SDK适应自己的接口,此时可以使用适配器
- UINTERFACE(MinimalAPI)
- class UMediaInterface : public UInterface
- {
- GENERATED_BODY()
- };
-
- class DESIGNPATTERNS_API IMediaInterface
- {
- GENERATED_BODY()
- public:
- virtual void PlayVideo(const FString& Filepath) = 0;
- };
- UCLASS() // 适配者类 —— ffmpeg
- class DESIGNPATTERNS_API Uffmpeg : public UObject
- {
- GENERATED_BODY()
-
- public:
- virtual void OpenFile(const FString& Filepath) {
- UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" use ffmpeg sdk to play media"));
- }
- };
-
- UCLASS() // 适配者类 —— VLC
- class DESIGNPATTERNS_API UVLC : public UObject
- {
- GENERATED_BODY()
-
- public:
- virtual void OpenFile(const FString& Filepath) {
- UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" use VLC sdk to play media"));
- }
- };
重载接口函数,调用其他接口来适应新的接口
- UCLASS() // 适配器类 —— UffmpegAdapter
- class DESIGNPATTERNS_API UffmpegAdapter : public UObject, public IMediaInterface
- {
- GENERATED_BODY()
-
- public:
- UPROPERTY()
- Uffmpeg* m_pffmpegSDK;
-
- UffmpegAdapter() {
- m_pffmpegSDK=NewObject
(); - }
- ~UffmpegAdapter() {}
- virtual void PlayVideo(const FString& Filepath) override {
- m_pffmpegSDK->OpenFile(Filepath);
- }
- };
- UCLASS() // 适配器类 —— UVLCAdapter
- class DESIGNPATTERNS_API UVLCAdapter: public UObject, public IMediaInterface
- {
- GENERATED_BODY()
-
- public:
- UPROPERTY()
- UVLC* m_pVLCSDK;
-
- UVLCAdapter() {
- m_pVLCSDK = NewObject
(); - }
- ~UVLCAdapter() {}
-
- virtual void PlayVideo(const FString& Filepath) override {
- m_pVLCSDK->OpenFile(Filepath);
- }
- };
测试
- UCLASS()
- class DESIGNPATTERNS_API AAdapterTestActor : public AActor
- {
- GENERATED_BODY()
- public:
- AAdapterTestActor();
-
- protected:
- // Called when the game starts or when spawned
- virtual void BeginPlay() override {
-
- // 使用 ffmpegAdapter 适配器
- IMediaInterface* MediaPlayer = Cast
(NewObject()); - MediaPlayer->PlayVideo(TEXT("C:/浪客剑心.最终章.人诛篇.mp4"));
-
- // 使用 VLCAdapter 适配器
- MediaPlayer = Cast
(NewObject()); - MediaPlayer->PlayVideo(TEXT("C:/浪客剑心.最终章.人诛篇.mp4"));
- }
- };
LogTemp: Warning: Uffmpeg::OpenFile use ffmpeg sdk to play media
LogTemp: Warning: UVLC::OpenFile use VLC sdk to play media
1. 适配器模式 — Graphic Design Patterns (design-patterns.readthedocs.io)