面向对象之装饰模式

MengDe 133 2021-08-24

目前有一个问题:新增了一个用户,但是我们要给他带上VIP的标识,带上用户组的标识,以后会添加更多的标识,在不违反开闭原则的情况下,我们该如何来实现呢?

上代码:

<?php
/**
 * Created by MengDe.
 * @Author MengDe <9258405@qq.com>
 * @Date   2021/8/24 11:11
 *
 */
//装饰者模式
//定义一个文章类

class  people
{
    protected $people;
    protected $peoples;

    public function __construct($people)
    {
        $this->people = $people;
        $this->peoples = $people;
    }

    public function result()
    {
        return $this->peoples;
    }

}

//我们给他增加一个VIP标识
class vipPeople extends people
{
    public function __construct($people)
    {
        $this->people = $people;
        $this->result();
    }

    public function result()
    {
        return $this->peoples = $this->people->result() . "是VIP "; // TODO: Change the autogenerated stub
    }

}

//用户组标识
class groupPeople extends people
{
    public function __construct($people)
    {
        $this->people = $people;
        $this->result();
    }

    public function result()
    {
        return $this->peoples = $this->people->result() . "是管理员 "; // TODO: Change the autogenerated stub
    }

}

//调用
//先VIP再管理员
$people = (new groupPeople(new vipPeople(new people("张三"))))->result();
//先管理员再VIP
$people = (new vipPeople(new groupPeople(new people("张三"))))->result();

我们来讲一下实现的原理:

首先:我们给子类传入一个父类对象 里面包含了人和要未装饰的人,

我们在子类里面 我们把父类的对象看做成一个人(有people属性和result方法),子类里面获取到父类整个对象 赋值给自己(包含people 和result),然后重新的定义了结果方法 进行装饰,在结果方法中 把自己的peoples属性从父级获取到的结果进行变更 从而达到了装饰的效果

可能讲得不是很清楚,可以联系我互相讨论

上一篇:面向对象之适配器模式
下一篇:已是最新文章
相关文章