设计模式中的状态模式相对比较简单,简单的说就是对某个对象的状态进行管理.对象的状态如果的多的话,假如没有对其进行管理,极易造成管理混乱。从而使系统难以维护,所以State模式的意图就是将与状态有关的处理逻辑分散到代表对象状态的各个类中。这样的模式应用在用于多状态的系统中,如游戏开发者就经常用到这种状态模式。
下面举出一个小小的例子来说明这样的一个问题:
如游戏玩家从开始进行游戏到玩某个游戏时,这里面发生了多种状态的变化,同时也改变了一些隐藏的游戏状态。我们设计如下代码:
public abstract class Player {
//玩家当前的游戏状态
public int state;
//玩家的其他状态1
public int otherState1;
//玩家的其他状态2
public int otherState2;
public void init() {
}
public void play() {
}
public void resume() {
}
public void reset() {
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public int getOtherState2() {
return otherState2;
}
public void setOtherState2(int otherState2) {
this.otherState2 = otherState2;
}
public int getOtherState1() {
return otherState1;
}
public void setOtherState1(int otherState1) {
this.otherState1 = otherState1;
}
}
面对如此多的玩家状态,我们建立一个PlayerManager来管理玩家的各种状态的变化.同时对于玩家的各种方法进行执行详细的状态变化,从而使玩家Player这个类能够简单明了
public abstract class PlayerManager {
public static final int STATE1 = 1 << 1;
public static final int STATE2 = 1 << 2;
public static final int STATE3 = 1 << 3;
public static final int STATE4 = 1 << 4;
public static final int STATE5 = 1 << 5;
public static final int STATE6 = 1 << 6;
protected Player player;
public PlayerManager(Player player) {
this.player = player;
}
public void init() {
}
public void play() {
player.setState(STATE3);
player.setOtherState2(STATE6);
player.play();
}
public void resume() {
player.setState(STATE3);
player.setOtherState1(STATE6);
player.resume();
}
public void reset() {
}
}
如果是对于比如说是QQPlayer,我们就再建立一个QQPlayerManager再行具体化。
小结:
一般来说,一个对象中各个实例变量的值决定了这个对象的当前状态。在某些情况下,对象的大多数属性一旦设置就不会发生变化;一个属性是动态变化的,并在类的算法逻辑中发挥重要作用。这个属性也许代表整个对象的状态,甚至是命名的state.
在现实生活中有些实体的状态非常关键,诸如事务或者机器,当使用对象这个实体建模时,经常会出现一个极其重要的状态变量。在这种情况下,依赖对象状态的处理逻辑也许会出现在很多方法中。通过学习把状态相关行为迁移到状态对象层次,就可以简化代码。这使得每个状态类都包含应用领域中一个状态的行为。这样一来,状态类便可以直接对应到状态机的状态。
为处理状态之间的转移,可以让中心对象保留对状态集的引用。或者,在状态迁移调用中,可以传递状态正在改变的中心对象。也可以让状态类成为信息提供者,只提示接下来的状态,而无需要新中心对象。不论怎样管理状态迁移,都可以应用State模式将对象的不同状态用一个状态类集合来表示,并将操作分散在这个状态类的集合中,从而简化我们的对象代码。
分享到:
相关推荐
NULL 博文链接:https://lgh3292.iteye.com/blog/600905
NULL 博文链接:https://teddywang.iteye.com/blog/769122
CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。它是一类重要的线性分组码,...例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑。
CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。它是一类重要的线性分组码,编码...例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑
例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑。 差错控制理论是在代数理论基础上建立起来的。这里我们着眼于介绍CRC的算法与实现,对原理只能...