Laravel框架中外观模式的深入解析
发布时间 - 2018-07-31 00:00:00 点击率:次laravel框架中的外观模式(facade pattern)是外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。
Laravel中我们常用到的Route、Redis、Auth这些Facade就是外观模式的具体实现, 在Laravel中设计了多个外观类,每个外观类继承自统一的抽象外观类,在抽象外观类里提供了通过外观类访问其背后子系统的基础方法。
对于新的业务需求,不要修改原有外观类,而应该增加一个新的具体外观类,由新的具体外观类来关联新的子系统对象,同时通过修改配置文件来达到不修改源代码并更换外观类的目的。
下面是一个简单的外观模式的例子,并没有引入抽象外观类,在介绍Laravel Facade的文章中我们会看到Laravel里提供了一个抽象外观类从而让我们能够方便的根据需要增加新子系统的外观类,并让外观类能够正确代理到其对应的子系统(或者叫服务)。
模式结构
外观模式包含如下角色:
Facade 外观角色
SubSystem 子系统角色
代码示例
operation();
}
}
class Facade
{
private $systemA;
private $systemB;
public function __construct()
{
$this->systemA = new SystemA;
$this->systemB = new SystemB;
}
public function operation()
{
$this->systemA->operationA();
$this->systemB->operationB();
}
}
class SystemA
{
public function operationA()
{
//
}
}
class SystemB
{
public function operationB()
{
//
}
}模式分析
根据“单一职责原则”,在软件中将一个系统划分为若干个子系统有利于降低整个系统的复杂性,一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,而达到该目标的途径之一就是引入一个外观对象,它为子系统的访问提供
了一个简单而单一的入口。 -外观模式也是“迪米特法则”的体现,通过引入一个新的外观类可以降低原有系统的复杂度,同时降低客户类与子系统类的耦合度。 - 外观模式要求一个子系统的外部与其内部的通信通过一个统一的外观对象进行,外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打交道,而不需要与子系统内部的很多对象打交道。 -外观模式的目的在于降低系统的复杂程度。 -外观模式从很大程度上提高了客户端使用的便捷性,使得客户端无须关心子系统的工作细节,通过外观角色即可调用相关功能。
缺点
外观模式的缺点
不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。
在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
模式扩展
-
一个系统有多个外观类
在外观模式中,通常只需要一个外观类,并且此外观类只有一个实例,换言之它是一个单例类。在很多情况下为了节约系统资源,一般将外观类设计为单例类。当然这并不意味着在整个系统里只能有一个外观类,在一个系统中可以设计多个外观类,每个外观类都负责和一些特定的子系统交互,向用户提供相应的业务功能。
-
不要试图通过外观类为子系统增加新行为
不要通过继承一个外观类在子系统中加入新的行为,这种做法是错误的。外观模式的用意是为子系统提供一个集中化和简化的沟通渠道,而不是向子系统加入新的行为,新的行为的增加应该通过修改原有子系统类或增加新的子系统类来实现,不能通过外观类来实现。
-
抽象外观类的引入
外观模式最大的缺点在于违背了“开闭原则”,当增加新的子系统或者移除子系统时需要修改外观类,可以通过引入抽象外观类在一定程度上解决该问题,客户端针对抽象外观类进行编程。对于新的业务需求,不修改原有外观类,而对应增加一个新的具体外观类,由新的具体外观类来关联新的子系统对象,同时通过修改配置文件来达到不修改源代码并更换外观类的目的。
总结
在外观模式中,外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。
外观模式包含两个角色:外观角色是在客户端直接调用的角色,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理;在软件系统中可以同时有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能。
外观模式要求一个子系统的外部与其内部的通信通过一个统一的外观对象进行,外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打交道,而不需要与子系统内部的很多对象打交道。
外观模式主要优点在于对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易,它实现了子系统与客户之间的松耦合关系,并降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程;其缺点在于不能很好地限制客户使用子系统类,而且在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
外观模式适用情况包括:要为一个复杂子系统提供一个简单接口;客户程序与多个子系统之间存在很大的依赖性;在层次化结构中,需要定义系统中每一层的入口,使得层与层之间不直接产生联系。
以上就是本篇文章的全部内容,更多请关注laravel框架入门教程。
相关文章推荐:
基于laravel5.2进行中间件源码的解析
Laravel本地环境搭建:Homestead开发环境的部署
相关课程推荐:
2017年最新的五个Laravel视频教程推荐
# laravel
# php
# 中间件
# 继承
# 接口
# 对象
# redis
# 客户端
# 多个
# 与子
# 提供一个
# 源代码
# 它是
# 只需要
# 这一
# 很好
# 而不
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
简单实现jsp分页
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
Android滚轮选择时间控件使用详解
🚀拖拽式CMS建站能否实现高效与个性化并存?
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
如何实现建站之星域名转发设置?
如何在新浪SAE免费搭建个人博客?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
使用spring连接及操作mongodb3.0实例
如何快速配置高效服务器建站软件?
Java遍历集合的三种方式
教你用AI将一段旋律扩展成一首完整的曲子
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
Laravel怎么调用外部API_Laravel Http Client客户端使用
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
如何快速查询网站的真实建站时间?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
详解jQuery中基本的动画方法
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
米侠浏览器网页背景异常怎么办 米侠显示修复
微信小程序 配置文件详细介绍
制作公司内部网站有哪些,内网如何建网站?
如何快速启动建站代理加盟业务?
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
如何在云主机快速搭建网站站点?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
Java解压缩zip - 解压缩多个文件或文件夹实例
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
javascript日期怎么处理_如何格式化输出
微信h5制作网站有哪些,免费微信H5页面制作工具?
Laravel如何与Inertia.js和Vue/React构建现代单页应用
如何在腾讯云服务器快速搭建个人网站?
Swift中swift中的switch 语句
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
Laravel怎么清理缓存_Laravel optimize clear命令详解
如何在阿里云ECS服务器部署织梦CMS网站?
如何在万网自助建站中设置域名及备案?
如何快速搭建高效WAP手机网站?

