浅谈PHP设计模式的访问者模式

简介:

访问者模式,属于行为型的设计模式。表示一个作用于某对象结构中的各元素的操作。它是你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

适用场景:

  1. 类中有易于变化的算法。
  2. 希望数据结构与数据分离。

优点:

  1. 便于增加新的操作,相当于增加一个访问者。访问者模式将有关行为集中到一个访问者对象中。

缺点:

元素变更比较困难,如为被访问的对象增加、减少一些属性,相应的访问者也需要进行修改 ;

代码:

/**
 *Component接口声明了一个“accept”方法,该方法应将base访问者接口作为参数。
 */
interface Component
{
    public function accept(Visitor $visitor): void;
}

/**
 *每个具体组件必须以这样的方式实现“accept”方法:它调用与组件类对应的访问者方法。
 */
class ConcreteComponentA implements Component
{
    /*
     * 注意,我们调用的是与当前类名匹配的“visitContainerComponentA”。通过这种方式,我们让访问者知道它所使用的组件的类
     */
    public function accept(Visitor $visitor): void
    {
        $visitor->visitConcreteComponentA($this);
    }

    /*
     * 具体组件可能具有其基类或接口中不存在的特殊方法。Visitor仍然能够使用这些方法,因为它知道组件的具体类
     */
    public function exclusiveMethodOfConcreteComponentA(): string
    {
        return "A";
    }
}

class ConcreteComponentB implements Component
{
    /**
     * 此处相同:visitContainerComponentB=>ConcreteComponentB
     */
    public function accept(Visitor $visitor): void
    {
        $visitor->visitConcreteComponentB($this);
    }

    public function specialMethodOfConcreteComponentB(): string
    {
        return "B";
    }
}

/**
 *Visitor接口声明了一组与组件类相对应的访问方法。访问方法的签名允许访问者标识它正在处理的组件的确切类。
 */
interface Visitor
{
    public function visitConcreteComponentA(ConcreteComponentA $element): void;

    public function visitConcreteComponentB(ConcreteComponentB $element): void;
}

/**
 *Concrete Visitors实现了同一算法的多个版本,它可以与所有具体组件类一起工作。当将Visitor模式与复杂的对象结构(如Composite树)一起使用时,您可以体验到它的最大好处。在这种情况下,在对结构的各个对象执行访问者的方法时,存储算法的一些中间状态可能会有所帮助。
 */
class ConcreteVisitor1 implements Visitor
{
    public function visitConcreteComponentA(ConcreteComponentA $element): void
    {
        echo $element->exclusiveMethodOfConcreteComponentA() . " + ConcreteVisitor1\n";
    }

    public function visitConcreteComponentB(ConcreteComponentB $element): void
    {
        echo $element->specialMethodOfConcreteComponentB() . " + ConcreteVisitor1\n";
    }
}

class ConcreteVisitor2 implements Visitor
{
    public function visitConcreteComponentA(ConcreteComponentA $element): void
    {
        echo $element->exclusiveMethodOfConcreteComponentA() . " + ConcreteVisitor2\n";
    }

    public function visitConcreteComponentB(ConcreteComponentB $element): void
    {
        echo $element->specialMethodOfConcreteComponentB() . " + ConcreteVisitor2\n";
    }
}

/**
 *客户端代码可以在任何一组元素上运行访问者操作,而无需弄清楚它们的具体类。accept操作将调用指向访问者对象中的适当操作。
 */
function clientCode(array $components, Visitor $visitor)
{
    // ...
    foreach ($components as $component) {
        $component->accept($visitor);
    }
    // ...
}


//调用端
$components = [
    new ConcreteComponentA(),
    new ConcreteComponentB(),
];

echo "客户端代码通过基本访问者界面与所有访问者一起工作:\n";
$visitor1 = new ConcreteVisitor1();
clientCode($components, $visitor1);
echo "\n";

echo "它允许相同的客户端代码与不同类型的访问者一起工作:\n";
$visitor2 = new ConcreteVisitor2();
clientCode($components, $visitor2);

