PHP设计模式——访问者模式

简介: 声明:本系列博客参考资料《大话设计模式》,作者程杰。       访问者模式表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

声明:本系列博客参考资料《大话设计模式》,作者程杰。


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


      UML类图:  

      


         角色:        

        1.抽象访问者(State):为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它。

        2.具体访问者(Success):实现访问者声明的接口。

        3.抽象元素(Person):定义一个接受访问操作accept(),它以一个访问者作为参数。
        4.
具体元素(Man):实现了抽象元素所定义的接受操作接口。

        5.结构对象(ObjectStruct):这是使用访问者模式必备的角色。它具备以下特性:能枚举它的元素;可以提供一个高层接口以允许访问者访问它的元素;如有需要,可以设计成一个复合对象或者一个聚集(如一个列表或无序集合)。


        核心代码:

       

<span style="color:#000000;"><?php
/**
 * Created by PhpStorm.
 * User:Jang
 * Date:2015/6/11
 * Tim: 9 :40
 */

/*男人这本书的内容要比封面吸引人;女人这本书的封面通常比内容更吸引人
男人成功时,背后多半有一个伟大的女人;女人成功时,背后多半有一个失败的男人
男人失败时,闷头喝酒,谁也不用劝;女人失败时,眼泪汪汪,谁也劝不了
男人恋爱时,凡事不懂也要装懂;女人恋爱时,遇事懂也要装作不懂*/
//抽象状态
abstract class State
{
    protected $state_name;

    //得到男人反应
    public abstract function GetManAction(VMan $elementM);
    //得到女人反应
    public abstract function GetWomanAction(VWoman $elementW);
}

//抽象人
abstract class Person
{
    public $type_name;

    public abstract function Accept(State $visitor);
}

//成功状态
class Success extends State
{
    public function __construct()
    {
        $this->state_name="成功";
    }

    public  function GetManAction(VMan $elementM)
    {
        echo "{$elementM->type_name}:{$this->state_name}时,背后多半有一个伟大的女人。<br/>";
    }

    public  function GetWomanAction(VWoman $elementW)
    {
        echo "{$elementW->type_name} :{$this->state_name}时,背后大多有一个不成功的男人。<br/>";
    }
}

//失败状态
class Failure extends State
{
    public function __construct()
    {
        $this->state_name="失败";
    }

    public  function GetManAction(VMan $elementM)
    {
        echo "{$elementM->type_name}:{$this->state_name}时,闷头喝酒,谁也不用劝。<br/>";
    }

    public  function GetWomanAction(VWoman $elementW)
    {
        echo "{$elementW->type_name} :{$this->state_name}时,眼泪汪汪,谁也劝不了。<br/>";
    }
}

//恋爱状态
class Amativeness  extends State
{
    public function __construct()
    {
        $this->state_name="恋爱";
    }

    public  function GetManAction(VMan $elementM)
    {
        echo "{$elementM->type_name}:{$this->state_name}时,凡事不懂也要装懂。<br/>";
    }

    public  function GetWomanAction(VWoman $elementW)
    {
        echo "{$elementW->type_name} :{$this->state_name}时,遇事懂也要装作不懂。<br/>";
    }
}

//男人
class VMan extends Person
{
    function __construct()
    {
        $this->type_name="男人";
    }

    public  function Accept(State $visitor)
    {
        $visitor->GetManAction($this);
    }
}

//女人
class VWoman extends Person
{
    public function __construct()
    {
        $this->type_name="女人";
    }

    public  function Accept(State $visitor)
    {
        $visitor->GetWomanAction($this);
    }
}

//对象结构
class ObjectStruct
{
    private $elements=array();
    //增加
    public function Add(Person $element)
    {
        array_push($this->elements,$element);
    }
    //移除
    public function Remove(Person $element)
    {
        foreach($this->elements as $k=>$v)
        {
            if($v==$element)
            {
                unset($this->elements[$k]);
            }
        }
    }

    //查看显示
    public function Display(State $visitor)
    {
        foreach ($this->elements as $v)
        {
            $v->Accept($visitor);
        }
    }
}</span>

        测试客户端代码:

       

header("Content-Type:text/html;charset=utf-8");
//------------------------访问者模式--------------------
require_once "./Visitor/Visitor.php";
$os = new ObjectStruct();
$os->Add(new VMan());
$os->Add(new VWoman());

//成功时反应
$ss = new Success();
$os->Display($ss);

//失败时反应
$fs = new Failure();
$os->Display($fs);

//恋爱时反应
$ats=new Amativeness();
$os->Display($ats);

       适用场景及优势:      

       1) 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。

       2) 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor模式使得你可以将相关的操作集中起来定义在一个类中。

       3) 当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。

       4) 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。


欢迎关注我的视频课程,地址如下,谢谢。


   PHP面向对象设计模式
目录
相关文章
|
7天前
|
设计模式 Java 机器人
Java设计模式之访问者模式详解
Java设计模式之访问者模式详解
|
2月前
|
设计模式 算法 Java
【设计模式】JAVA Design Patterns——Acyclic Visitor(非循环访问者模式)
【设计模式】JAVA Design Patterns——Acyclic Visitor(非循环访问者模式)
|
8天前
|
设计模式 存储 算法
PHP中常用的设计模式
设计模式是软件设计中解决问题的常见模式,它们提供了良好的实践,但使用时需注意其可能带来的耦合和测试难度问题。例如,单例模式可能导致全局状态,降低可测试性,而依赖注入可以作为更好的替代方案。
15 4
PHP中常用的设计模式
|
8天前
|
设计模式 数据库连接 PHP
PHP中的面向对象编程与设计模式应用
传统的PHP编程模式在面向对象的趋势下逐渐演进,本文探讨了面向对象编程在PHP中的应用,并深入分析了常用的设计模式如何优化代码结构和可维护性。
|
4天前
|
设计模式 算法 PHP
经验大分享:php常见五种设计模式
经验大分享:php常见五种设计模式
|
4天前
|
设计模式 算法 PHP
经验大分享:php常见五种设计模式
经验大分享:php常见五种设计模式
|
5天前
|
设计模式 缓存 前端开发
现代PHP开发中的设计模式应用与性能优化
本篇文章深入探讨了PHP开发中设计模式的实际应用及其对性能的影响。通过分析具体案例和最新研究成果,文章揭示了合理运用设计模式不仅可以提升代码的可维护性和扩展性,还能在特定场景下优化性能。我们将一起探索如何通过科学方法将设计模式融入日常开发实践,同时保持代码的高效执行。
|
19天前
|
设计模式 PHP 开发者
PHP中的设计模式及其应用
在现代软件开发中,设计模式是一种被广泛采纳的方法论,能够帮助开发者解决常见的设计问题并提高代码的灵活性和可维护性。本文将深入探讨PHP中几种常用的设计模式,包括工厂模式、单例模式和观察者模式,分析它们的实现方式以及在实际项目中的应用场景,帮助读者理解和运用这些模式来优化自己的PHP代码设计。
|
2月前
|
设计模式 安全 Java
【设计模式】字节三面:请举例阐释访问者模式
【设计模式】字节三面:请举例阐释访问者模式
20 2
|
2月前
|
设计模式 算法 Java
23种设计模式,访问者模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】访问者模式是一种将算法与对象结构分离的设计模式。这种模式主要用于执行一个操作(或一组操作)在一个对象结构的各元素上,它可以在不修改各元素的类的前提下定义新的操作。
33 2