首页  >  文章  >  php教程  >  php设计模式 装饰器模式,php设计模式

php设计模式 装饰器模式,php设计模式

WBOY
WBOY原创
2016-06-13 08:45:171016浏览

php设计模式 装饰器模式,php设计模式

装饰器模式,可以动态地添加修改类的功能。

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

<span>DrawDecorator</span>.php
<?<span>php
namespace Baobab;
</span><span>/*</span><span>*
 * Interface DrawDecorator
 * @package Baobab
 * 装饰器接口,定义两个方法,渲染画布之前和之后可添加额外的能力
 </span><span>*/</span>
<span>interface</span><span> DrawDecorator{
    </span><span>function</span><span> beforeDraw();
    </span><span>function</span><span> afterDraw();
}</span>
<span>Canvas</span>.php
<?<span>php
namespace Baobab;
<br /><span>/**</span><br /><span>*Canvas类,绘制图形</span><br /><span>**/</span><br />
</span><span>class</span><span> Canvas
{
    </span><span>public</span> <span>$data</span><span>;
    </span><strong><span>protected</span> <span>$decorators</span> = <span>array</span><span>();

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

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

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

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

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

    </span><span>function</span> rect(<span>$a1</span>, <span>$a2</span>, <span>$b1</span>, <span>$b2</span><span>)
    {
        </span><span>foreach</span>(<span>$this</span>->data <span>as</span> <span>$k1</span> => <span>$line</span><span>)
        {
            </span><span>if</span> (<span>$k1</span> < <span>$a1</span> or <span>$k1</span> > <span>$a2</span>) <span>continue</span><span>;
            </span><span>foreach</span>(<span>$line</span> <span>as</span> <span>$k2</span> => <span>$char</span><span>)
            {
                </span><span>if</span> (<span>$k2</span> < <span>$b1</span> or <span>$k2</span> > <span>$b2</span>) <span>continue</span><span>;
                </span><span>$this</span>->data[<span>$k1</span>][<span>$k2</span>] = ' '<span>;
            }
        }
    }
}</span>
<span>ColorDrawDecorator</span>.php
<?<span>php
namespace Baobab;
<span>/**</span><br /><span>*修改图形颜色的装饰器</span><br /><span>*/
</span></span><span>class</span> ColorDrawDecorator <span>implements</span><span> \Baobab\DrawDecorator{
    </span><span>protected</span> <span>$color</span><span>;
    </span><span>function</span> __construct(<span>$color</span> = 'black'<span>){
        </span><span>$this</span>->color = <span>$color</span><span>;
    }

    </span><span>function</span><span> beforeDraw(){
        </span><span>echo</span> "<div style='color: {<span>$this</span>->color};'>"<span>;
    }<br />
    </span><span>function</span><span> afterDraw(){
        </span><span>echo</span> "</div>"<span>;
    }
}</span>
<span>SizeDrawDecorator</span>.php
<?<span>php
namespace Baobab;
<span><span>/**<br /><span>*修改图形大小的装饰器<br /><span>*/
</span></span></span></span>
</span><span>class</span> SizeDrawDecorator <span>implements</span><span> \Baobab\DrawDecorator{
    </span><span>protected</span> <span>$size</span><span>;
    </span><span>function</span> __construct(<span>$size</span> = '12px'<span>){
        </span><span>$this</span>->size = <span>$size</span><span>;
    }

    </span><span>function</span><span> beforeDraw()
    {
        </span><span>echo</span> "<div style='font-size: {<span>$this</span>->size};'>"<span>;
    }<br />
    </span><span>function</span><span> afterDraw()
    {
        </span><span>echo</span> "</div>"<span>;
    }
}</span>

index.php

<span>$canvas</span> = <span>new</span><span> Baobab\Canvas();
</span><span>$canvas</span>-><span>init();
</span><span>$canvas</span>->rect(3, 6,4,12<span>);

</span><span>$canvas</span>->addDecorator(<span>new</span> \Baobab\ColorDrawDecorator('blue'<span>));
</span><span>$canvas</span>->addDecorator(<span>new</span> \Baobab\SizeDrawDecorator('10px'<span>));<br />......<br />//可添加其他更多装饰器<br />
</span><span>$canvas</span>->draw();

 

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn