状态机模式——精选推荐.pdf

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

状状态态机机模模式式

状状态态机机

对于你的状态机,可能有若⼲个状态,每个状态有⾃⼰特定的属性和属于该状态下的⾏为,因此你可以为每个状态定⼀个类,当然这些状

态实现⼀个接⼝State,然后,把这些State作为状态机的实例变量。

适适⽤⽤场场合合::

State模式在实际使⽤中⽐较多,适合状态的切换.因为我们经常会使⽤Ifelseifelse进⾏状态切换,如果针对状态的这样判断切换反复出现,我

们就要联想到是否可以采取State模式了.

特特点点::

·拥有⼀个状态机对象:⽤于代表当前的状态

·拥有⼀个切换到上/下⼀个状态的⽅法:实际上是调⽤了状态机⾃⾝的切换⽅法,由于状态机本⾝已经“知道”⾃⼰是什么状态,所以可以⽅便

的切换到上、下⼀个状态。

有⼀个实例来辅助分析话会更⽅便,这⾥使⽤的实例是:编程找出⽂件中符合正则表达式alpha[alpha|digit]*和digit+的字符串。alpha

就是字母啦:[a-zA-Z];digit就是数字:[0-]。

先画出DFA:

在上图中,状态只有三个(结束状态可以省略):开始状态、单词状态和数字状态。

接下来要⽤两种不同的⽅法来实现这个DFA,第⼀种是传统的whileswitch⼤法,第⼆种是现在流⾏的设计模式中的状态模式。

为了⽅便⽐较,先抽象出⼀个名为Parser的接⼝,它提供了⼀个名为parse的⽅法,传统状态机和状态机模式通过实现这个⽅法来完成对正

则表达式的识别。传统状态机实现的类名叫ClassicalMachine,状态机模式的类名则叫PatternMachine。

publicinterfaceParser{

voidparse()throwsException;

}

ClassicalMachine类的实现⾮常简单,它在parse()⽅法⾥就完成了⼲完了⼀切:

publicclassClassicalMachineimplementsParser{

privateBufferedReadermFin;

privateStringmToken;

publicClassicalMachine(BufferedReaderfin){

mFin=fin;

}

privateenumSTATUS{START,IS_KEYWORD,IS_NUMBER};

STATUSmStatus=STATUS.START;

@Override

publicvoidparse()throwsException{

mToken=;

while(true){

intch=mFin.read();

if(-1==ch)break;

charc=(char)ch;

switch(mStatus){

caseSTART:

if(Character.isLetter(c)){

mToken+=c;

mStatus=STATUS.IS_KEYWORD;

}

elseif(Character.isDigit(c)){

mToken+=c;

mStatus=STATUS.IS_NUMBER;

}

break;

caseIS_KEYWORD:

if(Character.isLetterOrDigit(c)){

mToken+=c;

}

文档评论(0)

+ 关注
实名认证
内容提供者

好文件大家想

1亿VIP精品文档

相关文档