基于状态模式的应用研究

时间:2022-10-08 09:25:36

基于状态模式的应用研究

摘要:以降低复杂度,增强可扩张性为目标,建立基于传送装置的入口模型,体现出状态模式的优越性,最终通过采用该模式解决了某大型钢铁企业传送装置入口的建模问题。

关键词:设计模式;状态模式;软件复用

文献标识码:A 中图分类号:TP311 文章编号:1009-3044(2009)15-3919-02

Application Research and Analysis Based on the State Pattern

HE Jian1, XIAO Zhuo-yu2

(1.The Maternal and Child Health Hospital of Hunan Province, ChangSha 410008, China; 2.New College of Central South University of Forestry and Technology, Changsha 410004, China)

Abstract: This paper sets up a model base on entrance of the equipment get increase expanding, cut down the complexity early or late. At the same time get the advantage of the State Pattern .Finally we settle the entrance of the equipment modeling problem by state pattern.

Key words: design pattern; state pattern; reusable software

1 引言

设计面向对象的软件比较困难,而设计可复用面向对象的软件就更加困难。你必须找到相关的对象,以适当的粒度将他们归类,再定义类的接口和继承层次,建立对象之间的基本关系,为此提出设计模式这个概念[1]。设计模式简化了软件的设计和过程的实现,使软件系统的基础架构更加清晰,因此在诸多大型软件系统的设计过程中,设计模式都成为重要的辅助手段。文章以某大型钢铁企业热匝薄板管理系统的传送装置的入口为背景,比较了两种设计模式(第一种设计模式是该钢铁企业在90年代初实施863计划信息化带动工业化所用的老CIMS系统,第二种模式是我方基于状态模式开发的新系统),并通过研究比较,体现出以降低复杂度,增强可扩张性为目的的状态模式在处理旋转传送装置入口问题的优越性。

2 设计模式

设计模式首先由Erich Gamma, Richard Helm等几位模式设计先行者引入到软件设计领域。一个设计模式的命名,抽象确定了一个通用设计结构的主要方面,这些设计结构能被用来构造可复用的面向对象设计[2-3],并且每一个设计模式都集中在一个面向对象的设计问题或设计要点。

3 状态模式(State Pattern)模型

状态模式的用意是允许一个对象在其内部状态改变时改变它的行为[3]。如图1所示,我们考虑一个Context类,Context对象处于若干不同状态之一如:ConcreteStateA, ConcreteStateB等, 当一个Context对象收到其他对象请求后,它根据自身的当前状态作出不同的反应, 这个模式的关键思想在于引入的操作状态的子类提供了一个公共接口。Context类将所有与状态相关的请求委托给这个状态对象。Context使用它的State子类实例来执行特定的操作,一旦状态改变Context对象就会改变它所使用的状态对象[1,3]。

4 热匝薄板管理系统的入口背景研究

现以某钢铁企业一台旋转传送装置的入口状态进行建模。一台旋转传送装置是一个大型的旋转托架,这是一台大型的智能设备,它可以通过一个入口接受原材料,并根据标记在原材料上的条码ID将其进行分类存储。传送装置的入口用一个按钮进行操作控制,如果入口处于关闭状态,那么按下这个按钮可以将入口打开,如在入口完全开启前,我们再次触动这个按钮则入口关闭。如该入口完全开启状态超过2秒,则因超时而关闭。我们可以在入口开启时,再次按下按钮从而可以避免入口因为发生超时而关闭[4]。如图2说明了该传送装置入口的状态以及状态迁移关系。

5 基于状态模式的入口建模

如图3所示,我们为传送装置入口的每个状态创建了一个对应的类。每个状态类包括了一个Touch()方法,这个方法定义了当入口处于某个状态时,操作人员触动按钮之后,系统执行的代码逻辑。在新的设计中我们没有改变Door2对象的角色,我们仍然使用Door2对象中的_state对象,并且让多态发挥了非常重要的作用。Touch(),Complete(),Timeout()以及Status()方法都应用了多态,每个方法都表示一类迁移。虽然客户调用了相同的操作,但是接收者类(即状态类)可能不同。其多态规则要求当调用一个方法时,实际执行的方法不仅取决于操作的特征标记,同时还取决于操作的接收者类。思路如下:

Private DoorState _state;

Public class Door2

{

// 变量和构造函数

Public void Touch()//取得抽象Touch()方法

Public void Complete() //取得抽象Complete()方法

Public void Timeout() //取得抽象Timeout()方法

Public string Status() //取得抽象Status()方法

Public void SetStatus(DoorState state)

//表示入口状态改变的方法

}

由于DoorOpening,DoorOpen, DoorClosed,以及DoorClosing, DoorStayOpen的实现方式相似,在此我们仅以DoorOpen子类为例进行详细说明。如图3所示,其中DoorState是一个抽象类,且DoorOpen是DoorState子类 ,那么我们必须通过子类DoorOpen对父类DoorState的方法进行覆盖。思路如下:

Public class DoorOpen: DoorState

{

Public DoorOpen(Door2 door):base(door)

{

Public override void Touch()

{

…… //仅在DoorOpen状态触发

Touch()方法后的状态改变

}

Public override void Timeout()

{

{

…… //仅在DoorOpen状态触发

Timeout()方法后的状态改变

}

}

}

由此可见通过状态模式将所有与一个特定的状态相关的行为都放入一个对象中。因为所有与状态相关的代码都存在于一个状态子类中,所以通过定义新的子类可以很容易的增加新的状态和转换。

6 结束语

实践说明通过使用状态模式可以将状态相关行为局部化,并且通过将不同的状态分割开来,从而使得所有与状态相关的代码存在于某一个状态子类中,所以通过定义新的子类可以很容易的增加新的状态和转换,从而满足业务发展的需要。设计模式的产生,使软件设计人员可以借鉴他人的成功经验找到软件架构设计的解决方案,所以对于设计模式的理解和运用需要我们在实践中不断的摸索与总结[5]。

参考文献:

[1] 何成万,何克清.基于角色的设计模式建模和实现[J].软件学报,2006(4).

[2] 李烨,赵曦滨,李晖.设计模式在邮政保险系统中的研究与应用[J].计算机工程,2006(2).

[3] Gamma E, Helm R.Design Pattern[M].北京:机械工业出版社,2000:200-212.

[4] Jose H.Antonio SAP R/3 Administrator's[M].Handbook McGraw-Hill Osborne Media,1999.

[5] 曾志明,朱江.设计模式在可复用GIS软件开发中的应用[J].计算机工程,2006(4).

上一篇:森林防火辅助决策系统设计研究 下一篇:基于Struts+Spring+Hibernate框架的LIMS的设计...