forked from 734380794/design-patterns
-
Notifications
You must be signed in to change notification settings - Fork 0
/
08-备忘录模式.php
117 lines (102 loc) · 2.42 KB
/
08-备忘录模式.php
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<?php
declare(strict_types=1);
/*
* This file is modified from `xiaohuangniu/26`.
*
* @see https://github.com/xiaohuangniu/26
*/
header('Content-type: text/html; charset=utf-8');
/**
* 角色状态存储器.
*/
class RoleStateMemento
{
public $Life_Value; // 生命力
/**
* 构造方法存储角色状态
* @param mixed $Life
*/
public function __construct($Life)
{
$this->Life_Value = $Life;
}
}
/**
* 角色编辑器.
*/
class GameRole
{
public $LifeValue; // 生命力
/**
* 构造方法,初始化状态
*/
public function __construct()
{
$this->LifeValue = 100;
}
/**
* 保存状态 - 将最新状态保存到状态存储器中.
*/
public function Save()
{
return new RoleStateMemento(
$this->LifeValue
);
}
/**
* 恢复状态 - 从状态存储器中读取状态
* @param mixed $_memento
*/
public function Recovery($_memento)
{
$this->LifeValue = $_memento->Life_Value;
}
/**
* 被攻击.
*/
public function Display()
{
$this->LifeValue -= 10; // 每次被攻击减少10点生命值
}
/**
* 打印生命值
*/
public function Dump()
{
echo '当然角色状态:'.PHP_EOL;
if ($this->LifeValue <= 0) {
echo '你已经挂了!'.PHP_EOL;
} else {
echo "生命值:{$this->LifeValue}".PHP_EOL;
}
}
}
//游戏角色状态管理者类
class RoleStateManager
{
public $Memento;
}
// 先创建一个角色
$Role = new GameRole();
// RPG游戏中经常出现,打BOSS前怕死先存档,肯定是玩家才有权力去存档
$RoleMan = new RoleStateManager();
$RoleMan->Memento = $Role->Save();
// 开始打BOSS了
$num = 1; // 记录回合数
for ($i = 0; $i < 10; ++$i) {
echo "-------------第{$num}回合------------".PHP_EOL;
$Role->Display();
$Role->Dump();
++$num;
// 在第5个回合的时候老妈杀来了,你经常会在战斗中存档一次,防止老妈拉电闸
if ($num == 6) {
$RoleMan2 = new RoleStateManager();
$RoleMan2->Memento = $Role->Save();
}
}
// 恢复存档:地狱模式打不过,还好他妈存档了!
$Role->Recovery($RoleMan->Memento);
$Role->Dump();
// 咦,好像之前被老妈拉电闸有存档,恢复看下!
$Role->Recovery($RoleMan2->Memento);
$Role->Dump();