设计模式之状态模式

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.运行结果

相关推荐
寻星探路5 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
曹牧7 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法8 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7258 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎8 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄8 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿9 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds9 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹9 小时前
【Java基础】多态 | 打卡day2
java·开发语言
Re.不晚9 小时前
JAVA进阶之路——无奖问答挑战2
java·开发语言