本文主要参考自《大话设计模式》——第16章
/**
* @author ssk
* @date 2021/1/21 17:08
* @desc 状态机底层接口
*/
public interface State<EntityType> {
class StateName {
/**
* 草稿
*/
public static final String DRAFT = "draft";
/**
* 审批中
*/
public static final String ACTIVATING = "activating";
/**
* 激活
*/
public static final String ACTIVE = "active";
}
String stateName();
void edit(EntityType entity);
void active(EntityType entity);
void approve(EntityType entity);
void reject(EntityType entity);
}
/**
* @author ssk
* @date 2021/1/21 17:09
* @desc 状态机抽象类
*/
public abstract class AbstractState<EntityType> implements State<EntityType>{
@Override
public void edit(EntityType entity) {
this.unsupportedOperation();
}
@Override
public void active(EntityType entity) {
this.unsupportedOperation();
}
@Override
public void approve(EntityType entity) {
this.unsupportedOperation();
}
@Override
public void reject(EntityType entity) {
this.unsupportedOperation();
}
protected void unsupportedOperation(){
throw new RuntimeException("不支持的操作");
}
}
/**
* 新闻实体状态机
**/
public abstract class DocumentState extends AbstractState<DocumentPO> {
public static HashMap<String, DocumentState> stateHashMap = new HashMap<>();
static {
stateHashMap.put(StateName.DRAFT, new ContentInstanceDraftState());
stateHashMap.put(StateName.ACTIVATING, new ContentInstanceActiveState());
stateHashMap.put(StateName.ACTIVE, new ContentInstanceDeprecatedState());
}
public static DocumentState getInstanceByName(String stateName) {
DocumentState documentState = stateHashMap.get(stateName);
if(document==null){
throw new RuntimeException("对应状态不存在");
}
return documentState;
}
}
package state;
/**
* @author ssk
* @date 2021/1/21 17:16
* @desc 状态机-草稿态
*/
public class DocumentDraftState extends DocumentState{
@Override
public String stateName() {
return StateName.DRAFT;
}
@Override
public void edit(Document entity) {
// 编辑
}
@Override
public void active(Document entity) {
// 激活
}
}
package state;
/**
* @author ssk
* @date 2021/1/21 17:16
* @desc 状态机-激活中态
*/
public class DocumentActivatingState extends DocumentState {
@Override
public String stateName() {
return StateName.ACTIVATING;
}
@Override
public void approve(Document entity) {
// 审批通过
}
@Override
public void reject(Document entity) {
// 审批拒绝
}
}
package state;
/**
* @author ssk
* @date 2021/1/21 17:16
* @desc 状态机-激活态
*/
public class DocumentActivateState extends DocumentState{
@Override
public String stateName() {
return StateName.ACTIVE;
}
}
原文:https://www.cnblogs.com/riders/p/14309344.html