当前位置: 首页 > 后端技术 > PHP

纪念品(Memento)代码示例PHP设计模式大全(24)

时间:2023-03-30 02:48:20 PHP

目的提供恢复到之前状态(使用回滚)或获取对象内部状态的能力。Memento模式使用3个类实现:Originator、Caretaker和Memento。Memento-负责存储Originator的唯一内部状态,它可以包含:字符串、数字、数组、类的实例等。Memento是“不是公共类”(没有人应该也不能改变它),并且防止Originator以外的对象访问它。它提供了2个接口:Caretaker只能看到memento的窄界面,他只能将memento传递给其他对象。Originator看到了备忘录的广泛界面,允许它访问返回到先前状态所需的所有数据。Originator——负责创建Memento并记录外部对象的当前状态,并可以使用Memento恢复内部状态。Originator可以根据需要决定OriginatorMemento存储的内部状态。始创者可能(不应该)有自己的方法(methods)。但是,它们不能更改已保存对象的当前状态。Caretaker-负责保存Memento。它可以修改一个对象;确定Originator中对象的当前状态;从Originator获取对象的当前状态;或者回滚Originator中对象的状态。实例保存前,在ORMModel中控制状态,将这个随机数存入计时机发送随机UML图★官方PHP进阶学习交流社区“点击”管理整理部分资料,进阶知识系统BAT等一线大厂的准备(相关学习资料和笔试面试题)且不限于:分布式架构、高扩展、高性能、高并发、服务器性能调优、TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等知识点高级进阶干货代码Memento.phpstate=$stateToSave;}/***@returnState*/publicfunctiongetState(){return$this->state;}}State.phpstate=$state;}privatestaticfunctionensureIsValidState(string$state){if(!in_array($state,self::$validStates)){thrownew\InvalidArgumentException('给定的无效状态');}}publicfunction__toString():string{return$this->state;}}Ticket.phpcurrentState=newState(State::STATE_CREATED);}publicfunctionopen(){$this->currentState=newState(State::STATE_OPENED);}公共函数分配(){$this->currentState=newState(State::STATE_ASSIGNED);}publicfunctionclose(){$this->currentState=newState(State::STATE_CLOSED);}publicfunctionsaveToMemento():Memento{returnnewMemento(clone$this->currentState);}publicfunctionrestoreFromMemento(Memento$memento){$this->currentState=$memento->getState();}publicfunctiongetState():State{return$this->currentState;}}测试Tests/MementoTest.phpopen();$openedState=$ticket->getState();$this->assertEquals(状态::状态_OPENED,(string)$ticket->getState());$memento=$ticket->saveToMemento();//分配票$ticket->assign();$this->assertEquals(State::STATE_ASSIGNED,(string)$ticket->getState());//现在恢复到打开状态,但需要验证当前状态是否已被克隆为副本$ticket->restoreFromMemento($memento);$this->assertEquals(State::STATE_OPENED,(string)$ticket->getState());$this->assertNotSame($openedState,$ticket->getState());}}PHP互联网架构师成长之路*《设计模式》终极指南PHP互联网架构师50K成长指南+行业解题大纲(持续更新中)面试10家公司,收到9份offer,2020年PHP面试题如果喜欢我的文章想交流和更多资深开发者一起学习,获取更多重大面试相关的技术咨询和指导,欢迎加群,密码:phpzh(君阳号856460874)2020年最新PHP进阶教程,全系列!如果内容不错,希望大家多多支持鼓励点赞/点赞,欢迎一起交流;另外,如果大家有什么问题,建议,可以在评论中提出你们想看的内容

最新推荐
猜你喜欢