题记
==============================================================================
本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦!

本文地址:http://www.cnblogs.com/davidhhuan/p/4248198.html
==============================================================================

星际的一些兵种会有不止一种状态,比如坦克可以架起来,机枪兵可以打兴奋剂,甚至还有一些被动的,比如被虫族女王喷洒绿色液体后,敌人的行动变慢。
如果按照一般的思路,每次我们对一个小兵进行操作的时候,比如一辆坦克,我们都要用if判断他的状态,这样代码中会有很多的if,else或者swith。
不过我们可以发现,我们需要的是他在某个状态下的行为,如果把这些行为按照状态封装起来,就可以减少大量的判断。

待解决的问题:封装坦克的状态,让状态自己去控制行为。

思路:把状态作为属性,兵种类本身只控制状态的变化,具体的行为由状态类定义。

状态(State)模式示例:

<?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();
?>

用途总结:状态模式可以将和状态相关的行为和属性封装,除了切换状态时,其它地方就不需要大量的判断当前状态,只要调用当前状态的方法等。

实现总结:用一个接口规范状态类需要实现的方法,比如上面的TankState规定了attack()。把各个状态封装成类,将不同状态下的不同方法放入各自的状态类,比如上面的攻击方法,同时所有的状态执行接口。原来的事务类,比如上面的Tank类,只负责状态切换,一旦需要某一个方法的调用,只要交给当前状态就可以了。

相关文章:

1. 星际争霸之php面向对象(一)

2. 星际争霸之php面向对象(二)

3. 星际争霸之php设计模式--简单工厂模式

4. 星际争霸之php设计模式--工厂方法模式

5. 星际争霸之php设计模式--抽象工厂模式

6. 星际争霸之php设计模式--建造器模式

7. 星际争霸之php设计模式--中介者模式

8. 星际争霸之php设计模式--享元模式

9. 星际争霸之php设计模式--代理模式

10. 星际争霸之php设计模式--原型模式

11. 星际争霸之php设计模式--备忘模式

12. 星际争霸之php设计模式--模板模式

13. 星际争霸之php设计模式--正面模式

14. 星际争霸之php设计模式--状态模式

15. 星际争霸之php设计模式--策略模式

16. 星际争霸之php设计模式--组合模式

17. 星际争霸之php设计模式--职责链模式

18. 星际争霸之php设计模式--观察者模式

19. 星际争霸之php设计模式--迭代器模式

20. 星际争霸之php设计模式--适配器模式

14. 星际争霸之php设计模式--状态模式的更多相关文章

  1. 19. 星际争霸之php设计模式--迭代器模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. 16. 星际争霸之php设计模式--组合模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. 15. 星际争霸之php设计模式--策略模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. 13. 星际争霸之php设计模式--正面模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  5. 12. 星际争霸之php设计模式--模板模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  6. 10. 星际争霸之php设计模式--原型模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  7. 9. 星际争霸之php设计模式--代理模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  8. 17. 星际争霸之php设计模式--职责链模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  9. 11. 星际争霸之php设计模式--备忘模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

随机推荐

  1. 初识GO语言——安装Go语言

    本文包括:1)安装Go语言.2)运行第一个Go语言.3)增加vim中对Go语言的高亮支持. 1.安装Go语言 本文采用源码安装Go语言,Go语言的源代码在百度网盘 http://pan.baidu.c ...

  2. C#进程操作

    C#进程操作 转:http://www.cnblogs.com/vienna/p/3560804.html 一.C#关闭word进程  foreach (System.Diagnostics.Proc ...

  3. Sumsets

    题目连接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=91209#problem/A 题意:给定一个整数几何S,找出一个最大的d,使得a ...

  4. 使用ftp软件上传下载php文件时换行丢失bug

    正 文:   在使用ftp软件上传下载php源文件时,我们偶尔会发现在本地windows下notepad++编辑器写好的php文件,在使用ftp上传到linux服务器后,php文件的换行符全部丢失了, ...

  5. sql语句的各种模糊查询

    一般模糊语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式: 1.%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况 ...

  6. Android Studio 环境部署 (转载)

    Android Studio的安装和使用过程经常需要下载以来文件和Gradle版本,而Google网站在天朝的访问可谓步履维艰,没有稳定的FQ工具是非常痛苦的.何况,作为一个优秀的程序员,不能访问国外 ...

  7. 3_STL算法

    1.常用遍历算法1.1 for_each for_each(v1.begin(),v1.end(),show); void show(int &n) //回调函数的入口地址 { cout &l ...

  8. Android课程---关于对话框的学习

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  9. poj3292-Semi-prime H-numbers(筛法打表)

    一,题意:  一个H-number是所有的模四余一的数.(x=4*k+1)  如果一个H-number是H-primes 当且仅当它的因数只有1和它本身(除1外). 一个H-number是H-semi ...

  10. JSP Standard Tag Library JSP标准标签库

    了解了基本的标签的底层实现,可以看系统定义的强大的标准标签 1.首先引入两个jar包 2.基本语法 <%@ taglib prefix="c" uri="http: ...