用State模式减少if..elseif语句

2024-02-16 23:32

本文主要是介绍用State模式减少if..elseif语句,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这种方式可以适用于很多场合,就像现在做的学习平台项目,也可以用在上面去。资源有视频、ppt等等类型,当不同类型的时候就调用不同的方法。就可以把它做成个便于维护和通用的。

注重这种模式的理解!!!

我们在写程序的过程中会遇到很多的逻辑判断,一般都是用if ..else、if..else if、swith(..) case等来做判断,然后根据结果做一下分支处理,这样写虽然方便,但会增加以后的维护难度,假如有上百个if ..else if判断,估计后期维护的人看到代码头都大了。像这种情况可以用state模式来解决。

  State模式是行为模式之一。当某个对象的内部状态(通俗的说,成员变量)发生改变,它的行为也会发生改变。

  状态模式的角色:
抽象状态、具体状态(一种或多个状态,每种状态对应不同的行力),环境(context)角色(就是对象,包括当前对象状态、改变状态的方法和状态行为方法)

  为了帮助理解,举例说明:

  一个画图程序,有一个控制面板,上面罗列了各种画图工具以及其它颜色选择,滴管等工具,当用户选择或改变了画图工具时,就可以使用各种不同的工具进行画图或其他操作了。
我们把这个过程用另外一种方法再描述一下:
- 用户选择画图工具就是一个画笔状态的改变。
- 每个工具能画的图形可能完全不一样,也就是说它们的行为各不一样。
- 改变了画图工具,在画布上画出的图形当然也不一样了,换句话说,画笔状态的改变导致行为的不一样。
 再举个例子,100米短跑远动员。他有三种状态,生病状态,正常状态,兴奋状态。那么状态决定这个运动员的行为,生病状态跑的速度慢,兴奋状态跑的速度快。我们以运动员程序为例,如果不用设计模式的话,我们可能会这写


package com.bill99.pattern;/***<p>title: 一般运动员</p>*<p>Description: </p>*<p>CopyRight: CopyRight (c) 2009</p>*<p>Company: 99bill.com</p>*<p>Create date: 2009-11-3</P>*@author Zhang Weiyang <sunnylocus@163.com>*/
public class Gamer {private final int NORMAL_STATE = 0; //正常状态private final int MALUM_STATE =1;   //生病状态private final int EXCITED_STATE =2; //兴奋状态private int state = 0;public void setState(int state){this.state = state;}public void run() {if(state == NORMAL_STATE) {       //正常状态下跑System.out.println("100米,跑完共用时15秒!");} else if(state == MALUM_STATE) { //生病状态下跑System.out.println("100米,跑完共用时20秒!");} else if(state == EXCITED_STATE) {//兴奋状态下跑System.out.println("100米,跑完共用时10秒!");} else {System.out.println("未知的状态");}}
}

如果以后维护的话,要再加一个超级兴奋的状态,得要改原来的源代码,添加一个代表超级兴奋的成员变量,再改if..else if判断,这样做不符合OO设计原则,实现不了程序的松耦合。

下面用状态模式来实现

package com.bill99.pattern.state;/***<p>title:状态接口 </p>*<p>Description:状态接口,每一个状态都要实现此接口 </p>*<p>CopyRight: CopyRight (c) 2009</p>*<p>Company: 99bill.com</p>*<p>Create date: 2009-11-3</P>*@author Zhang Weiyang <sunnylocus@163.com>*/
public interface IState {/*** 起跑*/public void doRun();
}

package com.bill99.pattern.state;/***<p>title: 兴奋状态运动员</p>*<p>Description: </p>*<p>CopyRight: CopyRight (c) 2009</p>*<p>Company: 99bill.com</p>*<p>Create date: 2009-11-3</P>*@author Zhang Weiyang <sunnylocus@163.com>*/
public class ExcitedState implements IState {public void doRun() {System.out.println("100米,跑完共用时10钞!");}
}

