设计模式再探——状态模式

目录

  • 一、背景介绍
  • 二、思路&方案
  • 三、过程
    • 1.状态模式简介
    • 2.状态模式的类图
    • 3.状态模式代码
    • 4.状态模式还可以优化的地方
    • 5.状态模式的项目实战,优化后
  • 四、总结
  • 五、升华

一、背景介绍

最近产品中有这样的业务需求,不同时间(这里不是活动的执行时间,而是活动的执行时刻)展示不同的活动;
要求还是需要后续会由N种活动扩充进来,并且扩充的时候还得达到复用之前活动中的一些属性和方法。

结合这样的需求,再探状态模式,豁然开朗,于是乎总结分享。

二、思路&方案

  • 1.状态模式简介
  • 2.状态模式的类图
  • 3.状态模式代码
  • 4.状态模式还可以优化的地方
  • 5.状态模式的项目实战,优化后

三、过程

1.状态模式简介

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

2.状态模式的类图

在这里插入图片描述

3.状态模式代码

package com.a7DesignPattern.a3BehaviorType.a09State;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 10:39
 */
public abstract class State {
    public abstract void Handle(Context context);
}

package com.a7DesignPattern.a3BehaviorType.a09State;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 10:42
 */
public class ConcreteStateA extends State{
    @Override
    public void Handle(Context context) {
        context.setState(new ConcreteStateB());
    }
}

package com.a7DesignPattern.a3BehaviorType.a09State;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 10:43
 */
public class ConcreteStateB extends State{

    @Override
    public void Handle(Context context) {
        context.setState(new ConcreteStateA());
    }
}

package com.a7DesignPattern.a3BehaviorType.a09State;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 10:39
 */
public class Context {
    private State state;

    Context(State state){
        this.state = state;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
        System.out.println("当前状态"+state.getClass().getName());
    }

    public void Request(){
        state.Handle(this);
    };
}

package com.a7DesignPattern.a3BehaviorType.a09State;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 10:44
 */
public class Client {
    public static void main(String[] args) {
        Context context = new Context(new ConcreteStateA());
        context.Request();
        context.Request();
        context.Request();
        context.Request();
        context.Request();
    }
}

4.状态模式还可以优化的地方

子类的流转是在子类中写死的方式,这样如果后续新增子类对于已有子类的修改是不符合开闭原则的

5.状态模式的项目实战,优化后

package com.a7DesignPattern.a3BehaviorType.a09State.project;

public class ContentGrain {
    
    String name;

    private ContentGrain nextContentGrain;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ContentGrain getNextContentGrain() {
        return nextContentGrain;
    }

    public void setNextContentGrain(ContentGrain nextContentGrain) {
        this.nextContentGrain = nextContentGrain;
    }

    public void send(){
        System.out.println("当前对象所属的子类名字为:"+this.getClass().getName());
    }

}

package com.a7DesignPattern.a3BehaviorType.a09State.project;

public class Topic extends ContentGrain{

    public void dianzan(){
        System.out.println("我还有单独点赞的方法");
    }

    public void send(){
        super.send();
        dianzan();
    }
}

package com.a7DesignPattern.a3BehaviorType.a09State.project;

public class Practice extends ContentGrain{

    public void isOK(){
        System.out.println("这个活动是有标准答案的");
    }

    public void send(){
        super.send();
        isOK();
    }

}

package com.a7DesignPattern.a3BehaviorType.a09State.project;

import java.util.List;

public class RunLink {
    private static ContentGrain contentGrain;

    static {
        //这里的链将在配置文件中进行构建
        ContentGrain contentGrain1 = new Topic();
        contentGrain = contentGrain1;
        ContentGrain contentGrain2 = new Practice();
        contentGrain1.setNextContentGrain(contentGrain2);
        ContentGrain contentGrain3 = new Topic();
        contentGrain2.setNextContentGrain(contentGrain3);
    }

    public void run(){
       while (contentGrain.getNextContentGrain() != null){
           contentGrain.send();
           contentGrain = contentGrain.getNextContentGrain();
       }
    }

}

package com.a7DesignPattern.a3BehaviorType.a09State.project;

public class Client {
    public static void main(String[] args) {

        RunLink runLink = new RunLink();
        runLink.run();

    }
}

四、总结

1.对于运用设计模式原则和具体模式去落地软件工程有了更加明确的边界
2.真正在场景中去理解模式的魅力,会更加清晰明朗
3.结合设计模式的类型,要解决的场景再理解起来更明确了

五、升华

当认知提升之后,不妨再回头看看,设计模式的魅力和伟大会再次让你惊叹

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/42612.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端学习——Vue (Day1)

Vue 快速上手 Vue 是什么 创建 Vue 实例 Vue2官网&#xff1a;https://v2.cn.vuejs.org/ <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge…

基于单片机的语音识别智能垃圾桶垃圾分类的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;液晶显示当前信息和状态&#xff1b;通过语音识别模块对当前垃圾种类进行语音识别&#xff1b; 通过蜂鸣器进行声光报警提醒垃圾桶已满&#xff1b;采用舵机控制垃圾桶打开关闭&#xff1b;超声波检测当前垃圾桶满溢程度&#xff1…

【目标跟踪】2、FairMOT | 平衡多目标跟踪中的目标检测和 Re-ID 任务 | IJCV2021

文章目录 一、背景二、方法2.1 Backbone2.2 检测分支2.3 Re-ID 分支2.4 训练 FairMOT2.5 Online Inference 三、效果3.1 数据集3.2 实现细节3.3 消融实验3.4 最终效果 论文&#xff1a;FairMOT: On the Fairness of Detection and Re-Identification in Multiple Object Tracki…

大模型开发(十):Chat Completion Models API 详解

