- 浏览: 543729 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (231)
- 一个操作系统的实现 (20)
- 汇编(NASM) (12)
- Linux编程 (11)
- 项目管理 (4)
- 计算机网络 (8)
- 设计模式(抽象&封装) (17)
- 数据结构和算法 (32)
- java基础 (6)
- UML细节 (2)
- C/C++ (31)
- Windows (2)
- 乱七八糟 (13)
- MyLaB (6)
- 系统程序员-成长计划 (8)
- POJ部分题目 (10)
- 数学 (6)
- 分布式 & 云计算 (2)
- python (13)
- 面试 (1)
- 链接、装载与库 (11)
- java并行编程 (3)
- 数据库 (0)
- 体系结构 (3)
- C++ template / STL (4)
- Linux环境和脚本 (6)
最新评论
-
chuanwang66:
默默水塘 写道typedef void(*Fun)(void) ...
C++虚函数表(转) -
默默水塘:
typedef void(*Fun)(void);
C++虚函数表(转) -
lishaoqingmn:
写的很好,例子简单明了,将观察者模式都表达了出来。
这里是ja ...
观察者模式——Observer
1. 概述
The intent of the STATE pattern is to distribute state-specific logic across classes that represent an object’s state.
STATE 设计模式的目的 是:将特定状态相关的逻辑分散到一些类的状态类中。
2. 实例
旋转门: Consider the model of the state of a carousel door(revolving door). A carousel is a large, smart rack that accepts material through a doorway and stores the material according to a bar code ID on it. The door operates with a single button. See the state diagram below for some detail.
旋转门的状态图:(状态图细节见 4. )
3. 状态模型的两种实现方法
3.1 方法一: switch
Observable是java.util中的类^^居然以前都不晓得哦,该打!
Door的具体实现如下:
import java.util.Observable; /** * This class provides an initial model of a carousel door * that manages its state without moving state-specific * logic out to state classes. */ public class Door extends Observable { public final int CLOSED = -1; public final int OPENING = -2; public final int OPEN = -3; public final int CLOSING = -4; public final int STAYOPEN = -5; private int state = CLOSED; /** * The carousel user has touched the carousel button. This "one touch" * button elicits different behaviors, depending on the state of the door. */ public void touch() { switch (state) { case OPENING: case STAYOPEN: setState(CLOSING); break; case CLOSING: case CLOSED: setState(OPENING); break; case OPEN: setState(STAYOPEN); break; default: throw new Error("can't happen"); } } /** * This is a notification from the mechanical carousel that * the door finished opening or shutting. */ public void complete() { if (state == OPENING) setState(OPEN); else if (state == CLOSING) setState(CLOSED); } /** * This is a notification from the mechanical carousel that the * door got tired of being open. */ public void timeout() { setState(CLOSING); } /** * @return a textual description of the door's state */ public String status() { switch (state) { case OPENING: return "Opening"; case OPEN: return "Open"; case CLOSING: return "Closing"; case STAYOPEN: return "StayOpen"; default: return "Closed"; } } private void setState(int state) { this.state = state; setChanged(); notifyObservers(); } }
但是采用这种实现,有一个缺陷:state变量在Door类的实现中浑身扩散,就像癌症一般!
3.2 方法二: State Pattern
A. 基本的 State Pattern 实现
以上设计方式要求每个状态子类实例内部“ hold 住”一个 Door2 实例的引用,这样才能完成 Door2 实例和它的各个状态实例时间的互相通信。这种设计要求一个状态实例对应一个 Door2 实例,这样一来,一个状态实例就只能为一个 Door2 实例服务╮ ( ╯▽╰ ) ╭
客户端这样调用:
public static void main(String[] args){ Door2 door=new Door2(); //1. 初始状态 System.out.println(door.status()); //2. 转移到Opening状态 door.touch(); System.out.println(door.status()); //3. 转移到Open状态 door.complete(); System.out.println(door.status()); //4. 转移到Closing状态 door.timeout(); System.out.println(door.status()); //5. 回到Closed状态 door.complete(); System.out.println(door.status()); }
下面给出Door2类、DoorState抽象类、DoorStayOpen类的实现:
Door2:
public class Door2 extends Observable { public final DoorState CLOSED = new DoorClosed(this); public final DoorState CLOSING = new DoorClosing(this); public final DoorState OPEN = new DoorOpen(this); public final DoorState OPENING = new DoorOpening(this); public final DoorState STAYOPEN = new DoorStayOpen(this); private DoorState state = CLOSED; public void touch() { state.touch(); } public void complete() { state.complete(); } public void timeout() { state.timeout(); } public String status() { return state.status(); } protected void setState(DoorState state) { this.state = state; setChanged(); notifyObservers(); }
DoorState抽象类:
public abstract class DoorState { protected Door2 door; public abstract void touch(); public void complete() { } public void timeout() { } public String status() { String s = getClass().getName(); return s.substring(s.lastIndexOf('.') + 1); } public DoorState(Door2 door) { this.door = door; } }
DoorStayOpen类:
public class DoorStayOpen extends DoorState { public DoorStayOpen(Door2 door) { super(door); } public void touch() { door.setState(door.CLOSING); } }
B. State Pattern 实现 2 ——让状态实例( DoorState 的子类实例)为多个 Door2 实例服务
子状态 DoorOpen 实现转移时只负责返回下目标状态是什么,将状态转移的 action 留给 Door2 实例自己来做;而不是像“ A. 基本的 State Pattern 实现”那样在 DoorOpen 内部保存一个 Door2 实例的引用 door ,亲自调用 door.setState(door.STAYOPEN); 来实现状态转移
改进后的关键代码:
public class DoorOpen extends DoorState{ public DoorState touch(){ return DoorState.STAYOPEN; // 以前是 door.setState(door.STAYOPEN); } ... } public class Door2 extends Observable{ public void touch(){ state=state.touch(); // 以前是 state.touch(); // 即将转移状态的工作留给状态实例来做,事不关己高高挂起 } }
C. State Pattern 实现 3 ——让状态实例( DoorState 的子类实例)为多个 Door2 实例服务
另一种实现这种效果的方法是:将 Door2 实例作为参数传递给 DoorState 的状态转移方法,而非建立 Composite 的关联关系(将 DoorState 的子类对象作为 Door2 的属性)。
也即,用“ Dependency 依赖”(弱依赖,如调用)代替了“ Association 关联”(强依赖,如作为属性进行组合)。
4. 状态图细节
何谓 State 状态 : Generally speaking, the state of an object depends on the collective value of the object ’ s instance variables. In some cases, most of an object ’ s attributes are fairly static once set, and one attribute is dynamic and plays a prominent role in the class ’ s logic. This attribute may represent the state of the entire object and may even be named state.
4.1 State
You can subdivide a state icon into areas that show the state ’ s name and activities 活动 .
3 frequently used categories of activities are entry (what happens when the system enters the state), exit (what happens when the system leaves the state), and do (what happens while the system is in the state).
4.2 Transition s (Details: Event[Guard Condition]/Action)
You can also add some details to the transition lines. You can indicate an event that causes a transition to occur (a trigger event ) and the computation (the action ) that executes and makes the state change happen.
A guard condition : when it’s met, the transition takes place. 通常将超时作为监护条件,∵可以认为此时没有任何 event.
•源状态 Source State :即受转换影响的状态
•目标状态 Target State :当转换完成后,对象的状态
•触发事件 (Trigger) Event :用来为转换定义一个事件,包括调用、改变、信号、时间四类事件
•监护条件 (Guard Condition) :布尔表达式,决定是否激活转换、
•动作 (Action) :转换激活时的操作
几个实例:
发表评论
-
(第十章)一个xml解析器和构造器
2013-03-10 16:40 928本章的前两节“10.1 状态机”、“10.2 ... -
享元模式——Flyweight
2012-02-17 13:10 1068享元模式——Flyweig ... -
工厂方法和抽象工厂——Factory Method & Abstract Factory
2012-01-04 17:14 2092一、使用抽象工厂和工厂方法 Factory Me ... -
单例模式——Singleton
2012-01-04 17:08 1008public class Singleton { ... -
观察者模式——Observer
2012-01-04 16:25 1323观察者模式—— Observer ... -
适配器模式——Adaptor(Adapter)
2012-01-01 18:23 1505适配器模式 —— Adapto ... -
装饰者模式——Decorator
2011-12-25 11:11 1181装饰者模式—— Decorator ... -
组合模式——Composite
2011-12-24 14:27 10111. Composite 定义 : ... -
构造者模式——Builder
2011-08-10 13:59 1072构造者模式——Builder 本文是《Java设计模 ... -
责任链模式——Chain of Responsibility
2011-08-10 11:26 935一、总结《Java设计模式》Chapter12 Chain o ... -
代理模式Dynamic Proxies(四、Struts2.0拦截器Interceptor)
2011-08-01 11:31 1420一、概念和注意点: Once you write a d ... -
代理模式Remote Proxies(三、RMI)
2011-08-01 09:51 1711因为我本科毕业设计中大量采用RMI实现分布式,且使用了Ecli ... -
代理模式Image Proxies(二、最朴素实现)
2011-07-31 11:55 998在前面《 代理模式Image Proxies(一、最朴素实现) ... -
命令模式——Command
2011-06-10 10:31 951偷懒一下,直接用JavaEye上chjavach老兄的文章了, ... -
代理模式Image Proxies(一、最朴素实现)
2011-06-03 09:27 1065A Classic Example: Image Prox ... -
策略模式——strategy
2011-06-02 12:36 901Strategy Pattern ...
相关推荐
1. **易于综合与优化**:状态机的设计结构相对简单,这有助于VHDL综合工具更好地进行优化。同时,状态机中的状态可以通过枚举类型来定义,进一步提高了综合的灵活性和效率。 2. **简化同步时序逻辑**:状态机是构建...
在软件设计模式中,有限状态机(Finite State Machine, FSM)是一种常见的模型,它用于描述一个对象在其生命周期中可以存在的不同状态以及如何在这些状态之间转换。本项目以实现一个电子宠物——养小鸡小游戏为例,...
- 使用双模块法可以更好地分离同步时序逻辑和组合逻辑,有利于代码的可读性和优化。 ### 四、编码风格与注意事项 #### 4.1 编码方式选择 - **二进制编码**:资源占用较少,但译码较复杂。 - **格雷码**:减少组合...
为了更好地支持层次状态机在嵌入式软件开发中的应用,我们可以设计一个可复用的应用框架`StateMachineWizard`。该框架应该包括以下核心功能: - **状态管理**:支持定义和管理不同层次的状态。 - **事件处理**:...
标题中的“生命周期组件框架——关系型状态机服务”暗示了我们即将探讨的是一个与软件开发相关的框架,特别关注的是对象或组件在其存在期间的行为管理。生命周期管理是编程中一个重要的概念,它涉及到对象从创建、...
层次式状态机(Hierarchical Finite State Machine,简称HFSM)是一种高级的状态机模型,主要用于解决传统平面状态机(Flat FSM)在处理复杂场景时遇到的问题。平面状态机虽然在表达简单的逻辑时非常有用,但随着...
### 关于“State Machine Java Pattern”的深入探讨 #### 摘要 本文介绍了一种新的面向对象设计模式——状态机设计模式(State ...在Java开发中合理运用状态机模式,可以帮助开发者更好地应对复杂多变的业务需求。
在按键扫描程序中,状态机可以帮助我们更好地管理按键的不同状态,如未按下、按下、保持等。 2. **状态转移**:在基于状态机的按键扫描程序中,每个按键都有其对应的状态机,包括“未按下”、“按下”、“保持”等...
通过状态机的设计模式,我们可以更好地管理这些状态的切换。 10. **游戏保存和加载(Game Save and Load)**:为了给玩家提供更好的体验,游戏可以提供保存和加载进度的功能。这通常涉及到序列化对象(如玩家分数、...
### 有限状态机在嵌入式系统中的实现及应用 #### 一、有限状态机的基本原理 有限状态机(Finite State Machine, FSM)是一种抽象模型,用于描述对象的行为,特别是那些可以通过不同状态来表现的对象。它由一组有限...
### VisualSTATE 学习知识点详解 #### 一、引言 在嵌入式系统开发过程中,状态机作为一种重要的设计模式,被广泛应用于多种...希望本文能帮助大家更好地理解和运用状态机技术,从而在实际项目中发挥其应有的作用。
《疯狂的火星虫_面向对象状态机实践指南_王咏武.pdf》这本书深入浅出地介绍了如何使用面向对象的设计方法来构建有限状态机(FSM),并且结合了C++和MFC的应用,使得读者能够更好地理解和应用这一概念。在王永武的...
状态图(statechart或state diagram),有时称为状态机(state machine),是一种用图形化方式表示系统状态以及状态间转换的模型。在20世纪80年代,由David Harel首次提出并应用于复杂系统的建模。随后在20世纪90...
总结来说,SimpleHSM库为STM32开发者提供了一种简洁、易于理解的状态机实现方式,降低了嵌入式系统设计的复杂度,提升了软件质量。通过深入学习和使用这个库,开发者可以更好地理解和应用状态机设计模式,从而优化...
UML状态机图,全称为统一建模语言状态机图,是用来描述系统状态变化的图示方法。...在设计软件时,通过构建这种状态机图,开发人员可以更好地理解和实现系统的动态行为,从而提高系统的稳定性和可靠性。
本教程将深入探讨如何使用Godot4中的动画状态机——AnimationTree来创建复杂的2D游戏动画。 AnimationTree是Godot引擎中一个强大的工具,它允许开发者构建复杂的行为和动画系统,通过定义不同的状态和转换条件,...
#### 五、案例分析:使用状态机实现计算器 ##### 1. 传统的事件动作范型实现计算器 传统的事件动作范型实现计算器时,通常会遇到如下问题: - **复杂的判断表达式**:例如,在处理运算符输入时,需要通过一系列的...
总的来说,"Verilog HDL那些事代码——永远的流水灯"项目提供了一个很好的学习平台,让我们能够运用Verilog HDL语言来设计和理解数字系统,特别是状态机和时序逻辑的概念。通过实践这个项目,我们可以提升自己的硬件...
- 实现案例:在C语言中可以通过状态机的方式来实现状态模式,即定义一系列的状态变量和转移函数。 4. **Observer模式**:定义了对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象...