文档章节

php设计模式之装饰器模式

别人说我名字很长
 别人说我名字很长
发布于 2016/02/13 10:09
字数 295
阅读 28
收藏 0
<?php

namespace Tools;

    /*
    装饰器模式
    装饰器模式(decorator),可以动态的添加修改类的功能
    一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现类的方法
    使用装饰器模式,仅需在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性。
    */

//装饰器接口
interface Decorator{
    public function before();
    public function after();
}

//颜色的装饰器
class ColorDecorator implements \Tools\Decorator{
    private $color;
    public function __construct($color="chocolate")
    {
        $this->color = $color;
    }

    public function before(){
        return "<div style=\"background-color: {$this->color};\">";
    }

    public function after(){
        return '</div>';
    }
}

//字体的装饰器
class SizeDecorator implements \Tools\Decorator{
    private $size;
    public function __construct($size="16px")
    {
        $this->size = $size;
    }

    public function before(){
        return "<span style='font-size:{$this->size};'>";
    }

    public function after(){
        return '</span>';
    }
}

//使用装饰器
class draw{

    private $decorators = array();

    public function addDecorator(\Tools\Decorator $decorator){
        $this->decorators[] = $decorator;
    }

    public function before(){
        foreach($this->decorators as $docorator){
            echo $docorator->before();
        }
    }

    public function after(){
        $decorators = array_reverse($this->decorators);
        foreach($decorators as $decorator){
            echo $decorator->after();
        }
    }

    public function show(){
        $this->before();
        echo '这里是内容输出';
        $this->after();
    }
}

//在运行时添加装饰器对象
$d = new \Tools\draw();
$d->addDecorator(new \Tools\ColorDecorator("#f00"));
$d->addDecorator(new \Tools\SizeDecorator("16px"));
$d->show();



© 著作权归作者所有

共有 人打赏支持
别人说我名字很长
粉丝 55
博文 254
码字总数 103692
作品 0
济南
程序员
编程中的那些套路——关于策略模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天讲讲策略模式,策略模式 和工厂模式十分相像(或者说在代码逻辑层面,他们是一样的)。 但策略模式与...

gzchen
08/27
0
0
编程中的那些经典套路——设计模式汇总

在正式阅读前,我先谈谈我们该用什么姿势和心态学习设计模式: 如果你还没有过多的编程经验(泛指半年以下),我建议你把它当做小说来看,能看懂多少是多少,因为半年以下经验的程序员用到设...

gzchen
08/27
0
0
编程中的那些套路——关于单例模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 在设计模式中,单例模式和工厂模式)可以说是使用的最普遍的设计模式了,所以掌握此种模式尤为重要。 单...

gzchen
08/27
0
0
php各种设计模式简单实践思考

前言 我一直觉得什么框架,版本,甚至语言对于一个coder来说真的不算什么,掌握一个特别高大上的一个框架或者是一个新的,少众的语言真的不算什么,因为你可以,我要花时间也可以,大家都是这...

michaelgbw
2016/06/13
0
0
javascript 设计模式之工厂(Factory)模式

工厂模式介绍 工厂模式是一个创建型的模式,主要就是创建对象。其中工厂模式又分为简单工厂模式和抽象工厂模式。简单工厂模式是通过工厂方法确定创建 对应类型的对象。抽象工厂模式是通过子类...

hlxiong
2014/04/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

python做文本内容指定区域字符串替换

需求: 因为公司项目需要做SEO优化,所以对项目中的各种长连接做优化,比如本文中提到的精简路径;之前已经批量吧文本的路径名字等做过修改,这里不再赘述;这里的问题是外部的路径修改了,文...

坦途abc
23分钟前
3
0
MySQL 关键字模糊匹配,并按照匹配度排序

MySQL 关键字模糊匹配,并按照匹配度排序。 方式一、按照关键字搜索,然后根据关键字所占比例排序 SELECTdrug_name,pinyinFROMtbl_drugWHEREpinyin LIKE '%AM%'ORDER BY...

yh32
33分钟前
2
0
虚拟机学习之一:java内存区域与内存溢出异常

1.运行时数据区域 java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途和创建、销毁时间,有的区域伴随虚拟机进程的启动而存在,有些区...

贾峰uk
33分钟前
0
0
Spring加载properties文件的两种方式

在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取properties里面的配置,这样后期只需要改动properties文件即可,不需要修...

架构师springboot
50分钟前
1
0
分布式事务,原来可以这么玩?

多个数据要同时操作,如何保证数据的完整性,以及一致性? 答 : 事务 ,是常见的做法。 举个栗子: 用户下了一个订单,需要修改 余额表 , 订单 表 , 流水 表 ,于是会有类似的伪代码: st...

微笑向暖wx
52分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部