轻松掌握php设计模式之访问者模式
网络编程 2021-07-05 09:10www.168986.cn编程入门
这篇文章主要帮助大家轻松掌握php设计模式之访问者模式,感兴趣的小伙伴们可以参考一下
访问者模式解决的问题
在我们的代码编写过程当中,经常需要对一些类似的对象添加一些的代码,我们以一个计算机对象打印组成部分为例来看下
/ 抽象基类 / abstract class Unit { / 获取名称 / abstract public function getName(); } / Cpu类 / class Cpu extends Unit { public function getName() { return 'i am cpu'; } } / 内存类 / class Memory extends Unit { public function getName() { return 'i am memory'; } } / 键盘类 / class Keyboard extends Unit { public function getName() { return 'i am keyboard'; } } / 计算机类 / class Computer { protected $_items = []; public function add(Unit $unit) { $this->_items[] = $unit; } public function print() { // 循环打印各个组成部分 foreach ($this->_items as $item) { $item->getName(); } } }
这个时候上面的代码看上去好像很完美的样子,问题来了,现在我们不但需要打印组成部分,还需要保存各个组件到数据库,不仅如此,还需要打印各个组件的价格;此时如果在Unit基类中添加getPrice()和save()方法,也能实现我们想要的功能,这样做也存在问题,你并不知道还需要新增什么操作,如果每新增一个操作都用这样的方法来新增,我们的类会变得越来越臃肿。
访问者模式的实现
而访问者模式就是为了解决这个问题的,他把数据结构和作用于结构之上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化,我们来看狼蚁网站SEO优化改良过得代码
/ 抽象基类 / abstract class Unit { / 获取名称 / abstract public function getName(); / 用来接受访问者对象,回调访问者的visit方法 非常关键的方法 / public function aept(Visitor $visitor) { $method = visit . get_class($this); if (method_exists($visitor, $method)) { $visitor->$method($this); } } } / Cpu类 / class Cpu extends Unit { public function getName() { return 'i am cpu'; } } / Memory类 / class Memory extends Unit { public function getName() { return 'i am memory'; } } / Keyboard类 / class Keyboard extends Unit { public function getName() { return 'i am keyboard'; } } / Keyboard类 / interface Visitor { public function visitCpu(Cpu $cpu); public function visitMemory(Memory $memory); public function visitKeyboard(Keyboard $keyboard); } / / class PrintVisitor implements Visitor { public function visitCpu(Cpu $cpu) { echo "hello, " . $cpu->getName() . "\n"; } public function visitMemory(Memory $memory) { echo "hello, " . $memory->getName() . "\n"; } public function visitKeyboard(Keyboard $keyboard) { echo "hello, " . $keyboard->getName() . "\n"; } } / / class Computer { protected $_items = []; public function add(Unit $unit) { $this->_items[] = $unit; } / 调用各个组件的aept方法 / public function aept(Visitor $visitor) { foreach ($this->_items as $item) { $item->aept($visitor); } } } $puter = new Computer(); $puter->add(new Cpu()); $puter->add(new Memory()); $puter->add(new Keyboard()); $printVisitor = new PrintVisitor(); $puter->print($printVisitor); // 以上的代码将打印出 hello, i am cpu hello, i am memory hello, i am keyboard
经过上面的改良之后,我们要扩展就变得非常容易,如果我们需要新增保存到数据库的方法,可以在新增一个实现了Visitor的类,比如SaveVisitor,在该类中来实现保存的方法,等于我们把该类和该类中的一些操作解藕了出来,而集合了类操作的对象就是访问者。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持狼蚁SEO。
编程语言
- 宿迁百度关键词排名指南:实现精准营销的关键
- 四川SEO优化怎么做网络推广
- 立昂技术备案老域名收购:如何为您的业务赋能
- 安徽百度关键词seo贵不贵,一般需要多少钱
- 吉林百度快照排名怎么做电话营销
- 多伦新手做SEO怎么做
- 甘肃优化关键词排名推广怎么做论坛营销
- 沙雅SEO网站推广:提升您的在线可见性
- 四川SEO优化如何提升销售额和销售量
- 聂荣网站排名优化:提升网站可见性的全方位指
- 涞水SEO:提升地方企业在线可见性的策略
- 辽宁百度seo排名怎样做网站排名
- 临湘哪有关键词排名优化:提升网站可见度的关
- 黑龙江百度网站优化有没有优惠
- 凉城优化关键词排名推广:提升您的网络可见性
- 萝北整站优化:提升您网站流量和排名的全面指