组合模式 + 装饰模式 + 迭代器模式 显示两级用户体系

功能:

显示用户及该用户推广进来的下属两级用户

一.User类

/**
 * Class User
 */
class User
{
    private $uid;
    private $name;
    private $level;

    public function __construct($uid, $name, $level)
    {
        $this->uid      = $uid;
        $this->name     = $name;
        $this->level    = $level;
    }

    public function getName()
    {
        return $this->name;
    }

    public function getUid()
    {
        return $this->uid;
    }
}

  

二.User类的装饰类(装饰类主要实现对User对象信息的更友好的显示)

/**
 * User类的装饰类
 * Class UserDecorator
 */
class UserDecorator
{
    protected $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function getDisplayHtml($deep)
    {
        return '<tr><td>'.str_repeat('&nbsp', ($deep-1) * 2) . "用户名:{$this->user->getName()};UID:{$this->user->getUid()}" .'</td></tr>';
    }
}

  

三.组合模式

1.抽象构件

/**
 * 抽象构件
 * Class PopUserComponent
 */
abstract class PopUserComponent
{
    protected $user;

    public function __construct(UserDecorator $user)
    {
        $this->user = $user;
    }

    abstract public function add(PopUserComponent $user);
    abstract public function remove(PopUserComponent $user);
    abstract public function display($deep);
}

  

2.一级用户:枝节点

/**
 * 一级用户:枝节点
 * Class FirstLevelPopUsers
 */
class FirstLevelPopUsers extends PopUserComponent
{
    protected $subordinateUsers = [];

    public function add(PopUserComponent $user)
    {
        $this->subordinateUsers[] = $user;
    }

    public function remove(PopUserComponent $user)
    {
        unset($this->subordinateUsers[array_search($user, $this->subordinateUsers)]);
    }

    public function display($deep)
    {
        $html = '';
        $html .=  $this->user->getDisplayHtml($deep);
        $deep += 2;
        foreach ($this->subordinateUsers as $eachSubordinateUser) {
            $html .= $eachSubordinateUser->display($deep);
        }
        return $html;
    }
}

  

3.二级用户:叶节点

/**
 * 二级用户:叶节点
 * Class SecondLevelPopUsers
 */
class SecondLevelPopUsers extends PopUserComponent
{
    public function add(PopUserComponent $user)
    {
        throw new \Exception('不支持该方法');
    }

    public function remove(PopUserComponent $user)
    {
        throw new \Exception('不支持该方法');
    }

    public function display($deep)
    {
        return $this->user->getDisplayHtml($deep);
    }
}

  

四.迭代器

/**
 * 迭代器
 * Class PopUserIterator
 */
class PopUserIterator implements Iterator
{
    private $users = [];
    private $valid = false;

    public function __construct()
    {
        /**
         * 此处模拟从数据库读取记录
         */

        $firstUser = new FirstLevelPopUsers(new UserDecorator(new User(1, '一级用户1', 1)));
        $firstUser->add(new SecondLevelPopUsers(new UserDecorator(new User(2, '二级用户3', 2))));
        $firstUser->add(new SecondLevelPopUsers(new UserDecorator(new User(3, '二级用户4', 2))));
        $firstUser->add(new SecondLevelPopUsers(new UserDecorator(new User(4, '二级用户5', 2))));

        $this->users[] = $firstUser;

        $firstUser = new FirstLevelPopUsers(new UserDecorator(new User(6, '一级用户6', 1)));
        $firstUser->add(new SecondLevelPopUsers(new UserDecorator(new User(7, '二级用户7', 2))));
        $firstUser->add(new SecondLevelPopUsers(new UserDecorator(new User(8, '二级用户8', 2))));
        $firstUser->add(new SecondLevelPopUsers(new UserDecorator(new User(9, '二级用户9', 2))));

        $this->users[] = $firstUser;
    }

    public function current()
    {
        return current($this->users);
    }

    public function next()
    {
        $this->valid = (next($this->users) === false) ? false : true;
    }

    public function key()
    {
        return key($this->users);
    }

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

    public function rewind()
    {
        $this->valid = (reset($this->users) === false) ? false : true;
    }

}

  

五.调用

$totalInfo = '';
$html   =  '<table border="1" bgcolor="#faebd7">';

$popUserIterator = new PopUserIterator();
foreach ($popUserIterator as $val) {
    $html .= $val->display(1);
}

$html   .= '</table>';

echo $html;

  

输出:

 

posted @ 2018-04-07 18:10  rorshach  阅读(211)  评论(0编辑  收藏  举报