原文地址:http://te-amo.site/user/article/info/ARTICLE20180420073600309
文章中部分定义和解释性文字,都是引用百度百科,主要的代码及场景应用为本人原创
状态模式允许一个对象的内在状态改变时改变其行为,这个对象看起来像是改变了其类。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
场景:我的个人网站中的文章管理的一个需求,文章的状态有:待发布、正常、封禁、置顶、删除。这五个状态之间可以装换,但是有一定限制:
- 待发布的文章,可以发布(正常状态),可以删除(删除状态)
- 正常的文章,可以封禁(封禁状态),可以置顶(置顶状态),可以删除(删除状态)
- 封禁的文章,可以解封(正常状态),可以删除(删除状态)
- 置顶的文章,可以取消置顶(正常状态),可以封禁(封禁状态),可以删除(删除状态)
- 删除的文章,什么都不可做
设计
实现
代码地址:https://github.com/telundusiji/designpattern
状态接口
public interface ArticleState {
void publish(Article article);
void ban(Article article);
void pick(Article article);
void sticky(Article article);
void off(Article article);
void delete(Article article);
}
封禁状态
@Slf4j
public class BanState implements ArticleState {
@Override
public void publish(Article article) {
}
@Override
public void ban(Article article) {
}
@Override
public void pick(Article article) {
log.info("文章:{}----解封成功!",article.getTitle());
article.setCurrentState(Article.normalState);
}
@Override
public void sticky(Article article) {
}
@Override
public void off(Article article) {
}
@Override
public void delete(Article article) {
log.info("文章:{}----删除成功!",article.getTitle());
article.setCurrentState(Article.deleteState);
}
}
删除状态
public class DeleteState implements ArticleState {
@Override
public void publish(Article article) {
}
@Override
public void ban(Article article) {
}
@Override
public void pick(Article article) {
}
@Override
public void sticky(Article article) {
}
@Override
public void off(Article article) {
}
@Override
public void delete(Article article) {
}
}
正常状态
@Slf4j
public class NormalState implements ArticleState {
@Override
public void publish(Article article) {
}
@Override
public void ban(Article article) {
log.info("文章:{}----封禁成功!",article.getTitle());
article.setCurrentState(Article.banState);
}
@Override
public void pick(Article article) {
}
@Override
public void sticky(Article article) {
log.info("文章:{}----置顶成功!",article.getTitle());
article.setCurrentState(Article.stickyState);
}
@Override
public void off(Article article) {
}
@Override
public void delete(Article article) {
log.info("文章:{}----删除成功!",article.getTitle());
article.setCurrentState(Article.deleteState);
}
}
待发布状态
@Slf4j
public class ReadyState implements ArticleState {
@Override
public void publish(Article article) {
log.info("文章:{}----发布成功!",article.getTitle());
article.setCurrentState(Article.normalState);
}
@Override
public void ban(Article article) {
}
@Override
public void pick(Article article) {
}
@Override
public void sticky(Article article) {
}
@Override
public void off(Article article) {
}
@Override
public void delete(Article article) {
log.info("文章:{}----删除成功!",article.getTitle());
article.setCurrentState(Article.deleteState);
}
}
置顶状态
@Slf4j
public class StickyState implements ArticleState {
@Override
public void publish(Article article) {
}
@Override
public void ban(Article article) {
log.info("文章:{}----封禁成功!",article.getTitle());
article.setCurrentState(Article.banState);
}
@Override
public void pick(Article article) {
}
@Override
public void sticky(Article article) {
}
@Override
public void off(Article article) {
log.info("文章:{}----取消置顶成功!",article.getTitle());
article.setCurrentState(Article.normalState);
}
@Override
public void delete(Article article) {
log.info("文章:{}----删除成功!",article.getTitle());
article.setCurrentState(Article.deleteState);
}
}
文章容器
@Data
public class Article{
private String title;
public final static BanState banState = new BanState();
public final static NormalState normalState = new NormalState();
public final static ReadyState readyState = new ReadyState();
public final static StickyState stickyState = new StickyState();
public final static DeleteState deleteState = new DeleteState();
private ArticleState currentState;
public void setState(ArticleState articleState){
currentState = articleState;
}
public void publish() {
currentState.publish(this);
}
public void ban() {
currentState.ban(this);
}
public void pick() {
currentState.pick(this);
}
public void sticky() {
currentState.sticky(this);
}
public void off() {
currentState.off(this);
}
public void delete() {
currentState.delete(this);
}
}
适用场景
- 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
- 一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。