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();