外观模式(Facade)
- 目的:使子系统间的通信和相互依赖关系达到最小,而达到该目标的途径之一就是引入一个外观对象,它为子系统的访问提供了一个简单而单一的入口
- 缺点
- 不能限制子系统类的使用,限制子系统会减少可变性和灵活性。
- 新增子系统需要修改外观类的源代码,违背开闭原则
- 一个系统可以有多个外观类
- 不要通过外观类为子系统添加新行为
- 抽象外观类的引入,解决开闭原则
- 对于新的业务需求,不修改原有外观类,而对应增加一个新的具体外观类,由新的具体外观类来关联新的子系统对象,同时通过修改配置文件来达到不修改源代码并更换外观类的目的。
Facades
- bootstrap
- AliasLoader 获取 config/app.php $aliases && 包里面的类别名 来注册别名
- getInstance
- 没有实例,实例化静态实例返回
- 有实例,合并别名,设置别名,返回实例
- register
- prependToLoaderStack 未注册,加入自动加载函数队列中,头部入。
- 注册,标记已注册。
- getInstance
- 解析Facade代理的服务(假设调用router)
- 调用不存在的静态方法,会触发php的__callStatic静态方法
- 获取根对象 getFacadeRoot Route::getFacadeAccessor return ‘router’;
- 解析服务 resolveFacadeInstance static:: a p p [ app[ app[name];
- RoutingServiceProvider 注册的时候已经设置了单例,并绑定到’router’。这样1步骤就解析到了这个对象返回给开发者调用。
- a p p [ app[ app[name], 实现了 php的ArrayAccess 接口
- 获取根对象 getFacadeRoot Route::getFacadeAccessor return ‘router’;
- 调用不存在的静态方法,会触发php的__callStatic静态方法