PHP设计模式--装饰器模式
声明:本系列博客参考资料《大话设计模式》,作者程杰。
装饰器模式又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
UML类图:
角色:
组件对象的接口:可以给这些对象动态的添加职责
所有装饰器的父类:需要定义一个与组件接口一致的接口,并持有一个Component对象,该对象其实就是被装饰的对象。
具体的装饰器类:实现具体要向被装饰对象添加的功能。用来装饰具体的组件对象或者另外一个具体的装饰器对象。
具体代码:
<?php /** * Created by PhpStorm. * User: Jiang * Date: 2015/5/3 * Time: 11:11 *//**组件对象接口 * Interface IComponent */interface IComponent{ function Display();}/**待装饰对象 * Class Person */class Person implements IComponent{ private $name; function __construct($name) { $this->name=$name; } function Display() { echo "装扮的:{$this->name}<br>"; }}/**所有装饰器父类 * Class Clothes */class Clothes implements IComponent{ protected $component; function Decorate(IComponent $component) { $this->component=$component; } function Display() { if(!empty($this->component)) { $this->component->Display(); } }}//------------------------------具体装饰器----------------class PiXie extends Clothes{ function Display() { echo "皮鞋 "; parent::Display(); }}class QiuXie extends Clothes{ function Display() { echo "球鞋 "; parent::Display(); }}class Tshirt extends Clothes{ function Display() { echo "T恤 "; parent::Display(); }}class Waitao extends Clothes{ function Display() { echo "外套 "; parent::Display(); }}
调用客户端测试代码:
header("Content-Type:text/html;charset=utf-8");//------------------------装饰器模式测试代码------------------require_once "./Decorator/Decorator.php";$Yaoming=new Person("姚明");$aTai=new Person("A泰斯特");$pixie=new PiXie();$waitao=new Waitao();$pixie->Decorate($Yaoming);$waitao->Decorate($pixie);$waitao->Display();echo "<hr>";$qiuxie=new QiuXie();$tshirt=new Tshirt();$qiuxie->Decorate($aTai);$tshirt->Decorate($qiuxie);$tshirt->Display();
适用场景:
1. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
2. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
3. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
PHP面向对象设计模式

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



PHP logging is essential for monitoring and debugging web applications, as well as capturing critical events, errors, and runtime behavior. It provides valuable insights into system performance, helps identify issues, and supports faster troubleshoot

Laravel simplifies handling temporary session data using its intuitive flash methods. This is perfect for displaying brief messages, alerts, or notifications within your application. Data persists only for the subsequent request by default: $request-

The PHP Client URL (cURL) extension is a powerful tool for developers, enabling seamless interaction with remote servers and REST APIs. By leveraging libcurl, a well-respected multi-protocol file transfer library, PHP cURL facilitates efficient execution of various network protocols, including HTTP, HTTPS, and FTP. This extension offers granular control over HTTP requests, supports multiple concurrent operations, and provides built-in security features.

Laravel provides concise HTTP response simulation syntax, simplifying HTTP interaction testing. This approach significantly reduces code redundancy while making your test simulation more intuitive. The basic implementation provides a variety of response type shortcuts: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

Do you want to provide real-time, instant solutions to your customers' most pressing problems? Live chat lets you have real-time conversations with customers and resolve their problems instantly. It allows you to provide faster service to your custom

Article discusses late static binding (LSB) in PHP, introduced in PHP 5.3, allowing runtime resolution of static method calls for more flexible inheritance.Main issue: LSB vs. traditional polymorphism; LSB's practical applications and potential perfo

Alipay PHP...

The article discusses adding custom functionality to frameworks, focusing on understanding architecture, identifying extension points, and best practices for integration and debugging.
