PHP设计模式之访问者模式

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

在这种模式下,必须有的几个要素:

1、具体的元素对象,访问者实际要访问的位置(即节点)

2、稳定的树形结构,每个节点都是一个元素对象,一般在组合模式下比较多,它提供给了让访问者能够进行访问的实际位置(即访问者访问的是具体的属性结构的某个节点的实例化对象);

3、访问者接口,这里定义了访问者的接口方法,这是个在每个节点都会用到的方法;用以节点处引用访问者,从而使得访问者能够访问当前节点。

4、访问者的具体实现,继承了访问者接口,以实现接口方法

//定义元素接口
abstract class User
{
    public function getPoint()
    {
        return rand();//改数据应该由数据库中读取,这里就直接模拟某个值了、
    }
    
    //这里的accept方法用于把访问者引入,在这个方法里,$visitor访问者可以通过User类获取需要的数据进而进行相应的操作。
    abstract function accept(UserVisitor $visitor);
}

//定义元素接口
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分<br/>';
    }
    
    public function visitNormal(User $user)
    {
        echo 'Normal用户+5分<br/>';
    }
}

//用户树形结构
class Users
{
    protected $users;
    public function addUser(User $user)
    {
        $this->users[] = $user;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值