package com.bill99.pattern.state;/***<p>title:生病状态运动员 </p>*<p>Description: </p>*<p>CopyRight: CopyRight (c) 2009</p>*<p>Company: 99bill.com</p>*<p>Create date: 2009-11-3</P>*@author Zhang Weiyang <sunnylocus@163.com>*/
public class MalumState implements IState {public void doRun() {System.out.println("100米,跑完共用时20秒!");}
}

package com.bill99.pattern.state;/***<p>title:正常状态运动员 </p>*<p>Description: </p>*<p>CopyRight: CopyRight (c) 2009</p>*<p>Company: 99bill.com</p>*<p>Create date: 2009-11-3</P>*@author Zhang Weiyang <sunnylocus@163.com>*/
public class NormalState implements IState {public void doRun() {System.out.println("100米,跑完共用时15秒!");}
}

构建一个场景,运动员类,该运动员类包括表示当前对象状态的成员变量,改变当前状态的方法,和状态行为方法


package com.bill99.pattern.state;/***<p>title: 采用状态模式的运动员</p>*<p>Description: </p>*<p>CopyRight: CopyRight (c) 2009</p>*<p>Company: 99bill.com</p>*<p>Create date: 2009-11-3</P>*@author Zhang Weiyang <sunnylocus@163.com>*/
public class Gamer {//当前状态private IState state = new NormalState();//改变状态的方法public void setState(IState state){this.state = state;}//状态行为方法,同上面的Gamer 类相比这里没有if..else if判断public void run() {state.doRun();}
}

测试类
package com.bill99.pattern.state;/***<p>title: 测试类</p>*<p>Description: </p>*<p>CopyRight: CopyRight (c) 2009</p>*<p>Company: 99bill.com</p>*<p>Create date: 2009-11-3</P>*@author Zhang Weiyang <sunnylocus@163.com>*/
public class StateTest {public static void main(String[] args) {//没有使用状态设计模式com.bill99.pattern.Gamer game = new com.bill99.pattern.Gamer();game.setState(0);game.run();game.setState(1);game.run();game.setState(2);game.run();System.out.println("---------------------");//使用状态设计模式//正常状态下跑 Gamer gamer = new Gamer();gamer.run(); //生病状态下跑gamer.setState(new MalumState());gamer.run();//兴奋状态下跑gamer.setState(new ExcitedState());gamer.run();}
}

运行结果:

100米,跑完共用时15秒!
100米,跑完共用时20秒!
100米,跑完共用时10秒!
———————
100米,跑完共用时15秒!
100米,跑完共用时20秒!
100米,跑完共用时10钞!

 

假如我们再扩展一个超级兴奋的状态SuperExcitedState,只需实现IState接口,定义好该状态的行为,调用如下

gamer.setState(new  SuperExcitedState());

gamer.run();

而不用改原有代码,提高程序的松耦合。

原文链接: http://sunnylocus.iteye.com/blog/509423

这篇关于用State模式减少if..elseif语句的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/716012

相关文章

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

springboot实战学习(1)(开发模式与环境)

目录 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 (3)前端 二、开发模式 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 Validation:做参数校验Mybatis:做数据库的操作Redis:做缓存Junit:单元测试项目部署:springboot项目部署相关的知识 (3)前端 Vite:Vue项目的脚手架Router:路由Pina:状态管理Eleme

状态模式state

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/state 在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。 在状态模式中,player.getState()获取的是player的当前状态,通常是一个实现了状态接口的对象。 onPlay()是状态模式中定义的一个方法,不同状态下(例如“正在播放”、“暂停

软件架构模式:5 分钟阅读

原文: https://orkhanscience.medium.com/software-architecture-patterns-5-mins-read-e9e3c8eb47d2 软件架构模式:5 分钟阅读 当有人潜入软件工程世界时,有一天他需要学习软件架构模式的基础知识。当我刚接触编码时,我不知道从哪里获得简要介绍现有架构模式的资源,这样它就不会太详细和混乱,而是非常抽象和易