用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

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

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

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