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

PHP设计模式的访客模式

时间:2023-03-29 22:24:57 PHP

Visitor,就像我们去别人家做客,或者别人到我们家来拜访我们一样。我们每个人就像一个实体,每一个来访的人都一一打招呼。毕竟我们中华民族是一个非常讲究礼仪和待客之道的民族。visitor是GoF的23种设计模式中最复杂的模式,也是各种设计模式教材中排在最后的模式。先不管难不难,先看看它的定义和实现。GoF类图及解释GoF定义:表示作用于对象结构中每个元素的操作。它允许您在不更改每个元素的类的情况下定义对这些元素的新操作GoF类图代码实现接口Visitor{publicfunctionVisitConcreteElementA(ConcreteElementA$a);functionVisitConcreteElementB(ConcreteElementB$b);}classConcreteVisitor1implementsVisitor{publicfunctionVisitConcreteElementA(ConcreteElementA$a){echoget_class($a).“拜访”。get_class($this)。“已访问”,PHP_EOL;)。“拜访”。get_class($this)。“已访问”,PHP_EOL;}}classConcreteVisitor2实现Visitor{publicfunctionVisitConcreteElementA(ConcreteElementA$a){echoget_class($a)。“拜访”。get_class($this)。"访问",PHP_EOL;}publicfunctionVisitConcreteElementB(ConcreteElementB$b){echoget_class($b).“经过”。get_class($this)。"访问",PHP_EOL;}}抽象访问者接口和两个实现。也算是来我们家做客的小两口吧!接口元素{publicfunctionAccept(Visitor$v);}classConcreteElementAimplementsElement{publicfunctionAccept(Visitor$v){$v->VisitConcreteElementA($this);}publicfunctionOperationA(){}}classConcreteElementBimplementsElement{publicfunctionAccept(Visitor$v){$v->VisitConcreteElementB($this);}publicfunctionOperationB(){}}元素的抽象和实现也可以看作是被访问的实体。当然是我和我老婆。类ObjectStructure{private$elements=[];publicfunctionAttach(Element$element){$this->elements[]=$element;}}publicfunctionDetach(Element$element){$position=0;foreach($this->elementsas$e){if($e==$element){unset($this->elements[$position]);}休息;}$位置++;}}publicfunctionAccept(Visitor$visitor){foreach($this->elementsas$e){$e->Accept($visitor);}}}这是一个对象结构,用于保存元素实体和进行访问调用。让我们在客厅见面,互相打招呼,这是客厅$o=newObjectStructure();$o->Attach(newConcreteElementA());$o->Attach(newConcreteElementB());$v1=新的具体访客1();$v2=newConcreteVisitor2();$o->接受($v1);$o->接受($v2);客户的电话终于让大家正式见面,互相介绍握手。一次访问是一个快乐的访问。让访问者调用指定的元素。这里需要注意的是访问者调用元素的行为一般是固定的,很少发生变化。即VisitConcreteElementA()和VisitConcreteElementB()这两个方法。也就是说,定义对象结构的类很少变化,但是当你经常需要在这个结构上定义新的操作时,你会使用访问者模式对一个对象结构中的对象执行许多不同的、互不相关的操作,并且你要避免让这些操作“污染”这些对象的类,适用于访问者模式访问者模式适用于数据结构不发生变化的情况。因此,它是一种您通常不使用的模式,但您只能在需要时使用此模式。GoF:“大多数时候你不需要访问者模式,但当你需要时,你就真的需要它了”。访问者模式的一些优点和缺点,因为很少有数据结构不变的情况:易于添加新操作;集中相关的操作,分离不相关的操作;很难添加新的ConcreteElement类;通过类层次结构访问;积累状态;销毁封装了我们公司的账目,只有收入和支出(Element),但是不同的部门(Visitor)访问的时候会给出不同的内容。比如我查的时候,只需要查月度或者季度的汇总数据。财务总监需要详细的收支记录,会计做账需要完整的细节。由此可见,公司的运作确实需要非常广泛的知识,不仅是管理能力,会计知识也是必学的内容!!完整代码:https://github.com/zhangyue0503/designpatterns-php/blob/master/23.visitor/source/visitor.php例子最后一个pattern例子还是回到我们的信息发送。多个服务提供商也是如此。作为访客,需要使用各自的短信发送和APP推送接口。这时候就可以使用访客模式来操作,实现对这些访客的所有操作。访客模式消息发送完整源码:https://github.com/zhangyue0503/designpatterns-php/blob/master/23.visitor/source/visitor-msg.phpPushMsg($this);}}classSendMessageimplementsMessage{publicfunctionMsg(ServiceVisitor$v){echo'SMSscriptstart:';$v->SendMsg($this);}}classObjectStructure{private$elements=[];publicfunctionAttach(Message$element){$this->elements[]=$element;}}publicfunctionDetach(Message$element){$position=0;foreach($this->elementsas$e){if($e==$element){unset($this->elements[$position]);}休息;}$位置++;}}publicfunctionAccept(ServiceVisitor$visitor){foreach($this->elementsas$e){$e->Msg($visitor);}}}$o=newObjectStructure();$o->Attach(newPushMessage());$o->Attach(newSendMessage());$v1=newAliYun();$v2=newJiGuang();$o->接受($v1);$o->接受($v2);说明一下,我们假设发送短信和发送推送消息是两个不变的行为,即它们的数据结构是稳定不变的,这样我们就可以方便的添加ServiceVisitor,当添加百度云或者其他短信服务商的时候,它添加访客非常方便。访问者模式更适合数据结构稳定的结构。比如账单只有收入和支出,人的性别只有男性和女性。其实还少了一个解释器模式,不过这个模式确实非常少见,有兴趣的朋友可以自行了解一下。各媒体平台均可搜索【硬核项目经理】