zoukankan      html  css  js  c++  java
  • 装饰器模式

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

    $canvas1 = new IMoocCanvas();
    $canvas1->init();
    $canvas1->addDecorator(new IMoocColorDrawDecorator('green'));
    $canvas1->addDecorator(new IMoocSizeDrawDecorator('16px'));
    $canvas1->rect(3,6,4,12);
    $canvas1->draw();

    <?php
    namespace IMooc;

    class Canvas
    {
    public $data;
    protected $decorators = array();

    function init($width = 20, $height = 10)
    {
    $data = array();
    for ($i = 0; $i < $height; $i++)
    {
    for ($j = 0; $j < $width; $j++)
    {
    $data[$i][$j] = '*';
    }
    }
    $this->data = $data;
    }

    function addDecorator(DrawDecorator $decorator)
    {
    $this->decorators[] = $decorator;
    }

    function beforeDraw()
    {
    foreach ($this->decorators as $decorator)
    {
    $decorator->beforeDraw();
    }
    }

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

    function draw()
    {
    $this->beforeDraw();
    foreach ($this->data as $line)
    {
    foreach ($line as $char)
    {
    echo $char;
    }
    echo "<br/> ";
    }
    $this->afterDraw();
    }

    function rect($a1, $a2, $b1, $b2)
    {
    foreach ($this->data as $k1 => $line)
    {
    if ($k1 < $a1 or $k1 > $a2) continue;
    foreach ($line as $k2 => $char)
    {
    if($k2 < $b1 or $k2 > $b2) continue;
    $this->data[$k1][$k2] = '&nbsp';
    }
    }
    }
    }

    <?php
    namespace IMooc;

    interface DrawDecorator
    {
    function beforeDraw();
    function afterDraw();
    }

    <?php
    namespace IMooc;

    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>";
    }
    }

    <?php
    namespace IMooc;

    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>";
    }
    }




  • 相关阅读:
    120所国家重点建设大学(211工程和教育部直属)[国家一类本科大学]详细情况一览表
    VC画线几个常见方法
    中国地学35个国家重点实验室分布一览
    可执行文件加入Linux默认路径的办法
    SVN 常用命令 客户端
    ls(list) linux 功能说明
    Vim
    Linux添加FTP用户并设置权限
    tar [cxtzjvfpPN] 文件与目录
    linux etc/passwd 有关
  • 原文地址:https://www.cnblogs.com/phonecom/p/31f8ebe6aa63bbe68eff11674dc10bb9.html
Copyright © 2011-2022 走看看