AndroidAndroid开发经验谈Android开发

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

2021-12-03  本文已影响0人  zhongjh

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();
    }

}

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

上一篇下一篇

猜你喜欢

热点阅读