面向对象的洗礼:设计模式(十八)之备忘录模式
备忘录模式,顾名思义,记录某种数据,在需要的时候释放出来。在游戏中,存档,读档就是备忘录模式。被Boss打死后复活,数据回复到打Boss之前,也是设计模式中的备忘录模式。在但是在游戏中,角色类的功能不能带有存储旧状态数据和恢复旧状态数据的方法。把存储和读取的细节封装到一个新类中。职责分离。每个类超过一个功能,就需要考虑拆分了。这也是单一原则的体现。
备忘录模式,顾名思义,记录某种数据,在需要的时候释放出来。在游戏中,存档,读档就是备忘录模式。被Boss打死后复活,数据回复到打Boss之前,也是设计模式中的备忘录模式。在但是在游戏中,角色类的功能不能带有存储旧状态数据和恢复旧状态数据的方法。把存储和读取的细节封装到一个新类中。职责分离。每个类超过一个功能,就需要考虑拆分了。这也是单一原则的体现。
备忘录模式:在不破坏封装的前提下,捕获一个对象的内部属性数据,将这个状态保存在另一个类中,以便以后的恢复数据需求。
场景:EA知名游戏模拟人生The Sims,存档和读档。以PHP为代码环境来模拟场景。
[code]
<?php
//管理‘档案器的类’的类
class Archives{
private $memento;
public function get(){
return $this->memento;
}
public function set($mementoObj){
return $this->memento = $mementoObj;
}
}
class Memento{
private $mementoData;
public function __construct($data){
$this->mementoData = $data;
}
public function get(){
return $this->mementoData;
}
}
class GameRole{
private $money;
private $name;
public function setMoney($money){
$this->money = $money;
}
public function setName($name){
$this->name = $name;
}
public function getMoney(){
return $this->money;
}
public function getName(){
return $this->name;
}
public function setMemento(){
$data['money'] = $this->money;
$data['name'] = $this->name;
return new Memento($data);
}
public function getMemento($mementoObj){
$mementoData = $mementoObj->get();;
$this->money = $mementoData['money'];
$this->name = $mementoData['name'];
}
public function display(){
echo '玩家' . $this->name . '家有家庭资产' . $this->money . '元<br>';
}
}
//客户端/接口
//游戏开始,小明家有100元
$playObj = new GameRole();
$playObj->setName('小明');
$playObj->setMoney(100);
$playObj->display();
//存档
$archivesObj = new Archives();
$archivesObj->set($playObj->setMemento());
//小明家做生意亏损了90元
$playObj->setMoney(10);
$playObj->display();
//读档
$playObj->getMemento($archivesObj->get());
$playObj->display();
[/code]
优点:彻底封装了存档和读档的细节实现,完全不对外公开。备忘录类只有玩家类能够操作。对客户端和顶层外网接口完全细节封装和数据封闭。
点击:2140
点赞:8
点踩:10