装饰器

装饰器(Decorator)是在不影响同类其他对象行为的前提下,为单个类添加额外功能的简单工具。

罗伯特-C-马丁(Robert C. Martin,我在本章开头介绍过他)提出的 "单一责任原则"(Single Responsibility Principle)简单地说,就是一个类只有一个原因需要更改。

该原则指出,每个模块或类都应承担单一责任,而且该责任应完全由该类封装。类的所有服务都应与该责任保持一致。马丁对责任的定义总结如下:

“分配给特定参与者的费用,以表明其对特定业务任务的责任”。

通过使用装饰器设计模式,我们能够确保功能在具有独特关注领域的类之间划分,从而遵守单一职责原则。

让我们首先声明我们的 Book 接口。这是我们期望我们的书籍能够产生的结果:

Unresolved include directive in modules/ROOT/pages/ch04/ch4-02.adoc - include::example$/Chapter 4/Decorator/Book.php[]

然后我们可以声明我们的 EBook.php 类。这是我们将用 PrintBook 类装饰的类:

Unresolved include directive in modules/ROOT/pages/ch04/ch4-02.adoc - include::example$/Chapter 4/Decorator/EBook.php[]

现在我们可以声明 PrintBook 类。这就是我们用来装饰 EBook 类的内容:

Unresolved include directive in modules/ROOT/pages/ch04/ch4-02.adoc - include::example$/Chapter 4/Decorator/PrintBook.php[]

现在让我们用我们的 index.php 文件来测试这一切:

Unresolved include directive in modules/ROOT/pages/ch04/ch4-02.adoc - include::example$/Chapter 4/Decorator/index.php[]

输出如下所示:

Some contents. by Junade Ali
Some contents.