<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 第10章 原型模式 ### 第一步:準備了1個畫布的類 *D:\wamp\www\demo\oop\framework\Think\Canvas.php* ~~~ <?php namespace Think; 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 draw() { foreach($this->data as $line) { foreach($line as $char) { echo $char; } echo "<br />\n"; } } 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] = '+'; } } } } ~~~ 在 `init` 方法中循環輸出一張畫布,類似這樣的初始化操作,其實都是比較耗費資源的。 *D:\wamp\www\demo\oop\framework\index.php* ~~~ $canvas1 = new Think\Canvas(); $canvas1->init(); $canvas1->rect(2,7,2,18); $canvas1->draw(); echo "<hr/>"; $canvas2 = new Think\Canvas(); $canvas2->init(); $canvas2->draw(); ~~~ 效果圖: ![](./img/10/01.png) ## 第二步:使用原型 我們可以看出,每次new這個對象,其實很耗費資源,這里我們來使用 `clone` 原型對象。 ~~~ // 生成1個原型對象 $prototype = new Think\Canvas(); $prototype->init(); // $canvas1 = new Think\Canvas(); $canvas1 = clone($prototype); $canvas1->rect(2,7,2,18); $canvas1->draw(); echo "<hr/>"; $canvas2 = clone($prototype); $canvas2->rect(3,5,2,10); $canvas2->draw(); ~~~ 總結:像這個原型只有1個初始化方法而已,像比較復雜的類,還有如:設置顏色,大小等等,越復雜的類,使用原型對象就越能夠節省資源。 ### 第二步:創建1個裝飾器接口 *D:\wamp\www\demo\oop\framework\Think\DrawDecorator.php* ~~~ <?php namespace Think; // 聲明1個裝飾器接口 interface DrawDecorator { function beforeDraw(); function afterDraw(); } ~~~ ### 第三步:添加裝飾器方法 *D:\wamp\www\demo\oop\framework\Think\Canvas.php* ~~~ function draw() { $this->beforeDraw(); // 裝飾器方法 foreach($this->data as $line) { foreach($line as $char) { echo $char; } echo "<br />\n"; } $this->afterDraw(); // 裝飾器方法 } ~~~ 添加裝飾器: ~~~ protected $decorators = array(); ... // 添加裝飾器 function addDecorator(DrawDecorator $decorator) { $this->decorators[] = $decorator; } // Draw裝飾方法1 function beforeDraw() { foreach($this->decorators as $decorator) { $decorator->beforeDraw(); } } // Draw裝飾方法2 function afterDraw() { $decorators = array_reverse($this->decorators); foreach($decorators as $decorator) { $decorator->afterDraw(); } } ~~~ ### 第三步:創建1個顏色的裝飾器,1個大小的裝飾器 *D:\wamp\www\demo\oop\framework\Think\ColorDrawDecorator.php* ~~~ <?php namespace Think; class ColorDrawDecorator implements DrawDecorator { protected $color = 'black'; function __construct($color) { $this->color = $color; } function beforeDraw() { echo "<div style='color:" . $this->color . "'>"; } function afterDraw() { echo "</div>"; } } ~~~ *D:\wamp\www\demo\oop\framework\Think\SizeDrawDecorator.php* ~~~ <?php namespace Think; class SizeDrawDecorator implements DrawDecorator { protected $size = 'black'; function __construct($size) { $this->size = $size; } function beforeDraw() { echo "<div style='font-size:" . $this->size . "'>"; } function afterDraw() { echo "</div>"; } } ~~~ ### 第四步:裝飾器的使用 *D:\wamp\www\demo\oop\framework\index.php* ~~~ // 裝飾模式的使用 $canvas1 = new Think\Canvas(); $canvas1->init(); // 添加裝飾器 $canvas1->addDecorator(new Think\ColorDrawDecorator('green')); $canvas1->addDecorator(new Think\SizeDrawDecorator('20px')); $canvas1->rect(2,7,2,18); $canvas1->draw(); ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看