09 2020 档案
摘要:这次测试咱们采用Laravel框架。laravel作为最热门的php框架之一,广受认可与欢迎。同时由于集成度很高,每次运行都加载了大量文件,加之使用了大量的闭包、魔术方法,导致laravel框架很重,并发性能极差。OPcache和Swoole都是php的扩展,这次旨在比较这两个扩展分别开启后对Lar
阅读全文
摘要:实体属性值(Entity--attribute--value EAV)模式,可以方便 PHP 实现 EAV 模型。 目的 实体属性值模型(Entity-attribute-value EAV)是一种用数据模型描述实体的属性(属性,参数),可以用来形容他们潜在巨大,但实际上将适用于给定的实体的数量是相
阅读全文
摘要:目的 该模式通过提供集合风格的接口来访问领域对象,从而协调领域和数据映射层。 资料库模式封装了一组存储在数据存储器里的对象和操作它们的方面,这样子为数据持久化层提供了更加面向对象的视角。资料库模式同时也达到了领域层与数据映射层之间清晰分离,单向依赖的目的。 例子 Laravel 框架 Doctrin
阅读全文
摘要:目的 在委托模式的示例里,一个对象将它要执行的任务委派给与之关联的帮助对象去执行。在示例中,「组长」声明了 writeCode 方法并使用它,其实「组长」把 writeCode 委托给「菜鸟开发者」的 writeBadCode 方法做了。这种反转责任的做法隐藏了其内部执行 writeBadCode
阅读全文
摘要:目的 访问者模式可以让你将对象操作外包给其他对象。 这样做的最主要原因就是关注(数据结构和数据操作)分离。但是被访问的类必须定一个契约接受访问者。 (详见例子中 Role::accept 方法) 契约可以是一个抽象类也可以就是一个接口。在此情况下,每个访问者必须自行选择调用访问者的哪个方法。 UML
阅读全文
摘要:目的 模板方法模式是一种让抽象模板的子类「完成」一系列算法的行为策略。 众所周知的「好莱坞原则」:「不要打电话给我们,我们会打电话给你」。这个类不是由子类调用的,而是以相反的方式。怎么做?当然很抽象啦! 换而言之,它是一种非常适合框架库的算法骨架。用户只需要实现子类的一种方法,其父类便可去搞定这项工
阅读全文
摘要:目的 分离「策略」并使他们之间能互相快速切换。此外,这种模式是一种不错的继承替代方案(替代使用扩展抽象类的方式)。 例子 简化版的的单元测试:例如,在使用文件存储和内存存储之间互相切换 对一个对象列表进行排序,一种按照日期,一种按照 id UML图 ★官方PHP高级学习交流社群「点击」管理整理了一些
阅读全文
摘要:目的 状态模式可以基于一个对象的同种事务而封装出不同的行为。它提供一种简洁的方式使得对象在运行时可以改变自身行为,而不必借助单一庞大的条件判断语句。 UML图 ★官方PHP高级学习交流社群「点击」管理整理了一些资料,BAT等一线大厂进阶知识体系备好(相关学习资料以及笔面试题)以及不限于:分布式架构、
阅读全文
摘要:目的 构建一个清晰的业务规则规范,其中每条规则都能被针对性地检查。每个规范类中都有一个称为isSatisfiedBy的方法,方法判断给定的规则是否满足规范从而返回 true 或 false。 RulerZ UML图 ★官方PHP高级学习交流社群「点击」管理整理了一些资料,BAT等一线大厂进阶知识体系
阅读全文
摘要:目的 当对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。它使用的是低耦合的方式。 例子 内容不错的话希望大家支持鼓励下点个赞/喜欢,欢迎一起来交流;另外如果有什么问题和想看的内容可以在评论提出 注意! PHP 已经定义了 2 个接口用于快速实现观察者模式:SplObserver 和
阅读全文
摘要:目的 空对象模式不属于 GoF 设计模式,但是它作为一种经常出现的套路足以被视为设计模式。它具有如下优点: 客户端代码简单 可以减少报空指针异常的几率 测试用例不需要考虑太多条件 返回一个对象或 null 应该用返回对象或者 NullObject 代替。NullObject 简化了死板的代码,消除了
阅读全文
摘要:目的 它提供了在不破坏封装(对象不需要具有返回当前状态的函数)的情况下恢复到之前状态(使用回滚)或者获取对象的内部状态。 备忘录模式使用 3 个类来实现:Originator,Caretaker 和 Memento。 Memento —— 负责存储 Originator 的 唯一内部状态 ,它可以包
阅读全文
摘要:目的 本模式提供了一种轻松的多组件之间弱耦合的协同方式。如果你有个 “情报中心”,观察者模式也是个好选择,类似于控制器(并非 MVC 意义上的控制器)。 所有关联协同的组件(称作 Colleague)仅与 MediatorInterface 接口建立耦合,面向对象编程中这是好事,一个良友胜于有多个朋
阅读全文
摘要:目的 让对象变得可迭代并表现得像对象集合。 例子 在文件中的所有行(对象表示形式的)上逐行处理文件(也是对象) PHP 标准库 (SPL) 定义了一个最适合此模式的接口迭代器!往往也需要实现 Countable 接口,允许在迭代器对象上使用 count($object) 方法。 UML图 ★官方PH
阅读全文
摘要:目的 为了封装调用和解耦。 我们有一个调用程序和一个接收器。 这种模式使用「命令行」将方法调用委托给接收器并且呈现相同的「执行」方法。 因此,调用程序只知道调用「执行」去处理客户端的命令。接收器会从调用程序中分离出来。 这个模式的另一面是取消方法的 execute (),也就是 undo () 。命
阅读全文
摘要:目的 建立一个对象链来按指定顺序处理调用。如果其中一个对象无法处理命令,它会委托这个调用给它的下一个对象来进行处理,以此类推。 例子 垃圾邮件过滤器。 日志框架,每个链元素自主决定如何处理日志消息。 缓存:例如第一个对象是一个 Memcached 接口实例,如果 “丢失” 它会委托数据库接口处理这个
阅读全文
摘要:目的 为昂贵或者无法复制的资源提供接口。 代理模式(Proxy)为其他对象提供一种代理以控制对这个对象的访问。使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能。 在某些情况下,
阅读全文
摘要:目的 用来编写易于阅读的代码,就像自然语言一样(如英语) 例子 Yii 框架:CDbCommand 与 CActiveRecord 也使用此模式 Doctrine2 的 QueryBuilder,就像下面例子中类似 PHPUnit 使用连贯接口来创建 mock 对象 UML图 ★官方PHP高级学习交
阅读全文
摘要:目的 目的是能够存储在应用程序中经常使用的对象实例,通常会使用只有静态方法的抽象类来实现(或使用单例模式)。需要注意的是这里可能会引入全局的状态,我们需要使用依赖注入来避免它。 例子 Zend 框架 1:Zend_Registry 实现了整个应用程序的 logger 对象和前端控制器等 Yii 框架
阅读全文
摘要:目的 为了节约内存的使用,享元模式会尽量使类似的对象共享内存。在大量类似对象被使用的情况中这是十分必要的。常用做法是在外部数据结构中保存类似对象的状态,并在需要时将他们传递给享元对象。 UML 图 ★官方PHP高级学习交流社群「点击」管理整理了一些资料,BAT等一线大厂进阶知识体系备好(相关学习资料
阅读全文
摘要:目的 门面模式的最初目的并不是为了避免让你阅读复杂的 API 文档,这只是一个附带作用。其实它的本意是为了降低耦合性并且遵循 Demeter 定律。 Facade通过嵌入多个(当然,有时只有一个)接口来解耦访客与子系统,同时也为了降低复杂度。 Facade 不会禁止你访问子系统 你可以(应该)为一个
阅读全文
摘要:目的 实现了松耦合的软件架构,可得到更好的测试,管理和扩展的代码 依赖注入模式:依赖注入(Dependency Injection)是控制反转(Inversion of Control)的一种实现方式。要实现控制反转,通常的解决方案是将创建被调用者实例的工作交由 IoC 容器来完成,然后在调用者中注
阅读全文
摘要:目的 动态地为类的实例添加功能 例子 Zend Framework: Zend_Form_Element 实例的装饰者 Web Service层:REST服务的JSON与XML装饰器(当然,在此只能使用其中的一种) UML图 ★官方PHP高级学习交流社群「点击」管理整理了一些资料,BAT等一线大厂进
阅读全文
摘要:目标 数据映射器是一种数据访问层,用于将数据在持久性数据存储(通常是一个关系数据库)和内存中的数据表示(领域层)之间进行双向传输。该模式的目标是为了将数据的内存表示、持久存储、数据访问进行分离。 该层由一个或多个映射器(或数据访问对象)组成,并且进行数据的转换。映射器实现的范围有所不同。 通用映射器
阅读全文
摘要:目的 解耦一个对象使抽象与实现分离,这样两者可以独立地变化。 例子 ★官方PHP高级学习交流社群「点击」管理整理了一些资料,BAT等一线大厂进阶知识体系备好(相关学习资料以及笔面试题)以及不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Sw
阅读全文
摘要:目的 一组对象与该对象的单个实例的处理方式一致。 示例 form类的实例包含多个子元素,而它也像单个子元素那样响应 render() 请求,当调用 render() 方法时,它会历遍所有的子元素,调用 render() 方法 Zend_Config: 一个配置选项树,每个选项自身就是一个 Zend_
阅读全文
摘要:目的 将某个类的接口转换成另一个接口以兼容,适配器使得原来因为接口不同而无法一起使用的类可以一起工作。 适配器通过将原始接口进行转换,给用户提供一个兼容接口。 例子 客户端数据库适配器 使用多个不同的网络服务和适配器来规范数据使得出结果是相同的 UML 图 ★BAT等一线大厂进阶知识体系备好(相关学
阅读全文

浙公网安备 33010602011771号