备忘录模式——论微信撤回

玩过大型单机游戏的都知道,通常我们在打大boss的时候会先保存,万一失败了就可以重新读取进度返回打boss前的状态,这种模式和数据库中的事务回滚也挺类似的,当sql语句执行失败时也会回滚到执行语句前的状态。既然能回滚到之前的状态,证明我们肯定是有对之前的状态进行存储,其实这就相当于写了备忘录,忘了的时候只需要看一下备忘录,又可以提取出信息。基于这个,我们今天来用备忘录模式来模仿一下微信撤回。
首先我们需要定义一个发起者,也就是需要恢复状态功能的对象。
在这个例子中我们先来定义一个聊天窗口类:

class window{
   //窗口中的聊天消息
    public $chatRecord=array();
    //备忘录对象
    private $memoire;
    //管理者对象
    private $manager;
    public function __construct()
    {
        $this->manager=new Manager();
        $this->memoire=$this->manager->createMemoire($this->chatRecord);
    }
    //每次发送或接收消息前将之前的记录进行保存
    public function addMessage($message){
        $this->memoire->setRecords($this->chatRecord);
        $this->chatRecord[]=$message;
    }
    public function showMessage(){
        echo "最新窗口显示:<br>";
        foreach($this->chatRecord as $id=>$message){
                $id=$id+1;
           echo "第{$id}条信息:{$message}<br>";
        }
    }
    public function recall(){
        echo "已经撤回了一条消息<br>";
        //将当前记录改为之前保存的记录
        $this->chatRecord=$this->manager->getMemoireData();
    }
}

备忘录类,保存消息

class memoire{
    public $records;
    public function __construct($record)
    {
        $this->records=$record;
    }
    public function setRecords($record){
        $this->records=$record;
    }
}

管理者类,提供对备忘录生成和访问方法,限制对备忘录进行修改

class Manager
{
    private $memoire;
    public function createMemoire($record){
        $this->memoire=new memoire($record);
        return $this->memoire;
    }
    //返回备忘录数据
    public function getMemoireData(){
        return $this->memoire->records;
    }
}

好了,来看看效果吧~~

//打开一个和美眉的聊天窗口
$win=new window();
//约美眉出来吃饭
$win->addMessage('晚上一起出去要不要');
//美眉拒绝
$win->addMessage('不要');
$win->showMessage();
//美眉仔细想了一下,觉得不好意思拒绝,于是撤回
$win->recall();
$win->showMessage();
//美眉接收请求
$win->addMessage('要');
$win->showMessage();

打印出来的信息如下:
图片显示出错

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值