首頁  >  文章  >  後端開發  >  php設計模式之服務定位器模式實例詳解

php設計模式之服務定位器模式實例詳解

小云云
小云云原創
2018-01-25 13:56:081876瀏覽

服務定位器(service locator)他知道如何定位(建立或取得)一個應用程式所需的服務,服務使用者在實際使用中無需關心服務的實際實作。本文主要和大家分享php設計模式之服務定位器模式實例詳解,希望能幫助大家。

有什麼作用

實作服務使用者和服務的解耦,無需改變程式碼而只是透過簡單配置更服服務實作。

UML圖示
php設計模式之服務定位器模式實例詳解

#程式碼範例

class ServiceLocator {

    /**
     * 服务实例索引
     */
    privite $_services = [];

    /**
     * 服务定义索引
     */
    private $_definitions = [];
    
    /**
     * 是否全局服务共享(单例模式)
     */
    private $_shared = [];
    
    public function has($id){
        return isset($this->_services[$id]) || isset($this->_definitions[$id]);
    }
    
    public function __get($id){
        if($this->has($this->id)){
            $this->get($id);
        }
        
        // another implement
    }
    
    public function get($id){
        if(isset($this->_services[$id]) && $this->_shared[$id]){
            return $this->_services[$id];
        }
        
        if (isset($this->_definitions[$id])) {
            // 实例化
            $definition = $this->_definitions[$id];
            $object = Creator::createObject($definition);//省略服务实例化实现
            if($this->_shared[$id]){
                $this->_services[$id] = $object
            }
            
            return $object;
        }
        
        throw new Exception("无法定位服务{$id}")
    }
        
    public function set($id,$definition,$share = false){
        if ($definition === null) {
            unset($this->_services[$id], $this->_definitions[$id]);
            return;
        }
        
        unset($this->_services[$id]);
        $this->_shared[$id] = $share;
        if (is_string($definition)) {
            return $this->_definitions[$id] = $definition;
        }
        if (is_object($definition) || is_callable($definition, true)) {
            return $this->_definitions[$id] = $definition;
        }
        
        if (is_array($definition)) {
            if (isset($definition['class'])) {
                return $this->_definitions[$id] = $definition;
            }
        }
        
        throw new Exception("服务添加失败");
    }
}

相關推薦:

詳解PHP設計模式之委託模式

#詳解PHP設計模式備忘錄模式


################################################################## #詳解PHP設計模式之建造者模式###############

以上是php設計模式之服務定位器模式實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn