您的位置:58脚本 > php访问权限 PHP 访问者模式

php访问权限 PHP 访问者模式

2023-04-24 11:32 PHP设计模式

php访问权限 PHP 访问者模式

php访问权限 PHP 访问者模式

php访问权限

目的

访问者模式允许将对象上的操作外包给其他对象。这样做的主要原因是保持关注数据结构和数据操作的分离。但是类必须定义一个允许访问的契约(示例中的Role::accept方法)。

契约是一个抽象类,但你也可以就是一个接口。在这种情况下,每个Visitor必须自己选择要调用哪个方法。

UML 图

Alt Visitor UML Diagram

代码

RoleVisitor.php

<?php

declare(strict_types=1);

namespace DesignPatternsBehavioralVisitor;


interface RoleVisitor
{
    public function visitUser(User $role);

    public function visitGroup(Group $role);
}

RecordingVisitor.php

<?php

declare(strict_types=1);

namespace DesignPatternsBehavioralVisitor;

class RecordingVisitor implements RoleVisitor
{
    
    private array $visited = [];

    public function visitGroup(Group $role)
    {
        $this->visited[] = $role;
    }

    public function visitUser(User $role)
    {
        $this->visited[] = $role;
    }

    
    public function getVisited(): array
    {
        return $this->visited;
    }
}

Role.php

<?php

declare(strict_types=1);

namespace DesignPatternsBehavioralVisitor;

interface Role
{
    public function accept(RoleVisitor $visitor);
}

User.php

<?php

declare(strict_types=1);

namespace DesignPatternsBehavioralVisitor;

class User implements Role
{
    public function __construct(private string $name)
    {
    }

    public function getName(): string
    {
        return sprintf("User %s", $this->name);
    }

    public function accept(RoleVisitor $visitor)
    {
        $visitor->visitUser($this);
    }
}

Group.php

<?php

declare(strict_types=1);

namespace DesignPatternsBehavioralVisitor;

class Group implements Role
{
    public function __construct(private string $name)
    {
    }

    public function getName(): string
    {
        return sprintf("Group: %s", $this->name);
    }

    public function accept(RoleVisitor $visitor)
    {
        $visitor->visitGroup($this);
    }
}

测试

Tests/VisitorTest.php

<?php

declare(strict_types=1);

namespace DesignPatternsTestsVisitorTests;

use DesignPatternsBehavioralVisitorRecordingVisitor;
use DesignPatternsBehavioralVisitorUser;
use DesignPatternsBehavioralVisitorGroup;
use DesignPatternsBehavioralVisitorRole;
use DesignPatternsBehavioralVisitor;
use PHPUnitFrameworkTestCase;

class VisitorTest extends TestCase
{
    private RecordingVisitor $visitor;

    protected function setUp(): void
    {
        $this->visitor = new RecordingVisitor();
    }

    public function provideRoles()
    {
        return [
            [new User("Dominik")],
            [new Group("Administrators")],
        ];
    }

    
    public function testVisitSomeRole(Role $role)
    {
        $role->accept($this->visitor);
        $this->assertSame($role, $this->visitor->getVisited()[0]);
    }
}


阅读全文
以上是58脚本为你收集整理的php访问权限 PHP 访问者模式全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
© 2024 58脚本 58jiaoben.com 版权所有 联系我们
桂ICP备12005667号-28 Powered by CMS