基于状态的编程:使用有限状态机来定义程序的行为、控制程序的执行(根据当前状态,决定下一步要执行什么操作、执行操作之后要转移到什么新的状态)
1.基于自动化的编程(Automata-based programming)
核心思想:将程序看作是一个有限状态自动机,侧重于对“状态”及“状态转换”的抽象和编程
方法:程序的执行被分解为一组自动执行的步骤。各步骤之间的通讯通过“状态变量”进行。程序执行就可看作是各自动步骤的不断循环。使用枚举类型enum定义状态。使用二维数组定义状态转换表。(See Wikipedia: https://en.wikipedia.org/wiki/State_transition_table)
2.状态模式(State Pattern)
模式图:
*例:
3.备忘录模式(Memento Pattern)
用途:记住对象的历史状态,以便于“回滚”
设计原则:
需要“备忘”的类 添加originator的备忘记录和恢复 备忘录,记录originator对象的历史状态*例:
核心思想:将代码中复杂的if-else和switch-case语句从代码中分离出来,通过“查表”的方式完成,从而提高可维护性
点击打开链接
场景:
有一类应用,从外部读取文本数据,在应用中做进一步处理。输入文件有特定格式,程序需读取文件并从中抽取正确的内容从网络上传输过来的消息,遵循特定的协议用户在命令行输入的指令,遵顼特定的格式内存中存储的字符串,也有格式需要方法:
使用grammar判断字符串是否合法,并解析成程序里使用的数据结构(通常是递归的数据结构)正则表达式根据语法生成它的解析器,用于后续的解析1.语法的成分:terminals 终止节点、叶节点、nonterminal 非终止节点(遵循特定规则,利用操作符、终止节点和其他非终止节点,构造新的字符串)
2.语法中的操作符
基础语法:
– Concatenation, represented not by a symbol, but just a space– Repetition, represented by *– Union, also called alternation, represented by | x 等价于 y后跟一个z x 等价于 0个或更多个y x 等价于一个y或者一个z组合语法:
– Optional (0 or 1 occurrence), represented by ?– 1 or more occurrences: represented by +– A character class [...], representing the length-1 strings containing any ofthe characters listed in the square brackets– An inverted character class [^...], representing the length-1 stringscontaining any character not listed in the brackets x 等价于一个y或者一个空串 x 等价于一个或者更多个y(*, ?, and +有最高的优先级;|优先级最低)
*例:
**练习:
1.正则语法(Regular grammar):简化之后可以表达为一个产生式而不包含任何非终止节点
2.正则表达式(regex):去除引号和空格,从而表达更简洁(更难懂)
使用场合:
1.用一个空格取代所有的多个空格
2.匹配一个URL
3.提取HTML标签的一部分
附:
更详细的叙述:
点击打开链接