本文实例讲述了php设计模式之状态模式。分享给大家供大家参考,具体如下:
星际的一些兵种会有不止一种状态,比如坦克可以架起来,机枪兵可以打兴奋剂,甚至还有一些被动的,比如被虫族女王喷洒绿色液体后,敌人的行动变慢。
如果按照一般的思路,每次我们对一个小兵进行操作的时候,比如一辆坦克,我们都要用if判断他的状态,这样代码中会有很多的if,else或者swith。
不过我们可以发现,我们需要的是他在某个状态下的行为,如果把这些行为按照状态封装起来,就可以减少大量的判断。
待解决的问题:封装坦克的状态,让状态自己去控制行为。
思路:把状态作为属性,兵种类本身只控制状态的变化,具体的行为由状态类定义。
状态(State)模式示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
<?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类,只负责状态切换,一旦需要某一个方法的调用,只要交给当前状态就可以了。
希望本文所述对大家PHP程序设计有所帮助。
原文链接:https://www.cnblogs.com/davidhhuan/p/4248198.html