浅谈Laravel中的设计模式(二) Facade 外观模式

阅读时长:5分钟

技术预备:熟悉Laravel的使用

外观模式(Facade)

一、首先什么是外观模式呢?

看过Laravel文档的童鞋一定听过门面模式,当初第一次看到这个词我是很懵逼的,门?脸?门脸都能有模式??

查阅之后,其实应该叫外观模式。

简单来说,就是为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

我们知道,定义都是很枯燥的,所以让我们来举个栗子:

$students = DB::table('student')->get();
$students = $students->toArray();
复制代码

使用过Laravel框架的童鞋们一定见过这种代码。 只需要静态调用DB类,就能够使用这个类里面的方法了,其实这种调用就叫做外观模式。 在Laravel中非常多常用的类都使用到了外观模式,例如DB、Session等。

可以看到,在这种Facade类中,都只定义了一个方法getFacadeAccessor(),那么为什么这个方法只返回“db”就可以使用了呢?我们可以去翻翻Facade类源码。

(有些童鞋不知道什么时候叫方法什么时候叫函数。如果一个代码块是独立的,那的确可以称为函数(function),但如果代码块是在类里面的,应该要称为方法(method))

可以看到,Facade这个抽象类实现了__callStatic()静态调用方法,其中又调用了getFacadeRoot(),而getFacadeRoot()里就调用了刚才的getFacadeAccessor()获取服务提供者的别名,在DB类中即“db”。 resolveFacadeInstance()就通过Laravel的容器机制把DB的实际对象解析了出来,这样既实现了单例模式,又容易调用。

(关于容器机制不了解的童鞋,请关注以后的文章哦o( ̄▽ ̄)d)

二、外观模式有什么用呢?

在一个庞大的系统中,充满了许多的子系统和子模块协作,而外部对于子系统的调用会形成非常大的耦合。

这样的耦合显然就违背了我们拆解系统的初衷,也让系统拆分失去了意义。

而外观模式其实就是为了将调用和框架解耦,减少系统中的相互依赖。 我们可以在Laravel的Application类中看到别名对应的实际类:

在这里,“db”对应的是\Illuminate\Database\DatabaseManager::class这个类。

而如果某一天,我们需要替换掉这个类,只需要将这里的DatabaseManager替换成你要的类,并不需要去修改代码逻辑。

(估计有童鞋会说:“赵童鞋你耍我呢,怎么可能替换框架的类呢?”,当一个项目足够庞大的时候,将路由类,Application容器类替换掉都是有可能的)

但是外观模式也不是没有缺点的,不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。 需要注意的是,我们不应该通过实现或者继承一个外观类,为子系统添加新的功能。 这是典型错误的做法,其违背了外观模式的初衷。

三、结语

外观模式就到这里一段落了~

如果有哪里解释不清楚的话,欢迎留言哦~

----- End -----

更多好文

请扫描下面二维码

欢迎关注~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值