浅谈PHP面向对象之访问者模式+组合模式
副标题[/!--empirenews.page--]
因为原文中延续了组合模式的代码示例来讲访问者模式 所以这里就合并一起来复习了。但主要还是讲访问者模式。顾名思义这个模式会有一个访问者类(就像近期的热播剧“人民的名义”中的检查官,跑到到贪官家里调查取证,查实后就定罪),被访问者类调用访问者类的时候会将自身传递给它使用。 直接看代码: abstract class Unit {abstract function bombardStrength(); //获取单位的攻击力 //这个方法将调用访问者类,并将自身传递给它 //按原文的说法是设置一个深度,虽然之后会有调用但这个方法对于理解这个模式不重要可以不用管他(原文示例代码中经常有些跟理解模式原理没太多关系的代码) function getDepth(){ //弓箭手 //激光炮 class LaserCannonUnit extends Unit{ //骑兵 class Cavalry extends Unit{ } //用于组合继承了unit类的实例,并让Army和TroopCarrier类继承removeUnit和addUnit方法,不放基类是因为上述的三个类已经是最小单位了不是一个军事集团removeUnit和addUnit方法对他们没用。 abstract class CompositeUnit extends Unit{ function getComposite(){ //这个方法主要用于判断当前实例是否是一个 CompositeUnit 类 protected function units(){ function removeUnit(Unit $unit){ //删除一个军事单位 ); function addUnit(Unit $unit){ //添加一个军事单位 function bombardStrength(){ function accept(Armyvisitor $visitor){ //调用访问者 //军队 class Army extends CompositeUnit { } //舰队 class TroopCarrier extends CompositeUnit { } //访问者类 abstract class ArmyVisitor{ //...... function visitCavalry(Cavalry $node){ //....... function visitLaserCannonUnit(LaserCannonUnit $node){ //...... function visitTroopCarrierUnit(Cavalry $node){ //...... function visitArmy(Cavalry $node){ //...... //这个访问者类主要用于获取并保存被访问者对象的信息 function getText(){ //用于向每个对象征税的访问者类,客户端代码2中将会调用 function visit(Unit $node){ function visitArcher(Archer $node){ //复写了父类的方法,对于不同的单位征收不同的税 function visitCavalry(Cavalry $node){ function visitTroopCarrierUnit(TroopCarrierUnit $node){ (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |