1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <?php class baseart{ public $content ; protected $art = null; public function __construct( $content ){ $this ->content = $content ; } public function decorator(){ return $this ->content; } } //编辑文章 class bianart extends baseart{ public function __construct(baseart $art ){ $this ->art = $art ; } public function decorator(){ return $this ->content = $this ->art->decorator(). "--小编摘要--" ; } } //编辑文章 class seoart extends baseart{ public function __construct(baseart $art ){ $this ->art = $art ; } public function decorator(){ return $this ->content = "--seo--" . $this ->art->decorator(); } } $b = new seoart( new bianart( new baseart( "天天向上" ))); echo $b ->decorator(); |
另外一个例子:
<?php /** * Class Component * Component抽象类, 可以给这些对象动态的添加职责 */ abstract class Component { abstract public function operation(); } /** * Component的实现类 * Class ConcreteComponent */ class ConcreteComponent extends Component { public function operation() { echo __CLASS__ . '|' . __METHOD__ . "\r\n"; } } /** * Class Decorator * 装饰器的抽象类,维持一个指向组件对象的接口对象, 并定义一个与组件接口一致的接口 */ abstract class Decorator extends Component { /** * 持有Component的对象 */ protected $component; /** * 构造方法传入 */ public function __construct(Component $component) { $this->component = $component; } abstract public function operation(); } /** * Class ConcreteDecoratorA * 装饰器的具体实现类,向组件对象添加职责,beforeOperation(),afterOperation()为前后添加的职责。 */ class ConcreteDecoratorA extends Decorator { //在调用父类的operation方法的前置操作 public function beforeOperation() { echo __CLASS__ . '|' . __METHOD__ . "\r\n"; } //在调用父类的operation方法的后置操作 public function afterOperation() { echo __CLASS__ . '|' . __METHOD__ . "\r\n"; } public function operation() { $this->beforeOperation(); $this->component->operation();//这里可以选择性的调用父类的方法,如果不调用则相当于完全改写了方法,实现了新的功能 $this->afterOperation(); } } class ConcreteDecoratorB extends Decorator { //在调用父类的operation方法的前置操作 public function beforeOperation() { echo __CLASS__ . '|' . __METHOD__ . "\r\n"; } //在调用父类的operation方法的后置操作 public function afterOperation() { echo __CLASS__ . '|' . __METHOD__ . "\r\n"; } public function operation() { $this->beforeOperation(); $this->component->operation();//这里可以选择性的调用父类的方法,如果不调用则相当于完全改写了方法,实现了新的功能 $this->afterOperation(); } } //客户端使用装饰器 $component = new ConcreteComponent(); $decoratorA = new ConcreteDecoratorA($component); $decoratorB = new ConcreteDecoratorB($decoratorA); $decoratorB->operation();
1 2 3 4 5 | ConcreteDecoratorB|ConcreteDecoratorB::beforeOperation ConcreteDecoratorA|ConcreteDecoratorA::beforeOperation ConcreteComponent|ConcreteComponent::operation ConcreteDecoratorA|ConcreteDecoratorA::afterOperation ConcreteDecoratorB|ConcreteDecoratorB::afterOperation |
本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/p/8691474.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能