设计模式之状态模式

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

相关推荐
Lxinccode1 小时前
Java查询数据库表信息导出Word-获取数据库实现[1]:KingbaseES
java·数据库·word·获取数据库信息·获取kingbasees信息
元亓亓亓2 小时前
Java后端开发day36--源码解析:HashMap
java·开发语言·数据结构
sd21315122 小时前
RabbitMQ 复习总结
java·rabbitmq
码银4 小时前
Java 集合:泛型、Set 集合及其实现类详解
java·开发语言
东阳马生架构4 小时前
Nacos简介—4.Nacos架构和原理
java
yuren_xia5 小时前
IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤
spring·mvc·intellij-idea
一只叫煤球的猫5 小时前
你真的会用 return 吗?—— 11个值得借鉴的 return 写法
java·后端·代码规范
东阳马生架构5 小时前
Sentinel源码—8.限流算法和设计模式总结二
算法·设计模式·sentinel
颇有几分姿色5 小时前
Spring Boot 读取配置文件的几种方式
java·spring boot·后端
爱编程的鱼6 小时前
C# 枚举(Enum)声明与使用详解
java·windows·c#