IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> php-访问者模式实现 -> 正文阅读

[PHP知识库]php-访问者模式实现

概述

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

本文还是以摩托车制造厂为例,因市场竞争问题以及长远发展考虑,我们希望公司能具备摩托引擎研发以及制动系统研发能力。因此我们成立了两个对应的项目组负责研发引擎和制动系统。为了提高项目组的积极性我们针对性的制定了两套奖励机制。对于提前完成或如期完成任务的项目组给予现金和旅游的额外奖励,本文我们以访问中模式实现

模式结构

  1. State - 抽象项目状态
  2. Project - 抽象项目
  3. FinishedAdvance - 提前完成项目状态
  4. Finished - 如期完成项目状态
  5. BeOverdue - 逾期完成项目状态
  6. ProjectA - 摩托引擎研发
  7. ProjectB - 制动系统研发
  8. ObjectStruct - 对象结构

图例

在这里插入图片描述

代码实例

<?php

namespace Visitor;

/**
 * 抽象项目状态
 */
abstract class State{
    protected $state;
    public abstract function getProjectAResult(Project $projectA);
    public abstract function getProjectBResult(Project $projectB);
}

//抽象项目
abstract class Project
{
    //项目名称
    public $projectName;
    //接受项目状态
    public abstract function Accept(State $visitor);
}
/** 
 * 提前完成
 */
class FinishedAdvance extends State{
    public function __construct(){
        $this->state = "提前完成";
    }
    public function getProjectAResult(Project $projectA){
        echo "{$projectA->projectName}: 奖励规则 {$this->state},给项目组发奖金 50000 并安排一次国内旅游。<br/>";

    }
    public function getProjectBResult(Project $projectA){
        echo "{$projectA->projectName}: 奖励规则 {$this->state},给项目组发奖金 100000 并安排一次出国旅游。<br/>";
    }
}
/** 
 * 如期完成
 */
class Finished extends State{
    public function __construct(){
        $this->state = "如期完成";
    }
    public function getProjectAResult(Project $projectA){
        echo "{$projectA->projectName}: 奖励规则 {$this->state},给项目组发奖金 20000 并安排一次国内旅游。<br/>";

    }
    public function getProjectBResult(Project $projectA){
        echo "{$projectA->projectName}: 奖励规则 {$this->state},给项目组发奖金 5000 并安排一次出国旅游。<br/>";
    }
}
/**
 * 逾期
 */
class BeOverdue  extends State{
    public function __construct(){
        $this->state = "逾期完成";
    }
    public function getProjectAResult(Project $projectA){
        echo "{$projectA->projectName}: 奖励规则 {$this->state},无额外奖励。<br/>";

    }
    public function getProjectBResult(Project $projectA){
        echo "{$projectA->projectName}: 奖励规则 {$this->state},无额外奖励。<br/>";
    }
}
//摩托车引擎研发项目
class ProjectA extends Project
{
    function __construct()
    {
        $this->projectName="制动研发";
    }
 
    public  function Accept(State $visitor)
    {
        $visitor->getProjectAResult($this);
    }
}
//制动系统研发
class ProjectB extends Project{
    function __construct()
    {
        $this->projectName="引擎研发";
    }
    public  function Accept(State $visitor)
    {
        $visitor->getProjectBResult($this);
    }
}
//对象结构
class ObjectStruct
{
    private $elements=array();
    //增加
    public function Add(Project $element)
    {
        array_push($this->elements,$element);
    }
    //移除
    public function Remove(Project $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);
        }
    }
}
$os = new ObjectStruct();
$os->Add(new ProjectA());
$os->Add(new ProjectB());
//成功时反应
$ss = new FinishedAdvance();
$os->Display($ss);
$ss = new Finished();
$os->Display($ss);
$ss = new BeOverdue();
$os->Display($ss);

运行结果

在这里插入图片描述

模式分析

  • 访问者模式适用于数据结构相对稳定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。
  • 访问者模式的目的是要把处理从数据结构分离出来。
  • 访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者,访问者模式将有关的行为集中到一个访问者对象中。缺点其实也就是使增加新的数据结构变得困难了。

优缺点

访问者模式优点

  1. 访问者模式使得增加新的操作变得很容易。使用访问者模式可以在不用修改具体元素类的情况下增加新的操作。它主要是通过元素类的accept方法来接受一个新的visitor对象来实现的。如果一些操作依赖于一个复杂的结构对象的话,那么一般而言,增加新的操作会很复杂。而使用访问者模式,增加新的操作就意味着增加一个新的访问者类,因此,变得很容易。

  2. 访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。

  3. 访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。迭代子只能访问属于同一个类型等级结构的成员对象,而不能访问属于不同等级结构的对象。访问者模式可以做到这一点。

  4. 积累状态。每一个单独的访问者对象都集中了相关的行为,从而也就可以在访问的过程中将执行操作的状态积累在自己内部,而不是分散到很多的节点对象中。这是有益于系统维护的优点。

访问者模式缺点

  1. 增加新的节点类变得很困难。每增加一个新的节点都意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作。
  2. 破坏封装。访问者模式要求访问者对象访问并调用每一个节点对象的操作,这隐含了一个对所有节点对象的要求:它们必须暴露一些自己的操作和内部状态。不然,访问者的访问就变得没有意义。由于访问者对象自己会积累访问操作所需的状态,从而使这些状态不再存储在节点对象中,这也是破坏封装的。

适用环境

  1. 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
  2. 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor模式使得你可以将相关的操作集中起来定义在一个类中。
  3. 当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
  4. 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-18 09:51:10  更:2021-09-18 09:52:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 5:50:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码