关系生命周期
@StateMachine static interface ContractLifecycle { @StateSet static interface States { @Initial @Functions({ @Function(transition = ContractLifecycle.Transitions.Activate.class, value = Active.class), @Function(transition = ContractLifecycle.Transitions.Cancel.class, value = Canceled.class) }) static interface Draft {} @Functions({ @Function(transition = ContractLifecycle.Transitions.Expire.class, value = Expired.class), @Function(transition = ContractLifecycle.Transitions.Cancel.class, value = Canceled.class) }) static interface Active {} @End static interface Expired {} @End static interface Canceled {} } @TransitionSet static interface Transitions { static interface Activate {} static interface Expire {} static interface Cancel {} } } @LifecycleMeta(ContractLifecycle.class) public static class Contract extends ReactiveObject { public Contract() { initialState(ContractLifecycle.States.Draft.class.getSimpleName()); } @Transition public void activate() {} @Transition public void expire() {} @Transition public void cancel() {} } // /////////////////////////////////////////////////////////////////////////////// // Relational Case 1. // /////////////////////////////////////////////////////////////////////////////// @StateMachine static interface RelationalOrderLifecycleSharingValidWhile { @StateSet static interface States { @Initial @Function(transition = Transitions.Start.class, value = Started.class) @ValidWhile(on = { ContractLifecycle.States.Active.class }, relation = Relations.Contract.class) static interface Created {} @CompositeState @Function(transition = Transitions.Cancel.class, value = Canceled.class) static interface Started { @StateSet static interface SubStates { @Initial @Function(transition = RelationalOrderLifecycleSharingValidWhile.States.Started.SubTransitions.DoProduce.class, value = Producing.class) @ValidWhile(on = { ContractLifecycle.States.Active.class }, relation = RelationalOrderLifecycleSharingValidWhile.Relations.Contract.class) static interface OrderCreated {} @Function(transition = RelationalOrderLifecycleSharingValidWhile.States.Started.SubTransitions.DoDeliver.class, value = Delivering.class) @ValidWhile(on = { ContractLifecycle.States.Active.class }, relation = RelationalOrderLifecycleSharingValidWhile.Relations.Contract.class) static interface Producing {} @Function(transition = RelationalOrderLifecycleSharingValidWhile.States.Started.SubTransitions.ConfirmComplete.class, value = Done.class) @ValidWhile(on = { ContractLifecycle.States.Active.class }, relation = RelationalOrderLifecycleSharingValidWhile.Relations.Contract.class) static interface Delivering {} @End @ShortCut(RelationalOrderLifecycleSharingValidWhile.States.Finished.class) // Ignoring : @ValidWhile(on = { // ContractLifecycle.States.Active.class }, relation = // Relations.Contract.class) static interface Done {} } @TransitionSet static interface SubTransitions { static interface DoProduce {} static interface DoDeliver {} static interface ConfirmComplete {} } } @End static interface Finished {} @End static interface Canceled {} } @TransitionSet static interface Transitions { static interface Start {} static interface Cancel {} } @RelationSet static interface Relations { @RelateTo(ContractLifecycle.class) static interface Contract {} } } @LifecycleMeta(RelationalOrderLifecycleSharingValidWhile.class) public static class ProductOrderSharingValidWhile extends ProductBase { private Contract contract; public ProductOrderSharingValidWhile(Contract contract) { this.contract = contract; initialState(RelationalOrderLifecycleSharingValidWhile.States.Created.class.getSimpleName()); } @Relation(RelationalOrderLifecycleSharingValidWhile.Relations.Contract.class) public Contract getContract() { return this.contract; } @Transition public void start() {} @Transition public void cancel() {} @Transition public void doProduce() {} @Transition public void doDeliver() {} @Transition public void confirmComplete() {} }
@Test public void test_relational_composite_state_machine_sharing_with_composite_state() { final Contract contract = new Contract(); // Outer Initial State assertState(ContractLifecycle.States.Draft.class, contract); contract.activate(); assertState(ContractLifecycle.States.Active.class, contract); final ProductOrderSharingValidWhile product = new ProductOrderSharingValidWhile(contract); // Outer State + Outer Transition => Composite State => Composite // Initial State { // Outer Initial State assertState(RelationalOrderLifecycleSharingValidWhile.States.Created.class, product); // Outer Transition product.start(); assertState(RelationalOrderLifecycleSharingValidWhile.States.Started.SubStates.OrderCreated.class, product); } { // Composite State + Composite Transition => Composite State product.doProduce(); assertState(RelationalOrderLifecycleSharingValidWhile.States.Started.SubStates.Producing.class, product); product.doDeliver(); assertState(RelationalOrderLifecycleSharingValidWhile.States.Started.SubStates.Delivering.class, product); } { // Composite State + Composite Transition => Composite Final State // => Outer State product.confirmComplete(); assertState(RelationalOrderLifecycleSharingValidWhile.States.Finished.class, product); } }
@Test(expected = LifecycleException.class) public void test_relational_standalone_composite_invalid_state_sharing_from_owning_valid_while() { final Contract contract = new Contract(); assertState(ContractLifecycle.States.Draft.class, contract); final ProductOrderSharingValidWhile order = new ProductOrderSharingValidWhile(contract); try { order.start(); } catch (LifecycleException e) { assertInvalidStateErrorByValidWhile(e, contract, order, ContractLifecycle.States.Active.class); } contract.activate(); assertState(ContractLifecycle.States.Active.class, contract); order.start(); assertState(RelationalOrderLifecycleSharingValidWhile.States.Started.SubStates.OrderCreated.class, order); contract.cancel(); assertState(ContractLifecycle.States.Canceled.class, contract); try { order.doProduce(); } catch (LifecycleException e) { assertInvalidStateErrorByValidWhile(e, contract, order, ContractLifecycle.States.Active.class); throw e; } }
相关推荐
近期,我深入研究了一个名为“生命周期组件框架——关系型状态机服务”的框架,其旨在简化这一过程,并通过关系型状态机来管理组件的生命周期。接下来,我将详细介绍这个框架的核心概念、源码实现以及其作为工具的...
在嵌入式软件开发领域中,层次状态机(Hierarchy State Machine, HSM)因其能够直观、简洁地描述嵌入式软件系统而备受青睐。本文旨在详细介绍层次状态机的基本概念及其在嵌入式软件开发中的应用,并探讨如何设计和...
状态机是一种重要的软件设计模式,它用于描述对象在其生命周期中可能经历的各种状态以及在不同条件下的状态转换。在这个场景中,"Coke Machine State Machine" 指的是一个自动售货机的状态机模型,用于模拟自动售货...
1. **组合逻辑状态机(Combinational State Machine)**:状态转换逻辑完全在组合逻辑中实现,适用于小型、简单状态机。优点是时序路径短,响应速度快;缺点是不易于时序分析和综合优化。 2. **同步寄存器状态机...
在组合关系中,整体与部分是不可分离的,整体的生命周期结束就意味着部分的生命周期也结束。例如,大脑(Brain类)与人(Human类)之间的关系,没有大脑的人是无法生存的。组合关系在代码中的表现形式与关联和聚合...
状态图(State Diagram)描述对象在其生命周期内的行为变化;活动图(Activity Diagram)用于展现流程和决策;组件图(Component Diagram)和部署图(Deployment Diagram)则关注系统的物理结构。 3. **UML符号和...
### UML类图关系详解 #### 一、引言 UML(Unified Modeling Language,统一建模语言)是一种广泛应用于软件工程领域的图形化语言,它帮助开发者理解和设计系统。其中,UML类图是最常用的一种图示方式,用于描述系统...
在现代软件工程实践中,软件开发生命周期(SDLC)和统一建模语言(UML)是构建高质量软件不可或缺的两个组成部分。SDLC定义了软件从概念到部署的整个过程,而UML则提供了一套标准化的建模工具,以图形化的方式帮助...
状态图是UML中的一种图形化表示方法,用于描述一个系统或对象在其生命周期中的动态行为,特别是状态变化的过程。状态图主要关注的是系统的状态及其如何响应外部事件来改变自身状态。 - **状态图元素**:状态图主要...
5. **生命周期管理**:配置图还可以表示组件的启动、停止、升级等生命周期活动。 ### 三、StartUML工具 StartUML是一款免费的UML建模工具,支持绘制各种UML图表,包括组件图和配置图。它提供了用户友好的界面和...
本资料包“State-machine-design-techniques.zip”包含了关于状态机设计的详细英文介绍,特别是如何编写状态机和使用CASE(计算机辅助软件工程)工具进行设计。 状态机可以分为两类:有限状态机(FSM)和Mealy或...
状态图表示一个对象在其生命周期中的各种状态以及事件触发状态转移的方式。它有助于理解对象的行为模式。 **6. 活动图(Activity Diagram)** 活动图是一种流程图,用来描述系统的动态行为,尤其是处理过程中的控制流...
状态图是 UML 中的一种重要建模工具,用于描述对象在生命周期中的状态变化和转换过程。本教程主要介绍状态图的基本概念、建模方法和应用场景。 事件(Event) 事件是指对一个在时间和空间上占据一定位置的有意义的...
5. **状态图**:状态图描述了一个对象在其生命周期中可能经历的状态及其转换。每个状态代表对象的一个条件,而转换则描述了如何从一个状态过渡到另一个状态。 6. **活动图**:活动图类似于流程图,用于描述系统中的...
状态图用于捕获对象、子系统和系统的生命周期。状态图可以告知一个对象可以拥有的状态,并且事件(如小溪的接收、时间的流逝、错误、条件变为真等)会怎么随着时间的推移来影响这些状态。 6. 顺序图(Sequence ...
《软件开发生命周期与统一建模语言UML详解》 软件开发生命周期(Software Development Life Cycle,SDLC)是软件工程领域中一个重要的概念,它为软件项目的规划、设计、实施、测试和维护等阶段提供了指导框架。SDLC...
- **状态机图(State Machine Diagram)**:也称为状态图或状态转换图,展示了对象在其生命周期内的各种状态及这些状态之间的转移。 - **活动图(Activity Diagram)**:用于展示工作流中的活动步骤及控制流,常用于业务...
2. **组件隔离**:每个组件都有自己的独立Gradle项目,通过配置build.gradle文件来控制组件的依赖关系。 3. **实现组件间通信**:利用Android插件和反射技术,实现组件之间的动态加载和调用。例如,使用DexElement...
12. **日志工具**:如Logcat的增强版,帮助开发者调试和记录应用行为。 在"ChaoJar-Demo"这个子文件中,你可能找到这些组件的示例代码,包括如何集成、配置和使用。通过研究这些示例,你可以更深入地理解每个组件的...
状态图可以用来描述对象的生命周期。 5. 活动图:UML 中的活动图用于描述对象的活动和活动之间的转换规则。活动图可以用来描述对象的行为。 6. 顺序图:UML 中的顺序图用于描述对象之间的交互和交互的顺序。顺序图...