美文网首页AndroidAndroid开发经验谈Android开发
实际项目中的java设计模式 -- 状态模式

实际项目中的java设计模式 -- 状态模式

作者: zhongjh | 来源:发表于2021-12-03 18:07 被阅读0次

AlbumCameraRecorder项目随着功能的添加,代码变得笨重了起来,由于核心代码里面有多个状态的互相转变,不同场景又有不同状态的处理,导致后期扩展维护很难,便使用了这个状态模式优化。

直接进入主题优缺点

优点:
  1. 将与状态相关的行为局部化,并且将不同状态分割开来,消除了庞大的条件分支语句,通过各种状态把逻辑分布到state。方便后期维护代码。
  2. 新增新的状态非常容易,易于扩展。
缺点:
  1. 必然性的会增加系统中类和对象的个数,因为多个状态之间可以互相切换,使用不当会导致系统的复杂性增加,可读性差,这些都需要良好的代码功力设计全面。

在具体讲解状态模式之间,先了解AlbumCameraRecorder项目的一个简单逻辑,该项目有个拍摄类CameraLayout,它需要根据当前不同状态比如拍摄照片、拍摄录像等等做相对应的处理。那么我们开始吧!

通过AlbumCameraRecorder项目让我们看看由哪些类组成这个状态模式

CameraLayout是个对象,它分发了各种状态由state包下面的各类处理

通过思维导图,state包下面的类他们之间的关系如图:


image.png

因为源码代码过多,所以这边抽取核心部分让大家更快了解:

StateInterface 状态接口

public interface StateInterface {

    /**
     * 提交核心事件
     */
    void pvLayoutCommit();

    /**
     * 取消核心事件
     */
    void pvLayoutCancel();

}

StateMode 状态抽象父类

public abstract class StateMode implements StateInterface {

    /**
      * 用于子类使用,cameraLayout是处理逻辑,cameraStateManagement是处理状态转换
      */
    CameraStateManagement cameraStateManagement;
    CameraLayout cameraLayout;

}

多个状态子类,抽出两个Preview和VideoIn

public class Preview extends StateMode {

    @Override
    public void pvLayoutCommit() {
        // 处理逻辑
        cameraLayout.xxxx();
        // 转变视频录制中的状态
        cameraStateManagement.setState(cameraStateManagement.getVideoIn());
    }

    @Override
    public void pvLayoutCancel() {
        // 处理逻辑
        cameraLayout.xxxx();   
    }
  
}
public class VideoIn extends StateMode {

    @Override
    public void pvLayoutCommit() {
        // 处理逻辑
        cameraLayout.xxxx();
        // 转变视频录制中的状态
        cameraStateManagement.setState(cameraStateManagement.getPreview());
    }

    @Override
    public void pvLayoutCancel() {
        // 处理逻辑
        cameraLayout.xxxx();   
    }
  
}

CameraLayout拍摄类,优化代码的对象

public class CameraLayout {
    /**
     * 状态管理
     */
    public final CameraStateManagement mCameraStateManagement;

    public void commit() {
        // 处理当前状态的相对应逻辑
        mCameraStateManagement.pvLayoutCommit();
    }

    public void cancel() {
        // 处理当前状态的相对应逻辑
        mCameraStateManagement.pvLayoutCancel();   
    }

}

CameraStateManagement状态管理

public class CameraStateManagement implements StateInterface {

    CameraLayout mCameraLayout;
    /**
     * 当前状态
     */
    StateInterface state;
    /**
     * 预览状态
     */
    StateInterface preview;
    /**
     * 正在录制视频中的状态
     */
    StateInterface videoIn;

    public CameraStateManagement(CameraLayout cameraLayout) {
        mCameraLayout = cameraLayout;
        // 初始化相关状态逻辑
        preview = new Preview(cameraLayout, this);
        videoIn = new VideoIn(cameraLayout, this);
        // 设置当前默认状态
        state = preview;
    }

    /**
     * @return 当前状态
     */
    public StateInterface getState() {
        return state;
    }

    /**
     * 赋值当前状态
     */
    public void setState(StateInterface state) {
        this.state = state;
    }

    @Override
    public void pvLayoutCommit() {
        state.pvLayoutCommit();
    }

    @Override
    public void pvLayoutCancel() {
        state.pvLayoutCancel();
    }

}

那么该模式的核心代码都在这里了,改完后的代码作者不管维护还是添加代码都十分舒适,这就是优雅代码带来的好处了吧!
也欢迎小伙伴指出更好的改进,喜欢点个收藏谢谢支持!

相关文章

  • 实际项目中的java设计模式 -- 状态模式

    AlbumCameraRecorder[https://github.com/zhongjhATC/AlbumCa...

  • 传输对象模式

    这个设计模式我是没想到在实际项目中怎么应用,在网上找的资料也只是对这个设计模式进行描述,如果你知道传输对象模式在项...

  • 状态模式(State)-七十二变

    设计模式文章陆续更新 java单例模式java代理模式java工厂模式 状态模式(State)-老孙七十二变 俺老...

  • 连工厂模式都不知道,别说你会设计模式

    设计模式文章陆续更新 java单例模式java代理模式java状态模式 在Java面向对象编程中,我们通常会new...

  • Java设计模式——状态模式

    Java设计模式之状态模式 这期分享一个行为模式中的状态模式,状态模式是行为模式中的最后几个模式了。希望多多关注交...

  • 设计模式

    如何使用常用设计模式及示例(swift) 有哪些在实际 Android 项目中用到的设计模式? Android 设...

  • 设计模式

    Java 设计模式情景分析 ——单例模式 Java 设计模式情景分析——建造者模式 Java 设计模式情景分析——...

  • java/android 设计模式学习笔记(19)---状态模式

    java/android 设计模式学习笔记(19)---状态模式 【备注】只用于个人收藏

  • Java设计模式--状态模式

    和策略模式很类似,只不过策略模式是通过替换的方式改变类的功能,状态模式则是通过改变类的状态修改类的功能。简单实现 ...

  • Java 设计模式(状态模式)

    之前分享了两个 Java 设计模式,今天给大家带来的系列完整的 java 设计模式。为了帮助大家更好理解设计模式,...

网友评论

    本文标题:实际项目中的java设计模式 -- 状态模式

    本文链接:https://www.haomeiwen.com/subject/nqqmxrtx.html