Magento有几种设计模式?


15

Magento 2有几种设计模式?

Answers:


37

Magento 1/2设计模式

第1部分:MVC

Magento利用独特的MVC模式,利用基于DOM的配置层。它利用xml在常规的Model-View-Controller体系结构之上驱动应用程序的配置和操作。

第2部分:前端控制器

Magento使用Front Controller模式来为其应用程序实现工作流程。它为所有请求提供一个入口点(index.php)。让我们看看它是如何工作的。

第三部分:工厂

工厂方法用于实例化Magento中的类。您可以通过调用一个适当的方法来实例化Magento中的一个类,该方法传递一个代表类组的抽象名称,后跟一个类名称。类组及其相应的抽象在模块的/ etc /文件夹中的配置XML文件中声明。

第4部分:单例

与Magento中的工厂类抽象和类组非常相似,对于块和类,Singleton模式的实例化也相同。

第5部分:注册表

注册表模式基本上是一种模式,它允许任何对象或数据在公共全局范围内可供任何资源使用。

第六部分:原型

Magento中的Prototype模式用作Abstract Factory模式的扩展。它确保通过分配给对象的适当类型实例化适当的子类。这是什么意思?基本上,这意味着只要需要获取通过其父类型定义的特定类,原型模式就可以确保您获得可以处理所需内容的正确类。

第7部分:对象池

对象池模式使对象可以反复使用,而无需重新实例化它们并在完成后销毁它们。这是节省内存消耗和计算周期的好方法。

第8部分:迭代器

迭代器模式是一种设计模式,它允许对象遍历另一个类的元素。这允许您指定一个迭代器,并允许传递多个不同的数据集,而无需更改允许迭代的基础结构。

第9部分:延迟加载

延迟加载是一种设计模式,可将对象的加载延迟到调用该对象的时间为止。使用Magento,他们不会将其与对象一起使用,而是将其与数据一起使用。

第10部分:服务定位器

服务定位器是一种设计模式,允许用户通过将流程封装在抽象层内来获得服务。这使用户可以在不知道运行时服务是什么的情况下检索适当或最佳的服务。

第11部分:模块

模块设计模式是模块化编程的一种形式,强调将程序的功能分组为独立的,可互换的模块。

第十二部分:观察者

观察者模式是在应用程序执行过程中的某个点设置事件侦听器的地方。在此期间,应用程序的其他组件可以“挂接到”该事件侦听器并执行其代码。

第13部分:有效记录

对象是数据库表中行的表示。这些对象应具有反映代表表结构的列的属性,以及允许修改数据库中这些属性的方法。

Magento对图案的使用

在Mage_Core_Model_Abstract类之后继承的类可以访问load(),save()和delete()方法,这些方法允许在与该类连接的表中加载,修改,创建或删除记录。此外,Mage_Core_Model_Abstract类继承自Varien_Object,这使我们可以访问真正神奇的方法__set()和__get(),这些方法负责自动映射数据库表中具有给定对象属性的列。

Magento 2加法

服务合同设计模式

Magento是基于扩展或模块化的系统,它使第三方开发人员可以自定义和覆盖其框架的核心部分。这些自定义可能会导致一些问题,例如,开发人员将可以跟踪由外部扩展完成的自定义。因此,为了克服这个问题,Magento提出了服务合同模式。服务合同是充当最终用户和业务层之间的一层的一组接口。因此,不是直接向最终用户公开用于定制的业务逻辑,而是在两者之间引入了一个称为服务合同的层。

服务合同增强了Magento的模块化。帮助商家轻松升级Magento确保其他外部模块和Magento模块实现的定义明确且持久的API。提供一种通过REST或SOAP接口公开业务逻辑的简便方法。

对象管理器

它本身包含各种模式,例如:依赖注入,单例,工厂,抽象工厂,复合,策略,CQRS,装饰器等等。我们将在其中讨论一些最常用的模式。对象管理器扮演着非常重要的角色,Magento禁止直接使用它。对象管理器负责实现工厂,单例和代理模式。它会自动实例化类构造函数中的参数。在移动未来之前,让我们了解可注射和不可注射的物体:

受伤的对象

他们没有自己的身份,例如EventManager,CustomerAccountManagementService。

不可伤害的对象

这些实体通常具有其身份和状态,例如客户,产品等,因为它们具有其身份,因此重要的是要知道我们必须在哪个确切的实体实例上工作。

依赖注射

它是magento 1中Mage的替代方法。它是通过外部环境而不是在内部创建依赖对象来注入依赖对象的概念。因此,我们将在创建对象时要求资源,而不是在需要时创建资源。这有助于将来进行修改,并且通过模拟必需的对象使测试变得非常容易。

工厂模式或工厂类别:

在Magento 2中,工厂类在对象管理器和业务代码之间创建一个层。由于工厂类是自动生成的,因此无需显式定义。我们应该为不可注入的对象创建工厂类。

代理模式

代理类用于代替另一个类,在Magento 2中,它们有时用于替代资源匮乏的类。要了解什么是代理类,让我们看看导致代理类出现的原因。众所周知,Magento使用构造函数注入进行对象创建,并且当我们实例化一个对象时,其构造函数中的所有类也会实例化,从而导致通过构造函数进行实例化链,这确实会减慢过程并影响应用程序的性能。 ,因此为了停止链实例化,Magento使用代理类。

让我们看下面的代码:

Magento\Catalog\Model\Product\Attribute\Source\Status\Proxy

Magento\Catalog\Model\Product\Link\Proxy

因此,在上面的代码中,我们将代理类用于catalogProductStatus和productLink。当我们跑步

 php bin/magento setup:di:compile 

Magento使用带有某些固定约定的di.xml即时创建代理类,从而将原始对象替换为代理类对象。现在让我们看一下代理类,以了解它是如何工作的

创建代理时,遵循一些通用的Magento约定:

  • 代理类的命名空间将与原始名称空间相同(Magento \ Catalog \ Model \ Product \ Attribute \ Source \ Status)
  • 代理类仅扩展一个对象,即对象管理器
  • 具有诸如__sleep和__wake之类的魔术函数,它们仅在某些操作上被调用,而诸如__clone的函数将构成原始类的对象,并且仅在需要时才提供该对象(利用延迟加载设计模式),从而改善了应用程序的性能 https://devdocs.magento.com/guides/v2.0/extension-dev-guide/proxies.html

插件(拦截器)

总览

插件或拦截器是一个类,它通过拦截函数调用并在该函数调用之前,之后或周围运行代码来修改公共类函数的行为。这使您可以替换或扩展任何类或接口的原始公共方法的行为。

希望拦截和更改公共方法的行为的扩展可以创建一个称为插件的Plugin类。

这种拦截方法减少了扩展中更改相同类或方法的行为的冲突。您的Plugin类实现会更改类函数的行为,但不会更改类本身。因为可以根据配置的排序顺序依次调用它们,所以这些拦截器不会相互冲突。

局限性

插件不能与以下任何一项一起使用:

对象管理器

总览

大型应用程序(例如Magento应用程序)使用对象管理器来避免在实例化期间编写对象时使用样板代码。

在Magento框架中,ObjectManagerInterface的实现执行对象管理器的职责。

职责范围

对象管理器具有以下职责:

在工厂和代理中创建对象。通过在需要时返回类的相同共享实例来实现单例模式。通过在构造函数请求其接口时实例化首选类的依赖关系管理。在类构造函数中自动实例化参数。 https://devdocs.magento.com/guides/v2.0/extension-dev-guide/object-manager.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.