美文网首页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设计模式 -- 状态模式

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