设计模式入门:状态模式

个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片
文章中部分定义和解释性文字,都是引用百度百科,主要的代码及场景应用为本人原创

状态模式允许一个对象的内在状态改变时改变其行为,这个对象看起来像是改变了其类。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

场景:我的个人网站中的文章管理的一个需求,文章的状态有:待发布、正常、封禁、置顶、删除。这五个状态之间可以装换,但是有一定限制:

  • 待发布的文章,可以发布(正常状态),可以删除(删除状态)
  • 正常的文章,可以封禁(封禁状态),可以置顶(置顶状态),可以删除(删除状态)
  • 封禁的文章,可以解封(正常状态),可以删除(删除状态)
  • 置顶的文章,可以取消置顶(正常状态),可以封禁(封禁状态),可以删除(删除状态)
  • 删除的文章,什么都不可做

设计

这里写图片描述

实现

代码地址: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);
    }
}

适用场景

  • 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
  • 一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值