设计模式解决了一个常见的软件工程学问题。模式不是编码,它是抽象的设计。它用于帮助开发者定义数据模型的结构和应用的交互。如果你采用了某种设计模式,你需要把它的一般形式适配到你特殊的需求上。不论你的应用是哪种形式,了解框架中使用的基本设置模式都是很有必要的。理解设置模式有助于你更有效的使用框架,还能帮助你写出重用性高、扩展性好、更容易变更的应用。

MVC

模型-视图-控制器(MVC)是IOS应用开发的核心设计模式。MVC把应用中的对象看为三种规则中任意一个:模型,视图,控制器。在这种模式下,模型跟踪应用的数据,视图显示用户的界面和构成应用的内容,控制器用于管理视图。通过响应用户的动作,通过使用数据模型中的数据来给视图填充内容,控制器被当成模型和视图之间的通道。

按照前面课程构建的ToDoList应用也遵循了MVC的设计模式。你在storyboard中创建的界面充当了视图层。AddToDoItemViewController和ToDoListTableViewControl这两个文件是用于管理视图的控制器。在后面的教程中,你将把一个数据模型合并到项目中,与视图和控制器一起工作。在开始进行应用设计之前,一定要以MVC的设计思想作为主导思想。

Target-Action

Target-Action是概念级别的简单设计模式,具体化后就是:当某个指定的事件发生时,某个对象把消息发送给另外一个对象。动作消息(action message)其实就是定义在源码中的选择器,目标(target)——接收消息的对象——也就是能够执行动作的对象,一般来说由视图控制器来充当。发送动作消息的对象一般被称为控件(control),例如button,slider,switch等,这些控件(control)都可以触发事件,用于响应用户的交互动作,例如按下,拖动等。

假设有这样一个案例:当用户按下应用中的Restore Defaults按钮时,你想存储默认的设置。首先,你得实现一个动作,用于执行存储默认设置的逻辑。然后,你需要注册按钮的Touch Up Inside事件来把存储默认设置的动作发送给实现了该方法的视图控制器。

在ToDoList应用中,我们已经使用了target-action模式。当用户在AddToDoItemViewController中按下保存按钮时,就触发了unwindToList动作。在这种情况下,保存按钮是发送消息的对象,目标对象是ToDoListTableViewController,动作消息是:unwindToList,接收消息的、被触发动作的事件是:用户按下保存按钮。target-action在应用各部分之间定义交互和发送消息,是一种功能强大的机制。

代理(Delegation)

代理是一种简单但是功能强大的语法,在应用中,它代表或配合另一对象的行为。代理对象中,持有另一对象的引用,并在适当的时期,代理对象给代理发送消息。消息通知事件的代理,该事件是代理对象即将处理或已经处理的事件。代理也可以响应自身界面(或状态)更新发出的消息,在某些情况下,它将返回一个值,该值会影响即将发生事件的处理。

代理模式普遍存在于现有的框架中,在应用的两个自定义对象之间,你也可以实现代理。使用代理的常用设计模式为:子视图控制器可以与父视图控制器就某个值(尤其是用户输入的值)进行通信。

到目前为止,你还用不到代理,但是在后面的教程中,当你给ToDoListTableViewController类添加额外的行为时,你会用到它。

上述的这些代理设计模式只是你在IOS开发中,会遇到的一小部分,当然,代理模式还有更多的应用。随着Objective-C学习的深入,你会发现越来越多可以在应用中使用的代理模式。

(译)Getting Started——1.3.2 Using Design Patterns(使用设计模式)的更多相关文章

  1. Streamline Your App with Design Patterns 用设计模式精简你的应用程序

    Back to Design Patterns Streamline Your App with Design Patterns 用设计模式精简你的应用程序 In Objective-C progra ...

  2. 【design patterns】设计模式

    1.单例设计模式(singleton) 用途举例:对于多个程序使用同一个配置信息对象时比如在连接数据库时使用单例模式,每次只取出一个连接 步骤:①私有化该类的构造函数 ②私有化一个静态的对象 ③公有化 ...

  3. Head First Design Patterns HeadFirst 设计模式

    OO原则是我们的目标,而设计模式是我们的做法. 策略模式 (Strategy) 在软件开发上,一直不变的真理是"change".不管软件设计的多好,一段时间之后,总是要成长与改变, ...

  4. Java设计模式(Design Patterns)——可复用面向对象软件的基础

    设计模式(Design Patterns) 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用设计模式是为了可重用代码.让代码更容易被他 ...

  5. TypeScript Version 23 Design Patterns

    TypeScript Version 23 Design Patterns TypeScript 设计模式 https://refactoring.guru/design-patterns/types ...

  6. Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...

  7. Design Patterns Simplified - Part 2 (Singleton)【设计模式简述--第二部分(单例模式)】

    原文链接: http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part-2-singleton/ De ...

  8. Head First Design Patterns

    From Head First Design Patterns. Design Principle: Idnetify the aspects of your application that var ...

  9. Apex Design Patterns

    Apex allows you to build just about any custom solution on the Force.com platform. But what are the ...

  10. [Design Patterns] 4. Creation Pattern

    设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式的目的是提高代码的可重用性,让代码更容易被他人理解,并保证代码可靠性.它是代码编制真正实现工程化. 四个关键元素 ...

随机推荐

  1. python中常用第三方库记录

    python中有很多很好用的第三方库,现在记录一下这些库以及如何下载 一.virtualenv,这是一个可以将生产环境隔离开的python库,非常好用 在linux下使用pip install vir ...

  2. jquery元素节点操作

    jquery元素节点操作 创建节点 var $div = $('<div>'); var $div2 = $('<div>这是一个div元素</div>'); 插入 ...

  3. linux系统下mysql跳过密码验证登录和创建新用户

    修改MySQL的登录设置: # vi /etc/my.cnf 在[mysqld]的段中加上一句:skip-grant-tables 例如: [mysqld] datadir=/var/lib/mysq ...

  4. 第九章:Elasticsearch集群优化及相关节点配置说明

    Linux系统调优: Linux调整打开文件数(重新启动生效) 在/etc/security/limits.conf在文件中增加: * soft nofile 8192 * hard nofile 2 ...

  5. scala之Actors

    这多半是因为actor是共享线程,所以阻塞线程会导致其他线程获取不到线程.

  6. IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token

    本文引用了简书作者“骑小猪看流星”技术文章“Cookie.Session.Token那点事儿”的部分内容,感谢原作者. 1.前言 众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动 ...

  7. java.util.HashMap 解析

    HashMap 是我们经常使用的一种数据结构.工作中会经常用到,面试也会总提到这个数据结构,找工作的时候,”HashTable 和HashMap的区别“被问到过没有? 本文会从原理,JDK源码,项目使 ...

  8. CLR_Via_C#学习笔记之事件

    一:首先我先引用网上别人对事件的一些说明,然后将会通过一个事例进行对事件的演示: EventArgs是包含事件数据的类的基类,用于传递事件的细节.EventHandler是一个委托声明如下 publi ...

  9. [Exception Spring 1] - Attribute value must not be null

    java.lang.IllegalArgumentException: Attribute value must not be null at org.springframework.util.Ass ...

  10. fwrite和fread函数的用法小结(转)

    fwrite和fread是以记录为单位的I/O函数,fread和fwrite函数一般用于二进制文件的输入输出. #include <stdio.h> size_t fread(void * ...