decoratedShape = $decoratedShape; } //类似递归 public function draw() { $this->decoratedShape->draw(); }}//step 4 创建拓展ShapeDecorator类的实体装饰类class RedShapeDecortor extends ShapeDecorator{ function __construct(Shape $decoratedShape) { $this->decoratedShape = $decoratedShape; } public function draw() { parent::draw();// throw new Exception("Exception End : Border Color: Red\n"); printf("Border Color: Red\n"); }}class GreenShapeDecortor extends ShapeDecorator{ function __construct(Shape $decoratedShape) { $this->decoratedShape = $decoratedShape; } public function draw() { parent::draw(); throw new Exception("Exception End : Border Color: Green\n"); printf("Border Color: Green\n"); }}class BlueShapeDecortor extends ShapeDecorator{ function __construct(Shape $decoratedShape) { $this->decoratedShape = $decoratedShape; } public function draw() { parent::draw(); printf("Border Color: Blue\n"); }}function main(){ //画圈圈// $circle = new Circle();//// //画圈圈初始化,搭配颜色装饰画红色,接着再装饰一个绿色。// $shapeDecortor = new RedShapeDecortor($circle);// $shapeDecortor = new GreenShapeDecortor($shapeDecortor);// $shapeDecortor->draw(); //优点,类内部可使用异常中断。 //画矩形 $rectangle = new Rectangle(); //画矩初始化,搭配颜色装饰画红色,接着再装饰一个绿色。 $shapeDecortor = new RedShapeDecortor($rectangle); $shapeDecortor = new GreenShapeDecortor($shapeDecortor); $shapeDecortor = new BlueShapeDecortor($shapeDecortor); try { $shapeDecortor->draw(); } catch (Exception $e) { printf($e->getMessage() . "\n"); } //todo 拓展:可再配合工厂模式,生产装饰器。}main();
输出结果: