S4:装饰模式 Decorator

动态的给一个对象添加额外的一些职责,就增加功能而言,比继承更具灵活性.

如果仅有一个ConcreateComponent,也可以让Decorator继承ConcreateComponent来实现装饰功能,尽管这看起来很像适配器.但区别主要是语义上的.

何时使用:
1.为已有对象动态添加更能多功能.
2.新添加的功能不是对象的核心功能.

UML

示例代码:

User类提供了一个获取注册时间的方法,但获取到的时间是一个时间戳,不符合阅读习惯,我们用装饰器装饰,来获取一个较友好的时间表示.

 

class User
{
    public function getRegTime()
    {
        return time();
    }
}

class Decorator
{
    protected $user;

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

    public function getTimeForHuman()
    {
        return date('Y-m-d H:i:s', $this->user->getRegTime());
    }
}

$user = new User();
$decorator  = new Decorator($user);
echo $decorator->getTimeForHuman();

  

 

 

 

posted @ 2017-11-05 17:12  rorshach  阅读(141)  评论(0编辑  收藏  举报