设计模式之状态模式

1.状态模式概念

允许对象在其内部状态改变时改变它的行为.

2.状态模式组成

1)Context(上下文)

维护一个对当前状态的引用,并定义了一个接口,允许状态对象改变其行为。

2)State(状态)接口

定义了一个接口,封装了与上下文的一个特定状态相关的行为。

3)Concrete State(具体状态)

实现了状态接口,并定义了与上下文的一个特定状态相关的行为。

3.举个栗子:

例如小久的心情,小久的心情(state)会因为外部的环境影响而改变,

小久==>父母今天多给了100元零花钱==>心情高兴==>心情开心,开心的学习

小久==>今天犯错了,父母批评了小久===>心情伤心==>心情伤心,什么事也不想做

4.代码实现

1)Context实现类

java 复制代码
package org.xiji.state;

/**
 * 人相当于context
 */
public class Person {
    /**
     * 心情
     */
    private MoodState moodState;

    public void setMoodState(MoodState moodState)
    {
        this.moodState = moodState;
    }

    /**
     * 根据心情的不同做事情
     */
    public void doThing()
    {
        moodState.doSomething();
    }

}

2)State

java 复制代码
package org.xiji.state;

/**
 * 心情状态
 */
public interface MoodState {

    void doSomething();
}

3)Concrete State

开心

java 复制代码
package org.xiji.state;

public class Happy implements MoodState{


    @Override
    public void doSomething() {
        System.out.println("心情开心,开心的学习");
    }
}

伤心

java 复制代码
package org.xiji.state;

public class Sad implements MoodState{

    @Override
    public void doSomething() {
        System.out.println("心情伤心,什么事也不想做");
    }
}

4)测试类

java 复制代码
package org.xiji.state;

/**
 * 状态模式测试类
 */
public class StateMain {
    public static void main(String[] args) {

        Person xijiu = new Person();
        Happy happy = new Happy();
        Sad sad = new Sad();


        //父母奖励小久100元 ==>小久心情开心
        System.out.println("小久今天被父母奖励100元,小久心情开心");

        xijiu.setMoodState(happy);
        xijiu.doThing();
        //小久犯错误被父母批评了 ,心情伤心
        System.out.println("小久今天被父母批评了,小久心情伤心");
        xijiu.setMoodState(sad);
        xijiu.doThing();

    }
}

5.运行结果

相关推荐
Fireworkitte1 小时前
Apache POI 详解 - Java 操作 Excel/Word/PPT
java·apache·excel
weixin-a153003083161 小时前
【playwright篇】教程(十七)[html元素知识]
java·前端·html
DCTANT2 小时前
【原创】国产化适配-全量迁移MySQL数据到OpenGauss数据库
java·数据库·spring boot·mysql·opengauss
Touper.2 小时前
SpringBoot -- 自动配置原理
java·spring boot·后端
黄雪超2 小时前
JVM——函数式语法糖:如何使用Function、Stream来编写函数式程序?
java·开发语言·jvm
ThetaarSofVenice2 小时前
对象的finalization机制Test
java·开发语言·jvm
GodKeyNet3 小时前
设计模式-模板模式
设计模式·模板模式
望获linux4 小时前
【实时Linux实战系列】CPU 隔离与屏蔽技术
java·linux·运维·服务器·操作系统·开源软件·嵌入式软件
JosieBook4 小时前
【Java编程动手学】使用IDEA创建第一个HelloJava程序
java·开发语言·intellij-idea
Thomas_YXQ4 小时前
Unity3D DOTS场景流式加载技术
java·开发语言·unity