实际项目中的java设计模式 -- 状态模式
2021-12-03 本文已影响0人
zhongjh
AlbumCameraRecorder项目随着功能的添加,代码变得笨重了起来,由于核心代码里面有多个状态的互相转变,不同场景又有不同状态的处理,导致后期扩展维护很难,便使用了这个状态模式优化。
直接进入主题优缺点
优点:
- 将与状态相关的行为局部化,并且将不同状态分割开来,消除了庞大的条件分支语句,通过各种状态把逻辑分布到state。方便后期维护代码。
- 新增新的状态非常容易,易于扩展。
缺点:
- 必然性的会增加系统中类和对象的个数,因为多个状态之间可以互相切换,使用不当会导致系统的复杂性增加,可读性差,这些都需要良好的代码功力设计全面。
在具体讲解状态模式之间,先了解AlbumCameraRecorder项目的一个简单逻辑,该项目有个拍摄类CameraLayout
,它需要根据当前不同状态比如拍摄照片、拍摄录像等等做相对应的处理。那么我们开始吧!
通过AlbumCameraRecorder项目让我们看看由哪些类组成这个状态模式
通过思维导图,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();
}
}
那么该模式的核心代码都在这里了,改完后的代码作者不管维护还是添加代码都十分舒适,这就是优雅代码带来的好处了吧!
也欢迎小伙伴指出更好的改进,喜欢点个收藏谢谢支持!