- 浏览: 869662 次
- 性别:
- 来自: 美国图森
最新评论
-
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 11231现在上一点规模的 ... -
Spring freemarker页面乱码解决
2011-01-13 11:56 7479在开发过程中遇到乱码十分的头痛,如果你在开发过程中也遇 ... -
数据漂白算法研究
2010-12-07 18:05 3765你的手机是不是 ... -
理解使用static import 机制
2010-11-09 08:48 3182J2SE 1.5里引入了“Sta ... -
理解多线程设计模式
2010-11-08 17:43 10422多线程设计模式:1.Single Threaded Execu ... -
理解ThreadLocal
2010-11-03 17:04 1914ThreadLocal是什么 早在JDK 1 ... -
经验总结:高性能的数据同步
2010-11-03 10:03 6404最近在做一个银行的生产数据脱敏系统,今天写代码时遇到 ... -
用JSSE实现网络安全通信
2010-06-25 15:11 3821在网络上信息由源主机到目标主机要经过很多路由和计算机, ... -
Java实时监控日志文件并输出
2010-06-19 17:21 61123最近有一个银行数据漂白系统,要求操作人员在页面调用远端 ... -
Junit测试private方法
2010-04-28 14:09 8010package com.bill99.junit; pu ... -
保护眼睛的豆沙色
2010-03-19 09:46 3559作我们IT这行的,一天要盯着电脑看,时间长了眼睛会感觉发酸 ... -
中国联通短信网关接入程序源代码(SGIP1.2协议)
2010-01-11 12:23 42852自从我发了博文“中国联通SP业务开发总结”后有很多的朋友问 ... -
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别
2009-12-24 13:14 67450原地址:http://topic.csdn.net/t/200 ... -
非阻塞通信
2009-12-03 11:43 4615对于用ServerSocket和Socket写的服务 ... -
处理线程泄露
2009-12-01 15:10 8563当一个单线程化 ... -
在Timer和ScheduledExecutorService间决择
2009-11-27 10:25 13372java.util.Timer计时器有管理任务延迟执行(& ... -
Socket通信模式:收发线程互斥
2009-11-14 19:09 8724有做过通信程序或着短信接入程序的程序员都知道,与之 ... -
ASCII码对照表
2009-11-12 11:26 2518ASCII表 ASCII值 控制字符 ASC ... -
java.net.SocketException: Software caused connection abort: recv failed 异常分析
2009-11-12 11:01 15680java.net.SocketException: Softw ... -
HttpURLConnection设置网络超时
2009-10-29 17:30 9468Java中可以使用HttpURLConnection来请 ...
相关推荐
if (con.State == System.Data.ConnectionState.Closed) con.Open(); } catch (System.Data.SqlClient.SqlException E) { //如果出现错误,关闭数据连接,并抛出错误信息 this.Close(); throw new Exception...
14.JS中的判断语句结构:if(condition){}else{} 15.JS中的循环结构:for([initial expression];[condition];[upadte expression]) {inside loop} 16.循环中止的命令是:break 17.JS中的函数定义:function functionName...
JSX IF 一个非常轻量级的帮助程序,用于在JSX中编写具有本机外观的条件语句。...var _if = jsxIf._if, _elseif = jsxIf._elseif, _else = jsxIf._else;_if函数至少接受两个参数:条件和一个值或函数,如果为true
If ADOcn.State = adStateClosed Then ADOcn.Open '打开到数据库的连接 End Sub 完成本项工作后,就创建了一个全局变量ADOcn,但它是一个特殊的变量,其数据类型是数据连接对象(Connection对象)。可以把ADDcn理解...
if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) { cmdresult = 0; } else { cmdresult = int.Parse(obj.ToString()); } if (cmdresult == 0) { return false; } else ...
在python命令行模式下,在IDLE中输入多行,例如if else 使用tab的方式,控制缩进 在最后,连续两个回车,表示结束 >>> if state: ... print "ok" ... else: ... print "wrong" ... wrong >>> 以上这篇python实现...
实验3 使用package语句与import语句 13 上机实践4 继承与接口 15 实验1 继承 15 实验2 上转型对象 17 实验3 接口回调 18 上机实践5 字符串、时间与数字 19 实验1 String类的常用方法 19 实验2 比较日期的大小 21 ...
trans1.CommandText = "INSERT INTO [T_Message] ([Mobile],[Content],[DateTime],[PlatFlag],[State]) VALUES (@Mobile,@Content,@DateTime,@PlatFlag,@State)"; trans1.CommandType = DbCommandType.Text; ...
始终尝试使用单行if/else语句。 在那种情况下,不需要括号。 如果if/else表达式超过单行-请使用花括号。 如果仅使用if且表达式为单行-则不需要大括号。 private fun provideCardColor (): Int = if (x > y) Color ...
Querying if the input is valid 14.5.3.2. Getting Invalid, Missing, or Unknown Fields 14.5.3.3. Getting Valid Fields 14.5.4. Using Metacommands to Control Filter or Validator Rules 14.5.4.1. The ...
//查询语句 private string sql_update; private System.Windows.Forms.RichTextBox tipsmemo; private System.Windows.Forms.TextBox mat_text; private OleDbCommand mycommand = new OleDbCommand(); ...
if($state==0){ $classState=已下课; } else{ $classState=正在上课; } echo [removed] function getState(){ var cs = .$state.; return cs; } [removed]; ?> 这样在页面的其他地方,就可以直接引用php中输出的...
if (conn.State == ConnectionState.Open) { conn.Close(); } conn.Open(); } /// /// 关闭数据库连接 /// public static void CloseConnect() { if (conn.State != ConnectionState.Closed) { conn...
软件编程规范培训实例与练习 ...if ( SPC_STATE_OK == pSpcCB->bySpcState ) 语句时,主机复位。但是该语句似乎并无不妥。 再分析整个函数,pSpcCB在函数前部分已经被赋值, pSpcCB = SpcCB + (PortTable...
单独用XMl不能显示页面,我们使用格式化技术,比如CSS或者XSL,才能显示XML标记创建的文档。 我们在前面第一章讲到XML是将数据和格式分离的。XML文档本身不知道如何来显示,必须有辅助文件来帮助实现。(XML取消了...
(5)在未使用显式游标的情况下,使用SELECT语句必须保证只有一条记录返回,否则会产生异常情况。 [例3-1] 问题:编写一个过程,求和运算。 SET SERVEROUTPUT ON; DECLARE a number:=1; BEGIN a:=a+5; DBMS_...
template模板方法模式、memento备忘录模式、observer观察者模式、command命令模式、state状态模式、strategy策略模式、mediator调停者模式、interpreter解释器模式、visitor访问者模式、chain of responsibility责任...
如果我们想知道user_indexes表各字段名称的详细含义,可以用下面这条SQL语句: SQL>select column_name,comments from dict_columns where table_name='USER_INDEXES'; 依此类推,就可以轻松知道数据字典的详细...
else --以下case语句是程序中最关键的状态机部分 case state is when waitserve=> --进程处于等待发球状态 case serve is when "10"=> i;state; when "01"=> i;state; when "11"=>i; when others=> i; end case; ...
--使用ALTER TABLE 语句为已经创建的表添加主键约束、外键约束 --主键 ALTER TABLE Customer ADD CONSTRAINT PK_Customer PRIMARY KEY(CusNo) GO ALTER TABLE Product ADD CONSTRAINT PK_Product PRIMARY KEY...