首页 > 其他分享 >20230426 16. 状态模式 - 工作状态

20230426 16. 状态模式 - 工作状态

时间:2023-06-19 09:57:44浏览次数:28  
标签:状态 20230426 emergencyProjects Work writeProgram 16 State public

介绍

状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化

状态模式

  • State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为
  • ConcreteState类,具体状态,每一个子类实现一个与Context的一个状态相关的行为
  • Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态

状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来

将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换

这样做的目的就是为了消除庞大的条件分支语句,状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖

当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了

代码示例

State

public abstract class State {
    public abstract void writeProgram(Work w);
}

State实现类

/**
 * 上午工作状态
 *
 * @author owenwjhuang
 * @date 2023/4/26
 */
public class ForenoonState extends State {
    @Override
    public void writeProgram(Work w) {
        if (w.getHour() < 12) {
            System.out.println("当前时间:" + w.getHour() + "点 上午工作,精神百倍");
        } else {
            w.setCurrentState(new NoonState());
            w.writeProgram();
        }
    }
}

public class EveningState extends State {
    @Override
    public void writeProgram(Work w) {
        if (w.isWorkFinished()) {
            w.setCurrentState(new RestState());
            w.writeProgram();
        } else {
            if (w.getHour() < 21) {
                System.out.println("当前时间:" + w.getHour() + "点 加班哦,疲累之极");
            } else {
                w.setCurrentState(new SleepingState());
                w.writeProgram();
            }
        }
    }
}

public class RestState extends State{
    @Override
    public void writeProgram(Work w) {
        System.out.println("当前时间:"+ w.getHour() +"点 下班回家了");
    }
}

Context类

@Data
public class Work {


    private int hour;

    private boolean workFinished = false;

    private State currentState;

    public Work() {
        this.currentState = new ForenoonState();
    }

    public void writeProgram() {
        this.currentState.writeProgram(this);
    }
}

客户端

public class Test {
    public static void main(String[] args) {
        // 紧急工作
        Work emergencyProjects = new Work();
        // emergencyProjects.setHour(9);
        // emergencyProjects.writeProgram();
        // emergencyProjects.setHour(10);
        // emergencyProjects.writeProgram();
        // emergencyProjects.setHour(12);
        // emergencyProjects.writeProgram();
        // emergencyProjects.setHour(13);
        // emergencyProjects.writeProgram();
        // emergencyProjects.setHour(14);
        // emergencyProjects.writeProgram();
        emergencyProjects.setHour(17);
        emergencyProjects.writeProgram();

        // emergencyProjects.setWorkFinished(false);
        emergencyProjects.setWorkFinished(true);

        emergencyProjects.writeProgram();
        emergencyProjects.setHour(19);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(22);
        emergencyProjects.writeProgram();
    }
}

标签:状态,20230426,emergencyProjects,Work,writeProgram,16,State,public
From: https://www.cnblogs.com/huangwenjie/p/17490363.html

相关文章

  • 20230426 19. 组合模式 - 分公司
    介绍组合模式(Composite),将对象组合成树形结构以表示'部分-整体'的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。Component为组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为Leaf在组合中表示叶节点对象,叶节点没有子节点Composite定义......
  • 20230426 20. 迭代器模式
    介绍迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。为遍历不同的聚集结构提供......
  • CF1778C - Flexible String 二进制枚举、状态压缩
    参考splay佬的题解写个记录https://zhuanlan.zhihu.com/p/602721281题意:给定两个字符串a,b,可以选择α里面的字符进行替换,但是替换的字符种类最多为k个。其中字符串α字符出现的种类不超过10种。求将替换后,两个字符的相同部分的数量。(相同部分指的是,指定一个区间[l,r],对应区间相......
  • UVA12716 GCD等于XOR GCD XOR
    UVA12716GCD等于XORGCDXOR一道数学题。 首先,我们可以知道,a-b>=gcd(a,b)=c;其次,a-b<=axorb=c;综上,可得a-b=c,即a-b=axorb.由于范围不大,直接枚举。第一层枚举c(因为c较少),第二层枚举a,(b=a-c) 再判断c是否等于a^b即可。#include<bits/stdc++.h>usingnamespacestd;......
  • 状态压缩-6893. 特别的排列
    6893.特别的排列DescriptionDifficulty:中等RelatedTopics:给你一个下标从0 开始的整数数组 nums ,它包含n 个互不相同 的正整数。如果 nums 的一个排列满足以下条件,我们称它是一个特别的排列:对于 0<=i<n-1 的下标i ,要么 nums[i]%nums[i+1]==0 ......
  • linux 安装node16
    1、在Linux系统安装Nodejshttps://nodejs.org/download/release/v16.20.0/node-v16.20.0-linux-x64.tar.gzhttps://nodejs.org/download/release/v16.20.0/https://nodejs.org/download/release/2、yum-yinstallgccmakegcc-c++openssl-develwgetcd/root/k/tools/n......
  • 重拾线程池状态5种状态
    线程池状态分类线程的状态具有运行与关闭的状态,那么线程池也不例外。java线程池具有五种状态。RUNNINGSHUTDOWNSTOP TIDYINGTERMINATED见源码 ThreadPoolExecutor类种的属性//runStateisstoredinthehigh-orderbitsprivatestaticfinalintRUNNIN......
  • 人工智能加速走进103.36.167百姓生活
    按照大脑指令可做出灵活动作的智能仿生手,帮助肢体缺失患者重建手部运动功能;会学习的农田打药机器人能在雨雪、低能见度等恶劣条件下自动驾驶作业;宠物型机器人可以陪伴老人和小孩,有温度地进行情感交流……正在浙江杭州举办的2023全球人工智能技术大会上103.36.167.1,形形色色的人......
  • odoo16里面修改tree视图样式
    一、在static文件夹下新建一个css文件夹并将*.css文件写入/*该文件用来定义视图中的一些格式,需要用到的地方直接在xml文件中进行引用*//*语法说明*//*tableth:nth-child(1)代表定位到table的th上面到第一个th标题nth-child()参考css语法http://www.w3school.com.cn/c......
  • Luogu3168 [CQOI2015] 任务查询系统 - 主席树 - 二分 -
    题目链接:https://www.luogu.com.cn/problem/P3168题解:主席树可以解决一类j静态区间第\(k\)小的问题,我们先来看看这是怎么工作的主席树的本质就是有很多棵线段树,然后发现这些线段树绝大多数都是重叠的,因此可以优化到空间复杂度\(O(n\logn)\)在这里,我们将序列的每一个位置......