来自:villa123 来源:http://www.iteye.com/topic/212142
星矢:动画片《圣斗士星矢》的男猪脚,超级小强,怎么打也打不死。
雅典娜:动画片《圣斗士星矢》的女猪脚,自称女神,手下有88个男人为他卖命。
状态模式:为了方便的控制状态的变化,避免一堆IF/ELSE,以及状态规则改变的时避免代码改动的混乱。
观察者模式:一个被观察者一动,多个观察者跟着动,经常用于界面UI。
话说星矢和很强的某斗士甲对打,雅典娜在一边看,星矢总是挨揍,每次挨揍完之后星矢的状态总是会发生一些变化:
正常--挨打--瀕死--挨打--小宇宙爆发--挨打--瀕死--挨打--女神护体--挨打(星矢无敌了,打也没用,战斗结束)--正常
以上状态转变用状态模式来表现,一个Saiya类代表星矢,一个SaiyaState代表他的状态,SaiyaState下面有多个子类,分别代表星矢的多种状态,如正常NORMAL、瀕死DYING、小宇宙爆发UNIVERSE、女神护体GODDESS,即把状态抽象成对象,在每种状态里面实现被打的时候所需要更改的状态,这样就避免了每次被打都要进行一次IF/ELSE的判断。
Java代码
public class Saiya extends Observable {
//定义星矢的四种状态
public final SaiyaState NORMAL = new NormalState(this);
public final SaiyaState DYING = new DyingState(this);
public final SaiyaState GODDESS = new GoddessState(this);
public final SaiyaState UNIVERSE = new UniverseState(this);
private SaiyaState state=NORMAL;
private SaiyaState laststate=null;
public void hit(){
//调用当前状态的被打方法 反过来改变自己的状态
state.hit();
}
public String status(){
//当前状态名
return state.status();
}
protected void setState(SaiyaState state){
laststate=this.state;
this.state=state;
//观察者模式
setChanged();
notifyObservers("星矢状态变化");
}
public String getlastStatus(){
return laststate.status();
}
public class Saiya extends Observable {
//定义星矢的四种状态
public final SaiyaState NORMAL = new NormalState(this);
public final SaiyaState DYING = new DyingState(this);
public final SaiyaState GODDESS = new GoddessState(this);
public final SaiyaState UNIVERSE = new UniverseState(this);
private SaiyaState state=NORMAL;
private SaiyaState laststate=null;
public void hit(){
//调用当前状态的被打方法 反过来改变自己的状态
state.hit();
}
public String status(){
//当前状态名
return state.status();
}
protected void setState(SaiyaState state){
laststate=this.state;
this.state=state;
//观察者模式
setChanged();
notifyObservers("星矢状态变化");
}
public String getlastStatus(){
return laststate.status();
}
星矢的状态
Java代码
public abstract class SaiyaState {
protected Saiya saiya;
public SaiyaState(Saiya saiya) {
this.saiya = saiya;
}
public String status(){
String name=getClass().getName();
return name.substring(name.lastIndexOf(".")+1);
}
//星矢被打了
public abstract void hit();
}
public abstract class SaiyaState {
protected Saiya saiya;
public SaiyaState(Saiya saiya) {
this.saiya = saiya;
}
public String status(){
String name=getClass().getName();
return name.substring(name.lastIndexOf(".")+1);
}
//星矢被打了
public abstract void hit();
}
在每种状态里面实现被打的时候所需要更改的状态,例如小宇宙爆发状态下被打
Java代码
public class UniverseState extends SaiyaState {
/**
* @param saiya
*/
public UniverseState(Saiya saiya) {
super(saiya);
}
/* 小宇宙爆发状态被打进入瀕死状态
*
*/
public void hit() {
saiya.setState( saiya.DYING);
}
}
public class UniverseState extends SaiyaState {
/**
* @param saiya
*/
public UniverseState(Saiya saiya) {
super(saiya);
}
/* 小宇宙爆发状态被打进入瀕死状态
*
*/
public void hit() {
saiya.setState( saiya.DYING);
}
}
雅典娜在一边看,星矢每次被打她都要给星矢加油,她是个观察者,星矢是被观察者,这里星矢实现java.util.Observable,每次被打hit就notifyObservers,雅典娜就加油。
Java代码
public class Athena implements Observer {
/* 我是雅典娜 我是观察者
*
*/
public void update(Observable arg0, Object arg1) {
System.out.println("雅典娜说:星矢加油啊!!!");
}
}
public class Athena implements Observer {
/* 我是雅典娜 我是观察者
*
*/
public void update(Observable arg0, Object arg1) {
System.out.println("雅典娜说:星矢加油啊!!!");
}
}
总的来看 这个过程就是这样子:
Java代码
public class StateMain {
public static void main(String[] args) {
Saiya saiya = new Saiya();
Observer athena = new Athena();
saiya.addObserver(athena);
System.out.println("星矢最初的状态是:" + saiya.status());
for (int i = 0; i < 5; i++) {
System.out.println("星矢被揍了" + (i + 1) + "次");
saiya.hit();
System.out.println("星矢现在的状态是:" + saiya.status());
}
}
}
public class StateMain {
public static void main(String[] args) {
Saiya saiya = new Saiya();
Observer athena = new Athena();
saiya.addObserver(athena);
System.out.println("星矢最初的状态是:" + saiya.status());
for (int i = 0; i < 5; i++) {
System.out.println("星矢被揍了" + (i + 1) + "次");
saiya.hit();
System.out.println("星矢现在的状态是:" + saiya.status());
}
}
}
结果星矢在雅典娜的帮助下,有惊无险的战胜了很强的某斗士甲:
Java代码
星矢最初的状态是:NormalState
星矢被揍了1次
雅典娜说:星矢加油啊!!!
星矢现在的状态是:DyingState
星矢被揍了2次
雅典娜说:星矢加油啊!!!
星矢现在的状态是:UniverseState
星矢被揍了3次
雅典娜说:星矢加油啊!!!
星矢现在的状态是:DyingState
星矢被揍了4次
雅典娜说:星矢加油啊!!!
星矢现在的状态是:GoddessState
星矢被揍了5次
雅典娜说:星矢加油啊!!!
星矢现在的状态是:NormalState
星矢最初的状态是:NormalState
星矢被揍了1次
雅典娜说:星矢加油啊!!!
星矢现在的状态是:DyingState
星矢被揍了2次
雅典娜说:星矢加油啊!!!
星矢现在的状态是:UniverseState
星矢被揍了3次
雅典娜说:星矢加油啊!!!
星矢现在的状态是:DyingState
星矢被揍了4次
雅典娜说:星矢加油啊!!!
星矢现在的状态是:GoddessState
星矢被揍了5次
雅典娜说:星矢加油啊!!!
星矢现在的状态是:NormalState
总结:状态模式的缺点就是会弄出很多子类,如果状态没那么复杂,状态规则改变的可能性比较小的话就不要用了
分享到:
相关推荐
这回都有了。
完整云服务器架设
摘要:VB源码,游戏编程,VB游戏源码 圣斗士星矢——黄金十二宫(游戏+源码),是一个典型的VB游戏 源码,编写的时间比较早了,不过现在仍然可以作为VB游戏开发的参考程序,希望对你有帮助。
圣斗士天界篇花絮 圣斗士天界篇花絮 圣斗士天界篇花絮 圣斗士天界篇花絮 圣斗士天界篇花絮
图A背景的渲染图图B进行全体的颜色校正。的素材构成的。图 D 配置 FumeFX 生成的爆破和着火素材 图 E AE 来追加发光和热处理。图 F lens 处理
圣斗士网站制作,有图片。
用户应该运行saintseiya_att_sel.m 来开始格斗游戏。 用户可以随机获得一个圣人和一个敌人,并开始一对一的战斗。 每个圣人都有一个宇宙和生命(HP)属性。... 他们的中文名字是:星矢紫龙冰河瞬态一辉穆阿
只要点击相同的两张图片就可以消除,规则简单容易上手。游戏速度节奏快,画面清晰可爱,适合细心的玩家。
于是青铜圣斗士星矢决定冒死突破十二宫。 守卫十二宫的黄金圣斗士能在强大的星矢面前坚持的时间是不同的,星矢想让所有黄金圣斗士平均等待的时间最短,请问黄金圣斗士的最短平均等待时间是多少?
具有样式组件的示例应用 此示例介绍了如何使用与样式不同的样式解决方案,还支持通用样式。... 在这种情况下,我们使用 。 为此,我们扩展了并将服务器端渲染的样式注入到<head> ,并且还添加了babel-plugin-...
李炎恢DreamWeaver视频教程的素材和源码,包括个人博客,新绿环保网,特瑞科汽车网,情线洛可可,中移邮件系统,圣斗士星矢,火影忍者疾风传,专题:海贼王动漫专题
Xiuno 这个名字来源于圣斗士星矢白羊座的黄金圣斗士修罗,他的攻击速度和战斗力是十二宫最强的,他是速度和力量的化身; 在佛教里面,修罗为六道之一,英文:Shura,处于人道和天道之间的一道,半人半神,性情刚烈,...
xiuno 这个名字来源于圣斗士星矢山羊座的黄金圣斗士修罗,他的攻击速度和战斗力是十二宫最强的,他是速度和力量的化身; 在佛教里面,修罗为六道之一,英文:Shura,处于人道和天道之间的一道,半人半神,性情刚烈,...
xiuno 这个名字来源于圣斗士星矢山羊座的黄金圣斗士修罗,他的攻击速度和战斗力是十二宫最强的,他是速度和力量的化身; 在佛教里面,修罗为六道之一,英文:Shura,处于人道和天道之间的一道,半人半神,性情刚烈,...
完美国际物品生成器 打开物品生成器.这个要放在服务端的\ffpwserver\pwserver\gamed\config文件夹下面.要不读取不到信息.改好属性.
圣斗士星矢Projecto Final 在“里克和莫蒂”系列作品中获得广告的目的是,在使用多种信息的API上,您将获得更多信息。 信息 Nombre:Jhon Cesar Choque Condori Kong蒂尼多 登录和注册 市政总署登记处 Listado ...
有阿拉蕾(IQ博士)、迪士尼明星、哆啦A梦(机器猫)、格斗之王(拳皇)、灌篮高手(篮球飞人)...圣斗士星矢、加菲猫、新鲜水果、Q版花样年华、花样年华、清风车影、手机天下、超人特攻队、粉嘟嘟的蛋糕铺、青蛙军曹等...
Xiuno 这个名字来源于圣斗士星矢白羊座的黄金圣斗士修罗,他的攻击速度和战斗力是十二宫最强的,他是速度和力量的化身; 在佛教里面,修罗为六道之一,英文:Shura,处于人道和天道之间的一道,半人半神,性情刚烈,...
提出了具有最小二乘法和自适应卡尔曼滤波器的方法,用于直接根据恒星跟踪仪的测量结果估算角速率。 在这些方法中,仅需要了解矢量测量和采样间隔。 设计的自适应卡尔曼滤波器可以滤除噪声,而无需动力学模型和惯性...
3.对象中的方法 2.new 关键字可以省略 3.使用字面量方式创建 Object 4.属性字段也可以使用字符串星矢 5.使用字面量及传统复制方式 6.两种属性