9.原型模式

来源:互联网 发布:json在线编辑器 编辑:程序博客网 时间:2024/05/17 23:18

这里写图片描述
原始方法:

index.php

define('BASEDIR',__DIR__);include BASEDIR . '/IMooc/Loader.php';spl_autoload_register('\\IMooc\\Loader::autoload');$canvas1 = new IMooc\Canvas();$canvas1->init();//镂空$canvas1->rect(3,6,4,12);$canvas1->draw();echo '<br/>======================================<br/><br/><br/>';//传统方式,new 两个对象$canvas2 = new IMooc\Canvas();$canvas2->init();//镂空$canvas2->rect(3,6,4,12);$canvas2->draw();

原型模式:

Canvas.php

<?phpnamespace IMooc;//模拟一个画布class Canvas{    public $data;    protected $decorators = array();    //Decorator    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($decorators as $decorator)        {            $decorator->afterDraw();        }    }    function draw()    {        $this->beforeDraw();        foreach($this->data as $line)        {            foreach($line as $char)            {                echo $char;            }            echo "<br />\n";        }        $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;';            }        }    }}

index.php

<?phpdefine('BASEDIR',__DIR__);include BASEDIR . '/IMooc/Loader.php';spl_autoload_register('\\IMooc\\Loader::autoload');//新建一个原型方法$prototype = new IMooc\Canvas();//只进行了一次 init;$prototype->init();//------------$canvas1 = clone $prototype;$canvas1->rect(3,6,4,12);$canvas1->draw();echo '<br/>======================================<br/><br/><br/>';$canvas2 = clone $prototype;$canvas2->rect(5,10,15,20);$canvas2->draw();
0 0
原创粉丝点击