PHP设计模式装饰器模式实例

我们在使用面向对象的日常开发过程中,或许会碰见需要对某个方法或者某个对象,添加新的行为。然而常见的做法是,写一个子类继承需要改写的类,然后去重新实现类的方法。

但是装饰器模式(Decorator),可以动态地添加修改类的功能,在使用装饰器模式,仅需在运行时添加一个装饰器对象既可实现,相对与生成子类更加的灵活。

在我们需要改写一个类的时候通常的做法是采用继承的方式来重新方法,如下代码

/*
 * 比如我们需要改写一串字符串的样式,采用继承的写法。
 */
class Canvas {
    function draw($width = 20, $height = 10) {
        for($i = 0; $i < $height; $i++) {
            for($j = 0; $j < $width; $j++) {
                echo '*';
            }
            echo '<br/>';
         }
     }
}
class Canvas2 extends Canvas {
    function draw($width = 20, $height = 10) {
        echo "<div style='color: red;'>";
        parent::draw($width, $height);
        echo "</div>";
    }
}
$Canvas2 = new Canvas2();
$Canvas2->draw();

对于上面的这种写法,假如我们需要多增加一个一种样式就需要多一个继承。接下来使用装饰器模式(Decorator)就会方便很多。

/*

 * 首先声明一个装饰器的接口

 */

interface DrawDecorator {

    function beforeDraw();

    function afterDraw();

}

接下来再分别添加两个装饰类,来继承接口,实现接口中的方法

/*
 * 颜色装饰
 */
class ColorDrawDecorator implements DrawDecorator {
    protected $color;
    function __construct($color = 'red') {
        $this->color = $color;
    }
    function beforeDraw() {
        echo "<div style='color: {$this->color};'>";
    }
    function afterDraw() {
        echo "</div>";
    }
}
/*
 * 字体大小装饰
 */
class SizeDrawDecorator implements DrawDecorator {
    protected $size;
    function __construct($size = '14px') {
        $this->size = $size;
    }
    function beforeDraw() {
        echo "<div style='font-size: {$this->size};'>";
    }
    function afterDraw() {
        echo "</div>";
    }
}

接下来就是使用我们前面所创建的装饰类

/*
 * 创建一个画布类
 */
class Canvas {
    protected $decorators = array(); //用来存放装饰的数组
    function draw($width = 20, $height = 10) {
        $this->beforeDraw();
        for($i = 0; $i < $height; $i++) {
            for($j = 0; $j < $width; $j++)
            {
                echo '*';
            }
            echo '<br/>';
        }
        $this->afterDraw();
    }
    //添加装饰器的方法
    function addDecorator(DrawDecorator $decorator) {
        $this->decorators[] = $decorator;
    }
    function beforeDraw() {
        foreach($this->decorators as $decorator) {
            $decorator->beforeDraw();
        }
    }
    function afterDraw() {
        $decorators = array_reverse($this->decorators);
        foreach($decorators as $decorator) {
            $decorator->afterDraw();
        }
    }
}
$Canvas = new Canvas();
$Canvas->addDecorator(new ColorDrawDecorator('red'));
$Canvas->addDecorator(new SizeDrawDecorator('9px'));
$Canvas->draw(20, 10);

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索class
, 面向对象
, 接口
, canvas
, this
模式
装饰模式 实例、php 观察者模式实例、php 工厂模式 实例、php mvc设计模式实例、php装饰器模式,以便于您获取更多的相关知识。

时间: 2024-10-25 06:35:42

PHP设计模式装饰器模式实例的相关文章

PHP设计模式——装饰器模式

声明:本系列博客参考资料<大话设计模式>,作者程杰.         装饰器模式又叫装饰者模式.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.         UML类图:                  角色:        组件对象的接口:可以给这些对象动态的添加职责        所有装饰器的父类:需要定义一个与组件接口一致的接口,并持有一个Component对象,该对象其实就是被装饰的对象.      

实例讲解Ruby使用设计模式中的装饰器模式的方法_ruby专题

概述       若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一  个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类-这建立在额外的代码上.       通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办?前一个,只

设计模式(八)装饰器模式Decorator(结构型)

1. 概述        若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类-这建立在额外的代码上.       通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办?前一个

PHP、Python和Javascript的装饰器模式对比_php实例

修饰模式(Decorator Pattern),又叫装饰者模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式.就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能.装饰模式非常适用于灵活扩展对象的功能,下面是装饰模式的UML图: 例如,有一个技术论坛,用户通过留言进行沟通,由于刚开始论坛里都是熟人,几乎都不需要对留言的内容作出审核,接收留言的页面可以是这样: class SaveMsg(){ private $msg; public funct

深入解析设计模式中的装饰器模式在iOS应用开发中的实现_IOS

装饰器模式可以在不修改代码的情况下灵活的为一对象添加行为和职责.当你要修改一个被其它类包含的类的行为时,它可以代替子类化方法. 一.基本实现下面我把类的结构图向大家展示如下: 让我们简单分析一下上面的结构图,Component是定义一个对象接口,可以给这些对象动态地添加职责.ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责.Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知

PHP设计模式之装饰器模式

装饰器设计模式适用于下列工作场合: 需求变化是快速和细小的,而且几乎不影响应用程序的其他部分.() 使用装饰器设计模式设计类的目标是: 不必重写任何已有的功能性代码,而是对某个基于对象应用增量变化. 装饰器设计模式采用这样的构建方式: 在主代码流中应该能够直接插入一个或多个更改或"装饰"目标对象的装饰器,同时不影响其他代码流. <?php        class CD {            public $trackList;                        

php设计模式介绍之装饰器模式

若你从事过面向对象的php开发,即使很短的时间或者仅仅通过本书了解了一些,你会知道,你可以 通过继承改变或者增加一个类的功能,这是所有面向对象语言的一个基本特性.如果已经存在的一个php 类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类 -这建立在额外的代码上. 但是产生子类并不总是可能或是合适的.如果 你希望改变一 个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办?前一个,只能在于 运行时完成,后者显然时可能的,但是可能会导致

java IO之 字符流 (字符流 = 字节流 + 编码表) 装饰器模式

字符流 计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此, 从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符 层次的编码和解码.列如,在写入一个字符时,Java虚拟机会将字符转为文件指定的编码(默认 是系统默认编码),在读取字符时,再将文件指定的编码转化为字符. 常见的码表如下: ASCII:           美国标准信息交换码.用一个字节的7位可以表示. ISO8859-1:   拉丁码表.欧洲码表,用一个字节的8位表示.又称

Java 装饰器模式详解

转载请注明出处:http://blog.csdn.net/zhaoyanjun6/article/details/56488020 前言 在上面的几篇文章中,着重介绍了java 中常见的 IO 相关知识,在学习的过程中,发现 IO 包中是用了大量的装饰器模式,为了彻底的学习 IO,今天就来揭开装饰器模式的面纱. 为了弄明白装饰器模式的本质,我查看了很多资料,发现有很多文章要么说的很苦涩,要么举的例子不恰当. 其实我们可以这样理解装饰器模式, 就拿自己举例子,你把自己裸体的样子,想象成被装饰的对象