- 浏览: 875691 次
- 性别:
- 来自: 美国图森
最新评论
-
jnjeC:
jake_12345 写道大哥,这写错了吧Class.isAs ...
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别 -
lgh1992314:
https://my.oschina.net/xianggao ...
Servlet生命周期 -
qq412796770:
大哥,百度第一条就是你的,好歹也修改一下吧
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别 -
技术无涯苦作舟:
大哥,百度第一条就是你的,好歹也修改一下吧
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别 -
lgh1992314:
大哥,百度第一条就是你的,好歹也修改一下吧
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别
我们在写程序的过程中会遇到很多的逻辑判断,一般都是用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();
而不用改原有代码,提高程序的松耦合。
评论
[*]
[*]
[*]
[*]
[*]
[*]
[*]
[*]
[*]
[*]
同感,除非业务内容很多的情况下用,不过好像比较少吧
不过思路可以学习学习
匿名类 ?
同感,除非业务内容很多的情况下用,不过好像比较少吧
不过思路可以学习学习
发表评论
-
人在江湖:如何用代码保护自己
2011-10-12 16:30 11428现在上一点规模的 ... -
Spring freemarker页面乱码解决
2011-01-13 11:56 7565在开发过程中遇到乱码十分的头痛,如果你在开发过程中也遇 ... -
数据漂白算法研究
2010-12-07 18:05 3827你的手机是不是 ... -
理解使用static import 机制
2010-11-09 08:48 3236J2SE 1.5里引入了“Sta ... -
理解多线程设计模式
2010-11-08 17:43 10547多线程设计模式:1.Single Threaded Execu ... -
理解ThreadLocal
2010-11-03 17:04 1967ThreadLocal是什么 早在JDK 1 ... -
经验总结:高性能的数据同步
2010-11-03 10:03 6456最近在做一个银行的生产数据脱敏系统,今天写代码时遇到 ... -
用JSSE实现网络安全通信
2010-06-25 15:11 3896在网络上信息由源主机到目标主机要经过很多路由和计算机, ... -
Java实时监控日志文件并输出
2010-06-19 17:21 61327最近有一个银行数据漂白系统,要求操作人员在页面调用远端 ... -
Junit测试private方法
2010-04-28 14:09 8077package com.bill99.junit; pu ... -
保护眼睛的豆沙色
2010-03-19 09:46 3602作我们IT这行的,一天要盯着电脑看,时间长了眼睛会感觉发酸 ... -
中国联通短信网关接入程序源代码(SGIP1.2协议)
2010-01-11 12:23 43300自从我发了博文“中国联通SP业务开发总结”后有很多的朋友问 ... -
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别
2009-12-24 13:14 67558原地址:http://topic.csdn.net/t/200 ... -
非阻塞通信
2009-12-03 11:43 4669对于用ServerSocket和Socket写的服务 ... -
处理线程泄露
2009-12-01 15:10 8629当一个单线程化 ... -
在Timer和ScheduledExecutorService间决择
2009-11-27 10:25 13430java.util.Timer计时器有管理任务延迟执行(& ... -
Socket通信模式:收发线程互斥
2009-11-14 19:09 8782有做过通信程序或着短信接入程序的程序员都知道,与之 ... -
ASCII码对照表
2009-11-12 11:26 2599ASCII表 ASCII值 控制字符 ASC ... -
java.net.SocketException: Software caused connection abort: recv failed 异常分析
2009-11-12 11:01 15826java.net.SocketException: Softw ... -
HttpURLConnection设置网络超时
2009-10-29 17:30 9512Java中可以使用HttpURLConnection来请 ...
相关推荐
总结来说,"pri_encoder_using_if.rar_If..._pri" 提供了一个使用Verilog编程语言实现的优先级编码器的例子,它利用了`if...else`语句来确定并编码最高优先级的输入。这个设计对于理解和学习数字逻辑设计,特别是...
如果我们经常使用 If-Else 语句来判断状态并进行切换,那么就可以考虑使用 State 模式。例如,在数据库系统中,某个对象的属性不同,对象的行为也不同,这时可以使用 State 模式来实现状态切换。 State 模式的优点...
THEN 语句的语法格式为:IF 逻辑表达式 1 THEN 语句 1 [ELSEIF 逻辑表达式 2 THEN 语句 2 ...] [ELSE 语句 n] END IF。 示例: ``` Integer ss = integer(sle_1.text) IF s St_1.text = “不及格” ELSE St_1....
State模式的核心思想是封装可能改变的行为到相应的状态对象中,让对象在其内部状态改变时可以调用不同的行为方法,而不是使用大量的if...else语句来判断并执行不同的行为。 在实际开发中,当一个对象的行为依赖于它...
- 状态的切换逻辑复杂,如果使用大量的if-else或switch语句会导致代码难以理解和维护。 - 需要将状态相关的操作封装在独立的对象中,以提高代码的复用性和可扩展性。 在Java中,正确使用State模式可以有效地管理和...
7. **Stateflow图表集成**:Simulink还支持使用Stateflow图表来表示更复杂的状态机逻辑,其中包括If-Else结构,这在处理离散事件和状态转换时非常有用。 8. **调试与验证**:通过Simulink的调试工具,如示波器和...
多行 IF 语句的语法格式为:IF 逻辑表达式1 THEN 语句 1 [ ELSEIF 逻辑表达式 2 THEN 语句 2 ... ] [ ELSE 语句 n] END IF。 例如: Integer s s = integer(sle_1.text) If s St_1.text = “不及格 ” Else St_1...
2. **条件语句多**:如果代码中有大量的`if-else`或`switch-case`语句用来控制对象的行为,这些语句可以根据对象的不同状态来选择执行不同的操作,则可以考虑使用State模式来简化代码结构。 3. **状态依赖**:当对象...
接着,我们来看看如何使用if语句来控制LED的流水方向。if语句是C语言中的条件控制语句,用于根据特定条件执行不同的代码块。在这个实验中,if语句可能被用来判断LED流水灯的前进或后退状态。例如,我们可以设定一个...
本教程将详细讲解如何利用C语言中的if语句来控制单片机的P0端口,进而实现8位LED灯的点亮效果。 首先,我们需要了解单片机的基本架构。单片机通常包含CPU(中央处理器)、RAM(随机存取存储器)、ROM(只读存储器)...
当这些状态变化的逻辑变得非常复杂时,如果仅仅通过条件语句(如`if-else`或`switch-case`)来处理这些状态,代码会变得非常难以理解和维护。状态模式通过将不同的状态定义为独立的对象,解决了这一问题。 #### 三...
Stateflow支持条件语句,如“if_else”结构。这允许根据输入信号或系统状态执行不同的路径。 **数据类型和范围** Stateflow支持多种数据类型,包括双精度浮点数(double)、单精度浮点数(single)、32位整数(int...
交汇连接点(junction point)用于处理状态迁移过程中的信号分离和汇合,它有助于实现if-else的功能。 ### 图形函数工具和嵌入式MATLAB函数 图形函数工具和嵌入式MATLAB函数都用于执行特定的计算任务,它们可以在...
- 避免了条件分支语句:状态模式将与特定状态相关的行为封装到相应的状态对象中,消除了大量的if...else或switch语句,提高了代码的可读性和可维护性。 - 允许状态转换逻辑与状态对象绑定在一起,这使得增加新的状态...
- **if...else**:`if`语句用于条件判断,可以有单个条件、带有`else`的条件和复杂的`if...elseif...else`结构。例如: ```php if ($state == 1) { echo "哈哈"; } else { echo "呵呵"; } ``` - **递归if.....
在本教程中,我们将深入探讨如何使用C语言和嵌入式系统中的if语句来控制P0端口上的8位LED流水灯。首先,我们需要理解C语言中的if语句是条件控制结构,它允许我们根据特定条件执行不同的代码块。 **C语言的if语句** ...
- **if...else**:PHP中的条件判断语句,包括单if、if...else和复杂的if...else if...else结构。要注意的是,判断相等使用`==`,而非`=`, 后者是赋值操作。 例如,一个简单的if...else示例: ```php $state = 1; ...
- 消除条件语句:原本可能需要大量if...else或switch...case语句来处理不同状态的情况,现在可以通过状态对象的调用来代替,使得代码更易于理解和维护。 然而,状态模式也有一些潜在的缺点,如增加系统类和对象的...
- **if...elseif...else**:多重条件判断,按顺序检查每个条件,直到找到满足的条件并执行相应的代码块。 循环结构包括`for`、`while`、`do...while`和`foreach`等,用于重复执行一段代码,直到特定条件不再满足...