原文链接:https://www.cnblogs.com/phpphp/p/17069476.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈PHP设计模式的访问者模式 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • PHP实现连接设备、通讯和发送命令的方法

    关于PHP实现连接设备、通讯和发送命令的方法,可以通过以下步骤完成: 步骤一:安装PHP串口扩展 要实现PHP与设备通讯,需要先安装PHP串口扩展。在Ubuntu或Debian等系统中,可以通过以下命令进行安装: sudo apt-get install php-serial 在Windows系统中,则需要在php.ini文件中添加以下两行扩展配置: ext…

    PHP 2023年5月26日
    00
  • 微信小程序授权登录及解密unionId出错的方法

    微信小程序授权登录及解密unionId出错的方法 微信小程序授权登录已成为现代互联网应用中常见的用户验证方式。在实际开发中,如果不正确地处理用户信息,就会遇到unionId解密出错的问题。本文将详细介绍微信小程序授权登录和解密unionId的方法,解决授权登录和unionId解密出错的问题。 1. 授权登录示例 1.1 准备工作 为了实现微信小程序授权登录,…

    PHP 2023年5月30日
    00
  • php开发分页实现代码第3/3页

    首先我们来解析一下“php开发分页实现代码第3/3页”这个题目。 题目中提到了分页实现,因此我们应该可以知道这是一个分页的教程。而“php开发”也可以显示出这个教程的适用对象是使用PHP语言进行开发的人群。最后,“第3/3页”则可以暗示该教程是一个多页的文章。 基于以上推测,我们可以将教程的目录设计成以下形式: 第一页:介绍分页的实现原理及准备工作,包括数据…

    PHP 2023年5月23日
    00
  • 使用php实现下载生成某链接快捷方式的解决方法

    下面是使用 PHP 实现下载生成某链接快捷方式的解决方法的完整攻略。 需求分析 在 PHP 中生成某个文件的快捷方式,可以实现用户直接通过双击快捷方式来打开该文件。这个功能在某些网站和应用程序中是非常有用的。在实现这个功能之前,我们需要了解以下几个方面的知识: Windows 的快捷方式是什么 PHP 如何生成文件 PHP 如何创建 Windows 的快捷方…

    PHP 2023年5月23日
    00
  • PHP+MYSQL实现用户的增删改查

    下面就来详细讲解一下“PHP+MYSQL实现用户的增删改查”的完整攻略。 一、准备工作 在开始之前,我们需要做一些准备工作才能进行后续的操作。 1.1 创建数据库 首先,我们需要在MYSQL中创建一个数据库,这个数据库将用来存储用户的信息。我们可以在MYSQL中使用下面的SQL语句来创建一个名为users的数据库: CREATE DATABASE users…

    PHP 2023年5月27日
    00
  • 探讨php中遍历二维数组的几种方法详解

    完整攻略:探讨PHP中遍历二维数组的几种方法 一、什么是二维数组? 在PHP中,数组可以是多维的,二维数组就是指在一个数组中嵌套着一个或多个数组。例如下面这个二维数组: $arr = array( array(‘apple’, ‘orange’, ‘banana’), array(‘cat’, ‘dog’, ‘fish’), array(‘red’, ‘gr…

    PHP 2023年5月26日
    00
  • php版本的cron定时任务执行器使用实例

    下面我将详细讲解PHP版本的Cron定时任务执行器的使用实例攻略。 什么是Cron定时任务? Cron是一个在Unix和类Unix操作系统下的任务定时器,可以按照指定的时间周期性的执行命令或脚本。而Cron定时任务就是利用Cron来实现周期性地执行某些任务,例如定时备份数据库、定时清理日志文件等。 什么是PHP版本的Cron定时任务执行器? 在PHP中,我们…

    PHP 2023年5月27日
    00
  • PHP中的array数组类型分析说明

    下面是针对“PHP中的array数组类型分析说明”的完整攻略: PHP中的array数组类型分析说明 什么是PHP中的array数组 数组是一种数据类型,用于存储多个值。在PHP中,数组也是一种数据类型,用于存储多个值的容器。 PHP中的数组有两种类型,分别是: 索引数组 关联数组 索引数组 索引数组(也称数字数组)是指用整数作为索引的数组。PHP默认的数组…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部