除了 MVC,iOS 上还使用了哪些设计模式?
Posted
技术标签:
【中文标题】除了 MVC,iOS 上还使用了哪些设计模式?【英文标题】:What Design Patterns are used on iOS other than MVC? 【发布时间】:2012-09-08 07:49:03 【问题描述】:我需要了解除 MVC 之外的 iPhone 开发中使用的设计模式。
请回复任何示例解释或代码为 sn-p 的示例。
谢谢。
【问题讨论】:
【参考方案1】:Abstract Factory
抽象工厂模式提供了一个接口,用于创建相关或依赖对象的系列,而无需指定它们的具体类。客户端与从工厂获得的具体对象的任何细节都解耦了。
Adapter
适配器设计模式将一个类的接口转换为客户期望的另一个接口。 Adapter 让那些因为接口不兼容而无法协同工作的类。它将客户端与目标对象的类分离。
Chain of Responsibility
责任链设计模式通过为多个对象提供处理请求的机会来将请求的发送者与其接收者分离。该模式将接收对象链接在一起,并沿链传递请求,直到对象处理它。链中的每个对象要么处理请求,要么将其传递给链中的下一个对象。
Command
Command 设计模式将请求封装为一个对象,从而让您可以对具有不同请求、队列或日志请求的客户端进行参数化,并支持可撤消的操作。请求对象将特定接收器上的一个或多个操作绑定在一起。命令模式将发出请求的对象与接收并执行该请求的对象分开。
Composite
Composite 设计模式将相关对象组合成树结构来表示部分-整体层次结构。该模式允许客户统一处理单个对象和对象组合。 Composite 模式是 Model-View-Controller 聚合模式的一部分。
Decorator
装饰器设计模式动态地为对象附加额外的职责。装饰器为扩展功能提供了一种灵活的替代子类的方法。与子类化一样,装饰器模式的改编允许您在不修改现有代码的情况下合并新行为。装饰器包装其行为扩展的类的对象。它们实现与它们包装的对象相同的接口,并在将任务委托给包装对象之前或之后添加自己的行为。装饰者模式表达了类应该对扩展开放但对修改关闭的设计原则。
Facade
外观设计模式为子系统中的一组接口提供统一的接口。该模式定义了一个更高级别的接口,通过降低复杂性并隐藏子系统之间的通信和依赖关系,使子系统更易于使用。
Iterator
迭代器设计模式提供了一种按顺序访问聚合对象(即集合)的元素而不暴露其底层表示的方法。迭代器模式将访问和遍历集合元素的责任从集合本身转移到迭代器对象。 Iterator 定义了一个用于访问集合元素的接口并跟踪当前元素。不同的迭代器可以执行不同的遍历策略。
Mediator
中介者设计模式定义了一个对象,该对象封装了一组对象的交互方式。 Mediator 通过阻止对象显式地相互引用来促进松散耦合,并且它允许您独立地改变它们的交互。因此,这些对象可以保持更多的可重用性。 此模式中的“中介对象”集中了系统中对象之间的复杂通信和控制逻辑。这些对象在其状态发生变化时通知中介对象,进而响应来自中介对象的请求。
Memento
Memento 模式在不违反封装的情况下捕获并外部化对象的内部状态,以便以后可以将对象恢复到该状态。 Memento 模式将关键对象的重要状态保持在该对象外部以保持内聚。
Observer
Observer 设计模式定义了对象之间的一对多依赖关系,这样当一个对象改变状态时,它的所有依赖项都会得到通知并自动更新。观察者模式本质上是一个发布订阅模型,其中主体和它的观察者是松耦合的。观察对象和被观察对象之间可以进行交流,而无需了解对方太多。
Proxy
代理设计模式为另一个对象提供代理或占位符,以控制对另一个对象的访问。您可以使用此模式创建一个代表或代理对象,以控制对另一个对象的访问,该对象可能是远程的、创建成本高昂或需要保护。这种模式在结构上类似于装饰器模式,但它的用途不同;装饰器向对象添加行为,而代理控制对对象的访问。
Receptionist
接待员设计模式解决了将应用程序的一个执行上下文中发生的事件重定向到另一个执行上下文进行处理的一般问题。这是一种混合模式。虽然它没有出现在“四人帮”一书中,但它结合了该书中描述的命令、备忘录和代理设计模式的元素。它也是蹦床模式的一种变体(书中也没有出现);在这种模式中,事件最初由蹦床对象接收,之所以这么称呼是因为它会立即将事件反弹或重定向到目标对象进行处理。
Singleton
单例设计模式确保一个类只有一个实例,并提供一个全局访问点。该类跟踪其唯一实例并确保不能创建其他实例。单例类适用于需要单个对象提供对全局资源的访问的情况。
Template Method
模板方法设计模式定义了操作中算法的骨架,将一些步骤推迟到子类。模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些步骤。
来源:Cocoa Design Patterns。
【讨论】:
感谢您的解释。 链接的文档为什么在停用的文档库中?当我单击该链接时,它会将我重定向到:“已停用的文档库包含不适用于当前产品开发的文档。其中一些文档描述了不再推荐的较旧的编程技术。其他文档描述了较旧的功能、接口,以及不再受支持的编程技术。此信息可帮助您维护和更新旧代码库。”他们是否建议不再推荐这些编程技术? @NYCTechEngineer 没有。他们可能只是在发布新操作系统时归档了整个文档。设计模式仍然有效,它们不会像那样改变。 术语可可设计模式具有误导性,尤其是当所有这些都包含对预先存在的模式的简单定义时。 'retired document' 需要每个模式的真实可可示例。【参考方案2】:在现实世界的应用程序中,代码库会随着时间的推移而变得复杂,最终您会得到大量的视图控制器,这些控制器很难测试和维护。解决方案是使用MVVM,它是 MVC 自身的更好替代方案。
【讨论】:
【参考方案3】:在您的应用程序中使用 MVVM 设计模式与您将在项目中执行的业务逻辑相关,以在视图中显示一些内容。 如果您的视图不需要更多逻辑来显示它的内容,您可以使用 MVC 但是如果你必须创建一些业务逻辑来在视图上显示这些内容,那么在这种情况下,最好的做法是将这个逻辑分离到另一个层中,这样 MVVM 在这种情况下会更好,MVVM 中的 ViewModel 将包含这个逻辑。
由于这些原因,我认为 MVVM 在关卡设计上优于 MVC
MVVM 与您现有的 MVC 架构兼容。 MVVM 让您的应用更具可测试性。 MVVM 与绑定机制配合使用效果最佳。MVVM 如何与 MVC 兼容
MVC > 模型、视图、控制器 MVVM > 模型、视图、视图模型 > 模型、(视图控制器)、视图模型【讨论】:
以上是关于除了 MVC,iOS 上还使用了哪些设计模式?的主要内容,如果未能解决你的问题,请参考以下文章