热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

执行及描述任务访问者模式

UMl类代码实现

UMl类

代码实现

php
//visitor.php 访问者模式abstract class Unit{protected $depth;function accept(ArmyVisitor $visitor){$method = "visit".get_class($this);$visitor->$method($this);}protected function setDepth($depth){$this->depth = $depth;}function getDepth(){return $this->depth;}function getComposite(){return null;}abstract function bombardStrengrg();
}
abstract class CompositeUnit extends Unit{protected $unit = array();function getComposite(){return $this;}function removeUnit(Unit $unit){$this->unit = array_udiff($this->unit,array($unit),function($a,$b){return ($a===$b)?0:1;});}function addUnit(Unit $unit){if(in_array($unit,$this->unit,true)){return;}$unit->setDepth($this->depth+1);$this->unit[] = $unit;}function accept(ArmyVisitor $visitor){parent::accept($visitor);foreach ($this->unit as $thisunit) {$thisunit->accept($visitor);}}
}
class Army extends CompositeUnit{function bombardStrengrg(){$ret = 0;foreach ($this->unit as $unit) {$ret+=$unit->bombardStrengrg();}return $ret;}
}
class Archer extends Unit{function bombardStrengrg(){return 4;}
}
class LaserCannon extends Unit{function bombardStrengrg(){return 5;}
}
abstract class ArmyVisitor{abstract function visit(Unit $node);function visitArcher(Archer $node){$this->visit($node);}function visitLaserCannon(LaserCannon $node){$this->visit($node);}function visitTroopCarrierUnit(TroopCarrierUnit $node){$this->visit($node);}function visitArmy(Army $node){$this->visit($node);}
}
class TextDumpArmyVisitor extends ArmyVisitor{private $text='';function visit(Unit $node){$ret = '';$pad = 4*$node->getDepth();$ret.=sprintf("%{$pad}s",'');$ret.=get_class($node).": ";$ret.="bombard: ".$node->bombardStrengrg()."
";$this->text.=$ret;}function getText(){return $this->text;}
}
class TaxCollectionVisitor extends ArmyVisitor{private $due=0;private $report=0;function visit(Unit $node){$this->levy($node,1);}function visitArcher(Archer $node){$this->levy($node,2);}function visitTroopCarrierUnit(TroopCarrierUnit $node){$this->levy($node,2);}function visitLaserCannon(LaserCannon $node){$this->levy($node,2);}function levy(Unit $unit,$amout){$this->report.="Tax levied for ".get_class($unit);$this->report.=": $amout
";$this->due+=$amout;}function getRepost(){return $this->report;}function getTax(){return $this->due;}
}
$main_army = new Army();
$main_army->addUnit(new Archer());
$main_army->addUnit(new LaserCannon());//$textdump = new TextDumpArmyVisitor();
$taxcollector = new TaxCollectionVisitor();
$main_army->accept($taxcollector);
//echo $textdump->getText();
echo "TOTAL: ";
echo $taxcollector->getTax()."
";
echo $taxcollector->getRepost();
?>

问题

访问者可可以用于任何对象集合

外部化操作可能破坏封装,例如给TextdumpArmyVisitor对象提供信息,我们被迫给Unit接口提供了一个额外的方法

 

转:https://www.cnblogs.com/rcjtom/p/6071080.html



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • JavaWeb中读取文件资源的路径问题及解决方法
    在JavaWeb开发中,读取文件资源的路径是一个常见的问题。本文介绍了使用绝对路径和相对路径两种方法来解决这个问题,并给出了相应的代码示例。同时,还讨论了使用绝对路径的优缺点,以及如何正确使用相对路径来读取文件。通过本文的学习,读者可以掌握在JavaWeb中正确找到和读取文件资源的方法。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
author-avatar
浅小影HLGC_215
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有