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

news/2024/12/22 9:13:06/

目录

  • 一、背景介绍
  • 二、思路&方案
  • 三、过程
    • 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{@Overridepublic 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{@Overridepublic 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.结合设计模式的类型,要解决的场景再理解起来更明确了

五、升华

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


http://www.ppmy.cn/news/971756.html

相关文章

视频特效软件有哪些?这些软件值得一试

大家平常在制作视频时,经常需要将多个视频拼接,但是如果两个视频中间没有什么转场过渡的话,会显得很单调。我们可以增加一些转场、音乐、特效,这样整支视频看起来效果会好很多。讲到视频特效,可能有些小伙伴会觉得它很…

如何给视频添加特效?快速制作特效视频

如何给视频添加特效?现如今几乎我们人人每天都在与短视频打交道,有些人在日常的生活中也会剪辑一些短视频。其实剪辑短视频并没有你想象中的那么困难。只是需要找到一款合适的软件就可以很快完成。在短视频剪辑中就有需要给短视频添加特效的操作&#xf…

【软件工程中的各种图】

1、用例图(use case diagrams) 【概念】描述用户需求,从用户的角度描述系统的功能 【描述方式】椭圆表示某个用例;人形符号表示角色 【目的】帮组开发团队以一种可视化的方式理解系统的功能需求 【用例图】 2、静态图(Static …

基于深度学习的高精度六类海船检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度六类海船检测识别系统可用于日常生活中检测与定位海船目标(散装货船(bulk cargo carrier)、集装箱船(container ship)、渔船(fishing boat)、普通货船&…

SpringBoot实战(二十一)集成 TLog 日志

目录 一、简介二、Maven依赖三、启动类集成四、测试1.服务简介2.服务A代码DemoController.javaDemoFeignClient.java 3.服务B代码4.测试结果 补充一:自定义日志标签模板补充二:SpanId的生成规则补充三:业务标签1.打印入参2.指定连接符3.打印常…

Docker 的数据管理、容器互联、镜像创建

目录 一、数据管理 1.数据卷 2. 数据卷容器 二、容器互联(使用centos镜像) 三、Docker 镜像的创建 1.基于现有镜像创建 1.1首先启动一个镜像,在容器里修改 1.2将修改后的容器提交为新的镜像,需使用该容器的id号创建新镜像 …

任务 04、Midjourney提示词使用初指南:AI绘画不再难

4.1 任务简介 本次实验任务帮助读者掌握MidJourney提示词的使用为主题。任务分为四个部分,包括掌握提示词的基本使用结构、了解编写提示词的基本原则、探索提示词的基本用法以及通过实例快速体验提示词绘图。通过学习本任务,读者能够全面了解并熟练运用MidJourney提示词,在…

Stable Diffusion,给大家一点小小的固有印象

输入文字自动生成 AI 绘图,喜欢吗?😋 下面测试一下简单的提示词生成效果,可以认为体现了模型的默认固有印象(训练集平均)。 Model: Protogen v2.2 Prompt: two asian women 经典吊梢眼、宽眼距、塌鼻子。…