资讯专栏INFORMATION COLUMN

【php实现设计模式】之服务定位器模式

CarterLi / 364人阅读

摘要:图示代码示例服务实例索引服务定义索引是否全局服务共享单例模式实例化省略服务实例化实现无法定位服务服务添加失败感谢文中图片来源来源网络

什么是服务定位器

服务定位器(service locator)他知道如何定位(创建或者获取)一个应用所需要的服务,服务使用者在实际使用中无需关心服务的实际实现。

有什么作用

实现服务使用者和服务的解耦,无需改变代码而只是通过简单配置更服服务实现。

UML图示

代码示例

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("服务添加失败");
    }
}

感谢

文中图片来源来源网络 http://designpatternsphp.read...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23128.html

相关文章

  • PHP回顾执行流程及相关概念

    摘要:通过,脚本层无需过多考虑执行的具体环境,而本身则可以让针对自己的特点给出特有实现。模式下,也只执行一次。这几个概念的关系如下网关协议,与语言无关,所以与关系也不大。总结本文简要回顾了程序的架构和执行流程,并对几个容易混淆概念做了介绍。 转载请注明文章出处:https://tlanyan.me/php-review... PHP回顾系列目录 PHP基础 web请求 cookie we...

    jsdt 评论0 收藏0
  • PHP回顾socket编程

    摘要:如果你想体验原味编程,用开头的比较适合否则建议使用流函数。有关流的知识,请参考本人之前的博文回顾之流。接下来我们用流函数实现一个简单的客户端和服务端。流函数中的和两个函数是我们想要的。本文目的是简要介绍中的编程,行文到此已经达到目的。 转载请注明文章出处: https://tlanyan.me/php-review... PHP回顾系列目录 PHP基础 web请求 cookie w...

    tomorrowwu 评论0 收藏0
  • php资料集

    摘要:简单字符串缓存实战完整实战种设计模式设计模式是面向对象的最佳实践成为专业程序员路上用到的各种优秀资料神器及框架成为一名专业程序员的道路上,需要坚持练习学习与积累,技术方面既要有一定的广度,更要有自己的深度。 微型新闻系统的开发(PHP 5.4 + MySQL 5.5) 微型新闻系统的开发(PHP 5.4 + MySQL 5.5) 九个很有用的 PHP 代码 php 代码 国内值得关注的...

    RobinQu 评论0 收藏0
  • 合格PHP工程师的知识结构

    摘要:不是原创的,主要是看了觉得有些帮助,就分享给大家看看。对于的知识要求我觉得以鸟哥的私房菜这本书作为要求吧。前端大部分使用,对静态资源使用可以加载更快。其实编程使用什么语言不重要,最重要的是思想,编程的思路。 不是原创的,主要是看了觉得有些帮助,就分享给大家看看。 PHP的运行环境 连环境都搞不起来,就是你有多么喜欢PHP,那也是白搭,开始我们大多会使用集成环境软件例如xampp,wam...

    KaltZK 评论0 收藏0
  • PHP 设计模式》翻译完毕

    摘要:创建型设计模式通过控制这个对象的创建方式来解决此问题。通过这样做,这些模式增加了执行此通信的灵活性。已于年月日翻译完毕,参与用户人,详细列表请见参与译者。 showImg(https://segmentfault.com/img/bV6R8Q?w=1024&h=683); 翻译进度请见:https://laravel-china.org/doc... 设计模式不仅代表着更快开发健壮软件...

    verano 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<