第一篇:设计模式在 Android 视频播放器中的实战应用

一、为什么需要设计模式?

在软件开发中,设计模式是经过验证的解决方案,能够帮助我们写出可维护、可扩展、可测试的代码。在 Android 视频播放器开发中,合理运用设计模式尤为重要:

  • 解码器可能更换:MediaCodec、FFmpeg、ExoPlayer
  • 帧处理方式多样:YUV转换、滤镜处理、缩放裁剪
  • 状态管理复杂:播放、暂停、停止、错误处理

二、工厂模式

场景:创建不同类型的解码器

java 复制代码
public class DecoderFactory {
    public enum DecoderType {
        MEDIA_CODEC,
        FFMPEG,
        EXO_PLAYER
    }

    private final Context context;

    public DecoderFactory(Context context) {
        this.context = context.getApplicationContext();
    }

    public VideoDecoder createDecoder(DecoderType type, int maxImages) {
        switch (type) {
            case MEDIA_CODEC:
                return new MediaCodecDecoder(context, maxImages);
            case FFMPEG:
                return new FFmpegDecoder(context, maxImages);
            default:
                throw new IllegalArgumentException("Unknown decoder type: " + type);
        }
    }
}

优势

  • 解耦创建逻辑与使用逻辑
  • 新增解码器只需扩展枚举和 switch 分支
  • 符合开闭原则

三、策略模式

场景:不同的帧处理策略

java 复制代码
public interface FrameProcessor {
    VideoFrame process(Image image);
    void release();
}

public class YuvFrameProcessor implements FrameProcessor {
    @Override
    public VideoFrame process(Image image) {
        // YUV -> ABGR -> Bitmap
    }
}

public class FilterFrameProcessor implements FrameProcessor {
    @Override
    public VideoFrame process(Image image) {
        // 带滤镜处理
    }
}

优势

  • 处理算法可随时替换
  • 运行时动态切换处理策略
  • 每个策略独立测试

四、建造者模式

场景:构建复杂的视频源配置

java 复制代码
VideoSource source = new VideoSource.Builder()
    .setFileName("video.mp4")
    .setWidth(1920)
    .setHeight(1080)
    .setType(VideoSource.SourceType.ASSET)
    .build();

优势

  • 参数可选、有序
  • 链式调用,代码可读性强
  • 构建逻辑封装在 Builder 内部

五、观察者模式

场景:播放状态变化通知 UI 更新

java 复制代码
public class VideoPlayerViewModel extends ViewModel {
    private final MutableLiveData<PlayerState> playerState = new MutableLiveData<>();
    
    public LiveData<PlayerState> getPlayerState() {
        return playerState;
    }
}

// Activity 中观察
viewModel.getPlayerState().observe(this, state -> {
    updateButtonState(state);
});

优势

  • UI 与业务逻辑完全解耦
  • LiveData 自动管理生命周期
  • 数据驱动 UI 更新

六、总结

设计模式 应用场景 核心价值
工厂模式 解码器创建 解耦创建与使用
策略模式 帧处理算法 算法可替换
建造者模式 配置对象构建 参数灵活、可读性强
观察者模式 状态通知 数据驱动 UI

完整代码: https://gitee.com/XiaoBoLiLun/video-decoding

相关推荐
alexhilton7 小时前
藏在设备上的秘密,终究藏不住
android·kotlin·android jetpack
linux_cfan11 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
赛博仓鼠12 小时前
秋叶ComfyUI 3.2整合包实测:Python 3.13+Torch 2.13全栈升级,一键跑通MiniMax H3(附完整部署)
ai·ai作画·aigc·音视频
hai_android13 小时前
Kotlin / Android 常用函数使用示例手册
android·java·kotlin
乐橙开放平台14 小时前
从「多套客户端」到一套开放能力:乐橙视频监控能力复盘
笔记·物联网·自动化·音视频·智能家居
hai_android15 小时前
Android MeasureSpec 详解
android·java·kotlin
又见情义16 小时前
RK3568 Android 13 本地 U 盘 OTA 升级实战:基于 RKUpdateService 的完整流程
android
Godikov17 小时前
Android10后台弹窗与APK自动更新
android
怕浪猫18 小时前
一行命令复刻爆款视频,我把 Hypit 从安装跑到了出片
人工智能·设计模式·程序员
又见情义18 小时前
RK3568 Android 13 USB OTG/Host 切换调试经验分享
android