servlet+jsp實現分頁功能
阿新 • • 發佈:2020-06-29
裝飾器模式(Decorator Pattern)允許向一個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的一個包裝。
這種模式建立了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。
我們通過下面的例項來演示裝飾器模式的用法。其中,我們將把一個形狀裝飾上不同的顏色,同時又不改變形狀類。
優點:
裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態擴充套件一個實現類的功能。
缺點:
多層裝飾比較複雜。
舉例:
//Shape.class.php(抽象介面) <?php namespace Decorator;interface Shape { public function draw(); }
//Circle.class.php(圓形具體實現類) <?php namespace Decorator; class Circle implements Shape { public function draw() { print_r("Shape: Circle" ); } }
//Rectangle.class.php(長方形具體實現類) <?php namespace Decorator; class Rectangle implementsShape { public function draw() { print_r("Shape: Rectangle"); } }
//ShapeDecorator.class.php(形狀裝飾類 抽象父類) <?php namespace Decorator; abstract class ShapeDecorator implements Shape { protected $decoratorShape; public function __construct(Shape $shape) {$this->decoratorShape = $shape; } public function draw() { $this->decoratorShape->draw(); } }
// 繼承形狀裝飾抽象類,定義顏色 <?php namespace Decorator; class RedShapeDecorator extends ShapeDecorator{ public function __construct(Shape $shape) { parent::__construct($shape); } public function draw() { $this->decoratorShape->draw(); $this->setRedColor($this->decoratorShape); } private function setRedColor(Shape $shape) { print_r("red"); } }
// 入口檔案 <?php spl_autoload_register(function ($className){ $className = str_replace('\\','/',$className); include $className.".class.php"; }); use Decorator\Circle; use Decorator\RedShapeDecorator; $circle = new Circle(); $redCircle = new RedShapeDecorator(new Circle()); $redCircle->draw();
執行結果