状态模式
2015-12-07 15:39
232 查看
状态模式解析: 主体类下面有一个状态切换方法,专门根据指令切换状态 切换状态的本质,是把一个新的对象给主体类的一个成员属性
<?php //坦克状态的接口 interface TankState { //坦克的攻击方法 public function attack(); } //坦克普通状态 class TankState_Tank implements TankState { //坦克的攻击方法 public function attack() { //这里简单的输出当前状态 echo "普通状态"; } } //坦克架起来的状态 class TankState_Siege implements TankState { //坦克的攻击方法 public function attack() { //这里简单的输出当前状态 echo "架起来了"; } } //坦克类 class Tank { public $state;//状态 //坦克的攻击方法 public function __construct() { //新造出来的坦克当然是普通状态 $this->state = new TankState_Tank(); } //设置状态的方法,假设参数为玩家点击的键盘 public function setState($key) { //如果按了s if($key == 's') { $this->state = new TankState_Siege(); } //如果按了t elseif($key == 't') { $this->state = new TankState_Tank(); } } //坦克的攻击方法 public function attack() { //由当前状态自己来处理攻击 $this->state->attack(); } } //新造一辆坦克 $tank = new Tank(); //假设正好有个敌人路过,坦克就以普通模式攻击了 $tank->attack(); //架起坦克 $tank->setState('s'); //坦克再次攻击,这次是架起模式 $tank->attack(); //坦克回普通模式 $tank->setState('t'); //坦克再次攻击,这次是普通模式 $tank->attack(); ?>
用途总结:状态模式可以将和状态相关的行为和属性封装,除了切换状态时,其它地方就不需要大量的判断当前状态,只要调用当前状态的方法等。 实现总结:用一个接口规范状态类需要实现的方法,比如上面的TankState规定了attack()。把各个状态封装成类,将不同状态下的不同方法放入各自的状态类,比如上面的攻击方法,同时所有的状态执行接口。原来的事务类,比如上面的Tank类,只负责状态切换,一旦需要某一个方法的调用,只要交给当前状态就可以了。
相关文章推荐
- 1054. The Dominant Color (20)【水题】——PAT (Advanced Level) Practise
- 无限风光 : 近来地形算法学习小结
- Twitter架构
- CentOS 6.0如何安装配置Kamailio
- 14.15 InnoDB Backup and Recovery Innodb备份和恢复
- 中国计算机学会推荐国际学术期刊 (计算机图形学与多媒体)
- Oolong and Gnoloo
- 嵌入式C的十六个问题的中英文版
- 自定义Android progress bars
- 判别分析-GDA、QDA、KNN
- Makefile经典教程(转载)
- 正则匹配数字
- 解析request的反馈信息
- ubuntu修改capslock键,单独使用为esc,组合使用时为ctrl+
- jQuery中通过JSONP来跨域获取数据的三种方式
- Colorful Lecture Note(栈的模拟)
- 【Leetcode】Find the Duplicate Number
- UITextField的提示文字水平居中
- IIC 通讯协议
- iOS开发之检测APP升级的实现