全文共8000余字&#xff0c;预计阅读时间约18~28分钟 | 满满干货(附代码案例)&#xff0c;建议收藏&#xff01; 本文目标&#xff1a;详解Chat Completion Models的参数及应用实例&#xff0c;并基于该API实现一个本地知识库的多轮对话智能助理 代码&文件下载点这里 一、…

【前端|CSS系列第4篇】CSS布局之网格布局

前言 最近在做的一个项目前台首页有一个展示词条的功能&#xff0c;每一个词条都以一个固定大小的词条卡片进行展示&#xff0c;要将所有的词条卡片展示出来&#xff0c;大概是下面这种布局 每一行的卡片数目会随着屏幕大小自动变化&#xff0c;并且希望整个卡片区域周围不要…

ChatGPT 4.0 —— Code Interpreter

&#x1f4ce;产品销售数据集.csv 选取以上的数据集作为输入&#xff0c;对Code Interpreter 进行测试 1.输入指定数据集&#xff0c;要求给出该数据集的概貌 2.请分析销售的总金额和其他变量的关系 Python Script: # Import required libraries import matplotlib.pyplot a…

java项目之网络视频播放器(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的网络视频播放器。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&a…

vs2015 工程组织与动态加载

10.Visual Studio动态加载_哔哩哔哩_bilibili 1.工程组织 ① researcher.cpp #include "nn/nn.h"#include "nn/factory.h" #include "nn/factory_impl/factory_impl.h"#include <iostream>int main() {int ret 0;factory_i* fct new f…

Java实现获取客户端真实IP方法小结

Java实现获取客户端真实IP方法小结 在jsP里&#xff0c;获取客户端的IP地址的方法是&#xff1a;request.getRemoteAddr()&#xff0c;这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件&am…

【数据挖掘】bytewax 与 ydata工具可实时了解您的数据

一、说明 在这篇博文中&#xff0c;我们将介绍如何将开源流式处理解决方案 bytewax 与 ydata 分析相结合并加以利用&#xff0c;以提高流式处理流的质量。 STream 处理支持在传输中和存储之前对数据进行实时分析&#xff0c;并且可以是有状态的&#xff0c;也可以是无状态的。 …

双向循环链表的基本操作(创建节点,头插,头删,尾插,尾删)

头定义&#xff1a; typedef char datatype[20];//datatypechar[20] typedef struct Node {//数据域 数据元素datatype data;//指针域 下一个节点地址struct Node* next;//指针域 上一个节点地址struct Node* prev; }*DoubleLink; 创建链表节点&#xff1a; DoubleLink crea…

轻量级Web报表工具ActiveReportsJS全新发布v4.0,支持集成更多前端框架!

ActiveReportsJS 是一款基于 JavaScript 和 HTML5 的轻量级Web报表工具&#xff0c;采用拖拽式设计模式&#xff0c;不需任何服务器和组件支持&#xff0c;即可在 Mac、Linux 和 Windows 操作系统中&#xff0c;设计多种类型的报表。ActiveReportsJS 同时提供跨平台报表设计、纯…

第五章 编程之免交互

免交互&#xff1a;不需要人为控制就可以完成的自动化操作&#xff08;自动化运维&#xff09; shell脚本和面交互是一个概念&#xff0c;但是两种写法 shell&#xff1a;默认解释器是bash 使用i/o&#xff08;输入/输出&#xff09;重定向的方式&#xff0c;将命令的列表提供…

Flask 定制日志并输出到文件

Flask 定制日志并输出到文件 定制日志器flask缺省日志器配置自定义日志器 定制日志器 flask缺省日志器配置 flask自带的日志系统&#xff0c;缺省配置dictConfig()&#xff0c;但必须在Flask()应用之前使用 # flask缺省配置 from logging.config import dictConfig dictConfig…

文心千帆大模型测评分享,效果超出预期

一、前言 现如今&#xff0c;随着ChatGPT的爆火越来越多的人开始关注人工智能领域了&#xff0c;大家都在尝试使用它来帮助自己在工作上提高效率亦或是解决一些问题。但ChatGPT是有一定的使用门槛的&#xff1a;首先需要我们“科学上网”才能访问&#xff0c;其次GPT4的价格相…

C语言库函数 — 错误信息报告函数

前言 本文介绍错误信息报告函数 错误信息报告函数的作用&#xff1a; 帮助程序员快速定位代码中的错误&#xff0c;以便更快地进行调试和修复问题。 文章目录 前言一、错误信息报告函数什么是错误信息报告函数错误信息报告函数的作用strerror函数介绍strerror函数使用错误码对应…

Data Structure, Algorithm,and Applications in C++

在学习这本书进阶内容之前&#xff0c;我们可以跟着它的第一章部分再巩固和复习。本书由Sartaj Sahni撰写&#xff0c;由王立柱和刘志红翻译。全书通俗易懂&#xff0c;内容丰富&#xff0c;是巩固C内容的不二选择。希望本文对各位有所帮助。 目录 1.函数与参数 1.1.传值参数…

C++的类型转换

文章目录 一. C语言的类型转换二. C的四种类型转换1. static_cast2. reinterpret_cast3. const_cast4. dynamic_cast 三. RTTI结束语 一. C语言的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类…

25 MFC 数据库

文章目录 导入ADO库 导入ADO库 #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")void CADODlg::OnBnClickedBtnQuery() {//导入ADO库::CoInitialize(NULL);//初始化COM库_ConnectionPtr pCo…

ChatGPT 最佳实践指南

GPT Best Practices GPT 最佳实践指南 This guide shares strategies and tactics for getting better results from GPTs. The methods described here can sometimes be deployed in combination for greater effect. We encourage experimentation to find the methods that…