前面写了一片文章:状态模式(state)http://bestupon.iteye.com/blog/692913。各位JE好友提出了很多宝贵的意见和建议。尤其是“抛出异常的爱”。
关于红绿灯等状态之间的转换我的写法是:
package org.bestupon.dp.state.refactor;
/**
*
* @author BestUpon
* @email bestupon@foxmail.com
* @date 2010-6-15下午05:21:15
* @ask
* @answer
*/
public abstract class Light implements LightState {
@Override
public abstract void change(TrafficLight light, LightState nextState);
protected void sleep(int second) {
try {
Thread.sleep(second);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在重新改写之后客户端调用如下:
class Client {
public static void main(String[] args) {
TrafficLight trafficLight = new TrafficLight();
LightState states[] = StateHolder.getStates();
int index = 0;
while (index != states.length) {
trafficLight.change(trafficLight, states[index]);
// trafficLight.change(trafficLight, states[index%2]);//取出下标为index mod 2 的那个状态
// trafficLight.change(trafficLight, new YellowLight());// 每次重新创建一个对象
// trafficLight.change(trafficLight,index == states.length - 1 ? states[0] : states[index + 1]);//取出下一个数组元素做状态
index++;
if (index == states.length)
index = 0;
}
}
}
可以方便的更改下一个状态是怎么样的!
对于老抛提出了如下写法:
enum Light{
红灯(1000),黄灯(5000),绿灯(5000); //顺序调整.
int sleepping;
private Light(int x) {
this.sleepping = x ;
}
public Light change(){
System.out.println(name());
sleep();
return next();
}
public Light next(){
return values()[((ordinal()+1)%(values().length))];
}
public static void main(String[] args) {
Light light = Light.红灯;
while(true){
light = light.change();
}
}
private void sleep() {
try {
Thread.sleep(this.sleepping);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
还有其他好友给出的代码,都让我前面写的: index == states.length - 1 ? states[0] : states[index + 1] 取出下一个元素的一种情况给误导了,
大家都认为是遍历数组就可以了!
对于“iaimstar”JEer,说的:
可能这也是比较正统的状态模式的实现,但是实际上,枚举和lz的状态模式都有些问题
状态模式最大的特点是能在运行期间动态的改变行为,而作为状态的对象则不依赖于其他对象而独立变化。
枚举的问题很明显,增加修改状态都很麻烦,而将状态切分成不同的类可以更灵活的添加和修改状态。
lz的状态模式我则觉得有些问题,状态模式的好处正是状态对象本身可以通过context独立转换,比如,当红灯结束的时候绿灯亮起,状态的迁移由状态本身来完成。
而lz的状态模式更像是chain,通过预先定义好下一个chain(state)在执行已有的状态迁移逻辑,个人觉得并不能算是动态的改变行为,反而有点画蛇添足,而且也没有state本身来指定nextstate来的灵活。
个人认为:
客户端传递给的nexeState,虽然每次要指定给context,下一个状态是什么,这也利用了状态模式运行期间依靠动态的改变自身的状态,来决定自己的行为的特性。像“iaimstar”给出的应该是定向线路的话,个人觉得,指定next更像是随机线路,如果说一个是直线的话,那么另一个将是点集。或者其他,但是没有影响对象的行为,应为行为和状态是绑定在一起的,状态改变的话,行为必然是会变!
或许我的理解还有很大的问题!还望各位JEer指正!
分享到:
相关推荐
在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。
设计模式C++学习之状态模式(State)
C#面向对象设计模式纵横谈(22):(行为型模式) State 状态模式
状态模式(State) 用意:允许一个对象当状态改变时,改变其行为。
2009-03-10模式State:一个事件(消息)引起环境或数据的变化,可能导致状态变化,于是处理流程改变,这里的状态是把处理流程分成了很多阶段,通过状态机来根据传来的事件(消息)引发状态转换,管理状态属性和状态行为,...
状态模式-State Pattern状态模式-State Pattern【学习难度:,使用频率:】状态模式-State Pattern处理对象的多种状态及其相互
State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了. 不只是根据状态,也有根据属性.如果...
NULL 博文链接:https://wy649898543.iteye.com/blog/1434590
matlab中状态机 stateflow的详细使用方法。matlab中状态机 stateflow的详细使用方法。matlab中状态机 stateflow的详细使用方法
Head First 设计模式 (十) 状态模式(State pattern) C++实现
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
管理订单状态,该上状态机吗?轻量级状态机COLA StateMachine保姆级入门教程.doc
NULL 博文链接:https://dingran.iteye.com/blog/1910161
C#面向对象设计模式纵横谈(22):(行为型模式) State 状态模式 C#面向对象设计模式纵横谈(23):(行为型模式) Strategy 策略模式 C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式 C#面向对象设计...
C++设计模式课件18_State_状态模式.pdf
state模式 state模式
http://blog.csdn.net/feiyinzilgd/archive/2011/04/05/6302717.aspx (C++ State 设计模式博客)演示源代码。用C++实现并较详细的讲述了Sate模式的意图和工作状态。
State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的处理操作的问题,而这样的问题,大部分人是采用switch-case语句进行处理的,这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对...
状态state模式是GOF23种模式中的一种,和命令模式一样,也是一种行为模式。状态模式和命令模式相当像,一样是“接口—实现类”这种模式的应用,是面向接口编程原则的体现。 状态模式属于对象创建型模式,其意图是...