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

相关推荐
一笑的小酒馆2 小时前
Android中的tcp通信
android
默阳12345 小时前
2026年Android中高级面试题专栏(Android进阶篇)
android
古法安卓5 小时前
Android-日志系统源码解析
android·java·android studio
恋猫de小郭6 小时前
Android 17 + OkHttp 5.5.0 ,全新 ECH 下你的 HTTPS 域名可以请求时被安全隐藏
android·前端·flutter
小强闯江湖6 小时前
不只是让 AI 写代码:ViewCompose 把 Android UI 做成了可编译、可渲染的闭环
android·人工智能·kotlin
hunterandroid8 小时前
StateFlow 与 SharedFlow 的边界:状态与事件的正确建模
android·前端
YF02118 小时前
Android遥控器对频详解
android·android things
码农coding9 小时前
android12 WindowManagerService窗口的布局过程
android·源码
学习星球9 小时前
AI Agent 成本工程实战:从 OpenAI Codex 的 8 个“烧 Token“Bug 学起
人工智能·设计模式·微信小程序
杉氧11 小时前
状态管理变迁史:为什么我们放弃了 Redux 选择 Zustand?
android·前端·react native