PHP实现Gof 23设计模式中的访问者模式实例与UML模型详解
摘要:本文通过一个示例场景来描述Gof 23设计模式中的Visitor模式,并用PHP程序代码实现。它还提供了用于实现代码的 UML 模型。

关键词:Gof 23 设计模式 访客模式 PHP
基于 PHP 的访问者模式
摘要:本文给出了一个场景实例来描述Gof 23设计模式中访问者模式的使用,并用PHP实现了该实例,同时给出了该实例实现的UML模型。
关键词:Gof 23;设计模式; PHP 访客模式
1. 标准定义
访问者模式的标准定义:表示作用于对象结构中每个元素的操作。它允许您定义作用于每个元素的新操作,而无需更改其类。
2.分析与说明
访问者模式是一种对象行为模式。访问者模式的目的是封装一些应用于某些数据结构元素的操作。一旦需要修改这些操作,接受该操作的数据结构可以保持不变。访问者模式适用于数据结构相对不确定的系统。它解耦了数据结构和作用于该结构的操作之间的耦合,允许操作集相对自由地演化。访问者模式可以通过添加新的访问者类轻松添加新操作。访问者模式将相关行为集中到访问者对象中,而不是将它们分散到节点类中。使用 Visitor 模式时,将尽可能多的对象浏览逻辑放置在 Visitor 类中而不是其子类中。访问者模式可以跨多个类层次结构访问属于不同层次结构的成员类。
Visitor模式的结构如图1所示,其角色包括抽象Visitor角色、具体Visitor角色、抽象节点角色、具体节点角色和结构对象(Object Structure)角色。
抽象访问者角色:声明一个或多个访问操作,形成所有特定元素角色必须实现的接口。
具体访问者角色:实现抽象访问者角色声明的接口,即抽象访问者声明的各项访问操作。
抽象节点(Node)作用:声明一个接受操作,接受一个访问者对象作为参数。
具体节点(Node)角色:实现抽象元素指定的接受操作。
对象结构角色:具有以下职责,可以遍历结构中的所有元素;如果需要,提供一个高级接口,以便访问者对象可以访问每个元素;如果需要,可以将其设计为复合对象或集合,例如List或Set。
图1 访客模式结构
3 应用场景举例
例如,企业一般要经过多次检查。对于工商部门来说,他们检查是否遵守业务审核。对于税务部门,查看您是否合法纳税。会计师事务所对公司进行财务审计。这些部门都是外部访客。摘要访客(Visitor)角色:工商部门、税务部门、会计师事务所是具体的访客角色。定义抽象公司的抽象节点角色。不同公司的工商情况、税务情况、会计情况是具体的节点角色。
这里的Visitor抽象类可以理解为抽象访问者(Visitor)角色。 AccountingFirm 类、TaxBureau 类和 TradeBureau 类是具体访问者角色。 AbstractCompany抽象类是一个抽象节点(Node)角色。 CompanyA类和CompanyB类是具体的节点(Node)角色。其结构类图如图2所示。AccountingFirm类、TaxBureau类和TradeBureau类继承Visitor抽象类,CompanyA类和CompanyB类继承AbstractCompany抽象类。 AbstractCompany 抽象类与 Visitor 抽象类相关联。
图2 访问者模式类图
4.PHP实现程序代码
PHP程序实现主要包括七个类:Visitor抽象类、AbstractCompany抽象类、AccountingFirm类、TaxBureau类、TradeBureau类、CompanyA类和CompanyB类。其关系如图2所示,下面列出这七类的程序代码,最后列出测试代码并显示输出结果。
访问者模式测试类的输出如下:
参考
[1] E.Gamma、R.Helm、R.Johnson 和 Vlissides。可重用面向对象软件的设计模式元素。艾迪生韦斯利,1995
[2] E.Gamma、R.Helm、R.Johnson 和 Vlissides。李英俊等译,《设计模式:可复用面向对象软件的基础》,北京:机械工业出版社。 2000.9.
[3] 明天的技术,PHP从入门到精通(第3版),北京:清华大学出版社。 2012.5.
[4] [美]Larry Ullman着,季国飞、朱培德译,《深入理解PHP:高级技术、面向对象与核心技术》(原著第3版),北京:机械工业出版社。 2014.1.
[5] PHP 官方网站:.
[6] PHP教程.
[7] PHP 面向对象教程