面向对象的洗礼:设计模式(十八)之备忘录模式
备忘录模式,顾名思义,记录某种数据,在需要的时候释放出来。在游戏中,存档,读档就是备忘录模式。被Boss打死后复活,数据回复到打Boss之前,也是设计模式中的备忘录模式。在但是在游戏中,角色类的功能不能带有存储旧状态数据和恢复旧状态数据的方法。把存储和读取的细节封装到一个新类中。职责分离。每个类超过一个功能,就需要考虑拆分了。这也是单一原则的体现。
备忘录模式:在不破坏封装的前提下,捕获一个对象的内部属性数据,将这个状态保存在另一个类中,以便以后的恢复数据需求。
场景:EA知名游戏模拟人生The Sims,存档和读档。以PHP为代码环境来模拟场景。
<?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();
优点:彻底封装了存档和读档的细节实现,完全不对外公开。备忘录类只有玩家类能够操作。对客户端和顶层外网接口完全细节封装和数据封闭。