设计模式之状态模式

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

相关推荐
fouryears_2341711 分钟前
深入拆解Spring核心思想之一:IoC
java·后端·spring
codervibe21 分钟前
使用 Spring Boot + JWT 实现多角色登录认证(附完整流程图)
java·后端
坚持学习永不言弃22 分钟前
Ehcache、Caffeine、Memcached和Redis缓存
java
小飞悟30 分钟前
组件通信的艺术:从 props 钻井到 context 共享的进化之路
前端·javascript·设计模式
阿劲33 分钟前
从业务卡顿到数据库连接池耗尽:Spring Boot项目HikariCP超时问题实战排查
java·后端·面试
Point35 分钟前
[ahooks] useEventEmitter源码阅读
前端·javascript·设计模式
亮1111 小时前
Maven 编译过程中发生了 Java Heap Space 内存溢出(OutOfMemoryError)
java·开发语言·maven
添乱1 小时前
「Java案例」求PI的值
java
Zhu_S W1 小时前
深入理解Java虚拟机:Java内存区域与内存溢出异常
java·开发语言·jvm
快乐非自愿1 小时前
商品中心—库存分桶高并发的优化文档
java·前端·spring