资讯专栏INFORMATION COLUMN

php 设计模式 之 访问者模式

zzir / 2385人阅读

摘要:概念访问者模式实际上是让外部类能够获取树形结构的每个节点的对象,对每个对象进行操作的模式,他能让我们在不改动原有树形结构的基础上扩展功能。

概念:

访问者模式实际上是让外部类能够获取树形结构的每个节点的对象,对每个对象进行操作的模式, 他能让我们在不改动原有树形结构的基础上扩展功能。比如统计等等

在这种模式下,必须有的几个要素:
1: 具体的元素对象, 访问者实际要访问的位置(即节点)
2: 稳定的树形结构, 每个节点都是一个元素对象, 一般在组合模式下比较多, 他提供了让访问者能够进行访问的实际位置(即访问者访问的是具体的树形结构的某个节点的实例化对象):
3: 访问者接口,这里定义了访问者的接口方法 , 这是个在每个节点都会用到的方法,用以节点处引用访问者,从而使得访问者能够访问当前节点
4: 访问者的具体实现. 继承了访问者接口,以实现接口方法
(还可以加一个要素: 元素的接口,对应 要点1)

情景:

要给不同用户组的用户添加不同的积分。

实现:
//定义元素接口
abstract class User
{
    public function getPoint()
    {
        return rand();  //该数据应该由数据库中读取,这里就直接模拟某个值了
    }

    //这里的accept方法用于把访问者引入,在这个方法里,($visitor)访问者可以通过User类获取需要的数据进而进行相应的操作
    abstract function accept(UserVisitor $vitor);

}

//实现元素接口
class VipUser extends User
{
    //这里的getPoint()具体实现就由接口中实现了

    //在这里就把当前对象传递给了visitor 访问者, 在访问者类的visitVip方法中就能根据$this获取必要的数据进行相应的操作
    public function accept(UserVisitor $vitor)
    {
        $vitor->visitVip($this);
    }
}

class NormalUser extends User
{
    //同上的getPoint()具体实现就由接口中实现了

   //同VipUser类中的accept
    public function accept(UserVisitor $vitor)
    {
        $vitor->visitNormal($this);
    }
}

//定义访问者接口
abstract class UserVisitor
{
    //访问者必须要实现的访问不同用户的接口方法
    abstract function visitVip(User $user);
    abstract function visitNormal(User $user);
}

//积分操作的访问者实现
class PointActVisitor extends UserVisitor
{
    public function visitVip(User $user)
    {
        echo "Vip用户+10分 
"; } public function visitNormal(User $user) { echo "Normal用户+5分
"; } } //用户的树形结构 class Users { protected $users; public function addUser(User $user) { $this->users[] = $user; } //让所有的用户都能被访问者访问 public function handleVisitor(UserVisitor $visitor) { foreach($this->users as $user) { $user->accept($visitor); } } } $pointVisitor = new PointActVisitor(); $users = new Users(); $users->addUser(new VipUser()); //添加新用户 $users->addUser(new NormalUser()); $users->addUser(new NormalUser()); $users->handleVisitor($pointVisitor); //执行PointActVisitor访问者的操作
结果:
Vip用户+10分 
Normal用户+5分
Normal用户+5分

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20854.html

相关文章

  • PHP设计模式迭代器模式

    摘要:概念迭代器模式,又叫做游标模式。另外,当需要对聚集有多种方式遍历时,可以考虑去使用迭代器模式。迭代器模式为遍历不同的聚集结构提供如开始下一个是否结束当前哪一项等统一的接口。 概念 迭代器模式(Iterator),又叫做游标(Cursor)模式。提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。 当你需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,就...

    陆斌 评论0 收藏0
  • PHP设计模式访问者模式

    摘要:访问者模式解决的问题在我们的代码编写过程当中,经常需要对一些类似的对象添加一些的代码,我们以一个计算机对象打印组成部分为例来看下抽象基类获取名称类内存类键盘类计算机类循环打印各个组成部分这个时候上面的代码看上去好像很完美的样子,但是问 访问者模式解决的问题 在我们的代码编写过程当中,经常需要对一些类似的对象添加一些的代码,我们以一个计算机对象打印组成部分为例来看下: /** ...

    用户83 评论0 收藏0
  • PHP基础

    摘要:分别为适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。设计模式五适配器模式适配器模式将某个对象的接生成器和协程的实现在这篇文章中,作者针对那些比较难以理解的概念,以一个更为通俗的方式去讲明白。。 PHP 源码注解 PHP 的详细源码注解 PHP 字符串操作整理 一些有关字符串的常用操作。 Redis 常见七种使用场景 (PHP 实战) 这篇文章主要介绍利用 R...

    HtmlCssJs 评论0 收藏0
  • PHP设计模式系列入门

    摘要:设计模式系列之入门设计模式是一套被反复使用多数人知晓的经过分类编目的代码设计经验的总结。毫无疑问,设计模式于己于他人于系统都是多赢的设计模式使代码编制真正工程化设计模式是软件工程的基石脉络,如同大厦的结构一样。 PHP设计模式系列之入门 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易...

    animabear 评论0 收藏0
  • PHP 实战设计模式PHP 中的设计模式

    摘要:事实上,设计模式的解释如下另一方面,设计模式提供了一种广泛的可重用的方式来解决我们日常编程中常常遇见的问题。原型模式有些时候,部分对象需要被初始化多次。 本文为翻译文章 原文地址:Design Patterns in PHP如果打算学习PHP的童鞋可以参考下笔者的编程语言学习知识体系要点列表 本文主要讨论下Web开发中,准确而言,是PHP开发中的相关的设计模式及其应用。有经验的开发者肯...

    2450184176 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<