第一篇:设计模式在 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

相关推荐
辰辰观影1 小时前
Windows网盘视频播放器推荐:无广告4K HDR怎么选
音视频
三少爷的鞋2 小时前
Java 线程自上而下,Kotlin 协程自下而上
android
2601_966827453 小时前
电视端云盘在线播放怎么选?支持4K HDR的应用推荐
音视频
好的佩奇3 小时前
Dart 之增强枚举
android·flutter·dart
开开心心就好4 小时前
音频降噪剪辑工具,音量裁剪一键处理
运维·服务器·前端·spring·ocr·音视频·1024程序员节
梦影_4 小时前
MySQL进阶教程(五)—— SQL调优(下)
android·大数据·数据库·后端·sql·mysql·database
好的佩奇6 小时前
蓝牙之无线电与通信距离
android·flutter·蓝牙
vilya6 小时前
我把一套完整的 Python Agent 运行时塞进手机 APK:依赖闭包、Rust 轮子和三个真机坑
android
AI视频工具指南7 小时前
AI视频的声音和画面怎么配合?先分清谁在传递信息
人工智能·aigc·音视频
呆呆敲代码的小Y8 小时前
【实战精选面试题】C# 面试题详细解答,按难易程度排序
android·java·游戏·c#·游戏开发·unity面试题·c#面试题