备忘录模式,顾名思义,记录某种数据,在需要的时候释放出来。在游戏中,存档,读档就是备忘录模式。被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();

优点:彻底封装了存档和读档的细节实现,完全不对外公开。备忘录类只有玩家类能够操作。对客户端和顶层外网接口完全细节封装和数据封闭。

标签: PHP, 设计模式, 备忘录模式

添加新评论