白话-23种设计模式17-状态模式

举报
object 发表于 2022/07/09 17:49:14 2022/07/09
【摘要】 一、白话  每个人都有生气,开心和郁闷等状态,在这些状态下即使做同一件事也会有一不同的结果。即状态模式的一种应用二、定义  类的行为是基于它的状态改变的。  抽象状态角色:提供一个方法封装上下文对象的状态。  具体状态角色:继承抽象状态类,实现状态下的行为。  上下文角色:负责对具体状态进行切换三、示例// 状态行为public interface MoodState { void w...

一、白话

  每个人都有生气,开心和郁闷等状态,在这些状态下即使做同一件事也会有一不同的结果。即状态模式的一种应用

二、定义

  类的行为是基于它的状态改变的。

  抽象状态角色:提供一个方法封装上下文对象的状态。

  具体状态角色:继承抽象状态类,实现状态下的行为。

  上下文角色:负责对具体状态进行切换

三、示例

// 状态行为
public interface MoodState {
    void work();
    void changeState();
}
public class Angry implements MoodState {
    Person person;

    public Angry(Person person) {
        this.person = person;
    }

    @Override
    public void work() {
        System.out.println("我很生气的工作着");
    }

    @Override
    public void changeState() {
        System.out.println("工作很充实,我很开心");
        person.setState(new Happy(person));
    }
}
public class Happy implements MoodState {
    Person person;

    public Happy(Person person) {
        this.person = person;
    }

    @Override
    public void work() {
        System.out.println("我很开心的工作着");
    }

    @Override
    public void changeState() {
        System.out.println("工作很累,我很生气");
        person.setState(new Angry(person));
    }
}
// 状态管理
public class Person {
    // 当前状态
    private MoodState state;

    public MoodState getState() {
        return state;
    }

    public void setState(MoodState state) {
        this.state = state;
    }

    // 工作
    public void work() {
        state.work();
        state.changeState();
    }
}

输出示例:

我很开心的工作着
工作很累,我很生气
我很生气的工作着
工作很充实,我很开心
我很开心的工作着
工作很累,我很生气
我很生气的工作着
工作很充实,我很开心
我很开心的工作着
工作很累,我很生气
我很生气的工作着
工作很充实,我很开心

四、总结

  特点:消除if else巨大条件语句块。封装状态行为。新增状态容易。结构复杂。开闭不支持。状态类过多。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。