類的自動載兼觀察者模式的設計

  • spl_autoload_register函數的調用autoload引入文件。
  • 觀察者設計模式:當對象的屬性發生改變的時候,依賴他的對象會接收到通知,而且更新相應的屬性。
  • 場景:當一個事件的發生,有一大連串的邏輯要改動,傳統的編程方式用if else 等冗餘複雜的去修改,這種方式高度耦合的,入侵式更新機制,當邏輯修改得越多的時候代碼是很難維護的。
  • 觀察者模式:實現低耦合,非入侵式的更新機制。

爲了方便理解,這是個人目錄結構php

自動加載類文件的代碼編程

<?php
/*
 * 1.實現類的自動加載
 * 2.設計模式 之 觀察者模式
 */
define ('BASEDIR',__DIR__);
require "Loader.php";
//自動載入類文件
spl_autoload_register('Loader::autoload');
<?php
class  Loader{

    static function autoload($class)
    {
        //引入相應的文件
        require BASEDIR.'/'.str_replace('\\', '/', $class).'.php';
    }
}

觀察者的生產代碼設計模式

<?php
abstract class Event
{
    //觀察事件通常不可見
    private $observer = array();

    public function addObserve(Observer $observer){
            //將觀察者添加到數組
            $this->observer[] = $observer;
    }
    public function notify()
    {
        //遍歷更新輸出
        foreach ($this->observer as $value) {
            $value->update();
        }
    }
}

更新的契約接口數組

<?php
interface Observer{
   //契約接口的聲明
    public function update();

}

主體觀察者模式測試代碼(也是入口文件)函數

<?php
/*
 * 1.實現類的自動加載
 * 2.設計模式 之 觀察者模式
 */
define ('BASEDIR',__DIR__);
require "Loader.php";
//自動載入類文件
spl_autoload_register('Loader::autoload');

class Genertor extends Event
{
    public  function  trigger(){
        echo "邏輯·1\n";
        $this->notify();
    }
}
class Test1 implements Observer
{
  public function update(){
      echo "我是Test事件1\n";
  }
}
class Test2 implements Observer
{
    public function update(){
        echo "我是Test事件2\n";
    }
}
class Test3 implements Observer
{
    public function update(){
        echo "我是Test事件3\n";
    }
}
class Test4 implements Observer
{
    public function update(){
        echo "我是Test事件4\n";
    }
}
$event = New Genertor();
$event->addObserve(new Test1);
$event->addObserve(new Test2);
$event->addObserve(new Test3);
$event->addObserve(new Test4);
$event->trigger();
?>

測試結果測試

相關文章
相關標籤/搜索