首页 / 设计模式 / 设计模式——状态设计模式
设计模式——状态设计模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了设计模式——状态设计模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1759字,纯文字阅读大概需要3分钟。
内容图文
![设计模式——状态设计模式](/upload/InfoBanner/zyjiaocheng/1332/cc14fee7a73345af8e7e47de19a24403.jpg)
1 概念
? ? 状态模式又称为状态对象模式,状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类
一样。
2 状态模式的结构
? ?状态模式把所有研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。
???
? ?模式所涉及的角色有:
- ? 抽象状态(State)角色 :定义一个接口,用以封装环境(context)对象的一个特定转态所对应的行为。
- 具体状态(ConcreteState)角色 :每一个具体状态类都实现了环境的一个状态所对应的行为。
- 环境(context)角色 :定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。
? ? 在上图可以看出,环境类Context是所考察的类,而它的行为方法是委派给类型为state的一个对象的。由于State本身
是一个抽象类的接口,实际担当此任务的是具体状态类,即
ConcreteState
。上图只给出了一个具体的状态类,而实际情况中会有很多具体状态的类的。换而言之,环境类
Context
的行为
operation()
是委派给某一个具体状态类的。
? ? 通过使用多态性原则,可以动态的改变环境类Context的属性 State的内容,使其从指向一个具体状态类变换到指向另一个具体状态类,从而使环境类的行为operation()由不同的具体状态类来执行。
3 实例
Context类(环境)
:
publicclassContext{
privateState state;
publicvoid operation(){
state.operation();
}
publicvoid setState(State state){
this.state = state;
}
}
?
上面就是环境角色的源代码,可以看出,环境类持有一个State对象,并把所有的行为委派给此对象。
State接口(抽象状态)
:
publicinterfaceState{
publicvoid operation();
}
?
? ?这个接口规范所有实现此接口的子类,要求它们都实现方法operation()
concreteState(具体状态类):
publicclassConcereteStateimplementsState{
publicvoid operation(){...}
}
?
4 状态模式的效果
? ?(1) ?状态模式需要对每一个系统可能取得的状态创立一个状态类(State)的子类。当系统的状态发生变化时,系统便改变所选的子类。
所有与一个特定状态有关的行为都被包装到一个特定的对象里,使得行为的定义局部化。因为同样的原因,如果有新的状态对应的行为需要定义时,可以很方便的通过设立新的子类的方式加到系统里,不需要改动其它的类。
? ?(2) 由于每一个状态都被包装到了类里,就可以不必采用过程性的处理方式,使用大量的if-else判断语句。
? ?(3) 使用状态模式使系统状态的变化变得很明显。由于不用一些属性(内部变量)来指明系统所处的状态,因此就不用担心担心修改这些属性不当而造成的错误。
? ?(4) 状态模式的缺点是会造成大量的小的状态类,有点是使程序免于大量的条件转移语句,使程序更易于维护。
? ?(5) 系统所选的状态子类均是从一个抽象状态类或接口继承而来,java语言的特性使得在java语言中使用状态模式较为安全。多态性
则是状态模式的核心。
5 使用场景
? ?(1) 一个对象的行为依赖于它所处的状态,对象的行为必须随着其状态的改变而改变
???(2) 对象在某个方法里依赖于一重或多重的条件转移语句,其中大量的代码。状态模式把条件转移语句的每一个分支都包装到
一个单独的类里,这使得这些条件转移分支能够以类的方式独立存在和演化。维护这些独立的类也就不再影响系统的其它部分。
? ?
?
?
?
?
?
? ? ??
原文:http://1029457926.iteye.com/blog/2211804
内容总结
以上是互联网集市为您收集整理的设计模式——状态设计模式全部内容,希望文章能够帮你解决设计模式——状态设计模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。
来源:【匿名】