现在的位置: 首页 > 综合 > 正文

MacOS中的设计模式

2014年09月05日 ⁄ 综合 ⁄ 共 4187字 ⁄ 字号 评论关闭

一 用 设计 模式来 简化你的应用 

         使用Objective-C编程 为应用添加特定行为的方式一般是通过接口 。你 可以通过 参数化一个超类的属性和行为或者以各种方式来修改它来创建一个已存在类的子类 。但也有其它更动态方式为应用 添加特定的行为,而不用使用派生方法 。这些动态的技术和方法基于设计模式。就像这篇
文章提到的,你可以在你的代码中通过适配设计模式来构造出更重用、更具有可扩展性的属于你自己的类和框架类。

      设计模式 :解决编程问题的设计模版

             一个设计模式是用于面向对象软件开发和其它领域的一个抽象工具 。它是解决一个特定情景下通用的、可重复出现的编程问题的设计模版。因此一个设计模式可以当作指导 一个特定的具体设计(模式的实例化)的一类向导。如何应用设计模式是灵活的,但通常情况下编程语言和已有的架构能够确定如何应用设计模式。

            几个主题或设计原则影响设计模式。这些设计原则是构造面向对象系统的首要规则,例如”封装系统结构的变化部分“,”为接口编程而不是实现“。这些原则表达了重要的观点。例如封装原则是说如果你隔离系统的变化部分并封装它们,它们就能够相对于系统的其它部分独立变化,尤其在你为它们定义了接口而不是绑定到特定的实现的时候。你以后可以改变它们或者扩展它们而不会影响系统的其它部分。因此消除了依赖,减少了不同部分之间的耦合,相应地系统变的更灵活和容易扩展。

           这些好处是你在编程的时候采用设计模式的重要考虑。你发现,在你的应用设计中适配和使用设计模式, 应用及包含的对象和类变的更具有重用性、可扩展性,在将来需求变化时更容易修改。而且应用基于设计模式通常更优美和有效,因为它们仅需要几行编码就能够完成与没有采用设计模式时相同的目标。

           你能在整个Cocoa和Cocoa Touch框架中以及在Objective-C的运行时和语言中发现采用设计模式的例子。你获得这些模式基于的机制几乎是不费力的,但也有其它一些需要你做一些工作 。在一些情景出现时你能在你的应用代码中应用设计模式。如果你使用与框架相同的设计模式,你的代码将与框架代码更协调,变的更优美。

二 最重要的设计模式:模式-视图-控制器

       模式-视图-控制器设计模式(被称为MVC)在一个应用中分配对象为三个角色之一:模式,视图,或控制器。这个设计模式在应用中不仅为对象定义要扮演的角色,也定义对象之间通讯的方式。三种对象通过抽象接口互相分离,并通过这些接口互相通讯。在应用中一个MVC确定类型的对象的集合有时被称为一个层--例如,模式层。

        MVC对于任何类型的应用都是一个好的设计。采用这个设计模式有许多好处。在这些应用中的许多对象变的更重用。接口也能够被更好的定义。采用MVC模式的应用也比其它应用更容易扩展。而且基于mvc模式的应用能使用许多技术和架构,你需要定制的对象扮演MVC角色之一。

三  用设计模式解决问题 

        面向对象系统例如一个应用是动态的。一个对象在运行时的行为没有被限制于编译时就确定的行为集合。一个对象能给其它对象发送消息,发送消息的目标能在运行时改变。一个对象也能在运行时与一个可变的另外的对象组合作,使用各种技术,来有效的完成应用任务。对于完成这些工作的对象或者对象网络,必须利用许多技术和框架架构的优势,即设计模式的适配。 

      下面描述这些技术和架构。可以把它们作为你的Objective-C编程工具的一部分。

      1) 代理模式: 起另外对象的代表的作用

               代理模式中称为代理的对象扮演另外对象的利益代言的角色。另外被代理的对象通常是一个框架对象。在执行时,被代理对象发送消息到它的代理;告诉代理一些事件将要发生并要求一些应答。代理(通常是一个定制类的实例)执行由消息调用的方法,并返回适当的值。通常返回值是一个布尔值告诉被代理对象处理是否执行。

              因此代理模式是在不对框架类派生子类的情况下,就可以把应用的特定行为插入到一个框架类的一种方式。它是扩展和影响框架行为的一个通用的、强大的设计方式。

              在代理模式中有两个可编程元件:被代理类和代理类。被代理类必须定义一个属性(通常命名为delegate)还保持对代理对象的引用。还必须声明一个代理类必须采用的协议。框架的许多类提供了代理,作为应用用来参数化特定于应用的框架行为的机制。

        代理模式,没有被限制于框架类。你也能在应用中的两个定制对象之间实现代理模式。

   2) 协议模式:允许没有继承关系的对象之间的通讯

       协议是一个可编程接口的声明,它的方法任何类都能够实现。与协议相关类的实例调用协议的方法及得到先前遵循和实现协议的类返回的值。在这些对象之间的通讯是为了实现一个特定的目标,例如分析xml编码或者拷贝一个对象。在协议接口两端的对象之间没有继承关系,因此协议也象代理模式,不用子类化的一个超类,以及协议通常是框架的代理模式实现的一部分。

       applet提供的框架声明了一打协议。另外,你的应用也能够声明你的类要遵循的定制的协议。协议也是你编程工具中的一个部件。

     3) 通知中心模式:通知对一个事件感兴趣的观察者

              通知中心是基础框架的一个子系统,用来广播一个消息--一个通知--到一个应用中所有已登记为一个事件的观察者对象。(从代码角度,通知中心是NSNotificationCenter的实例)。通知事件能是在一个应用中发生的任何事件--例如应用进入背景状态,或者用户开始在一个文本框中输入。一个关于事件已经发生或将要发生的发送给观察者的通知,能够给观察者一个以适当方式应答的机会。

       通知中心的广播通知是一个对象中对象合作和协调的方式。例如,一个Mac应用的控制器对象能够观察来自NSColorPanelColorDidChangeNotification的通知,来发现用户如何为一个特定任务选择颜色。这个例子指示,一个通知是一个对象,有对特定事件的名字以及事件是否出现或者将要出现的指示,它也携带指向提交(或发送)通知到通知中心的对象的引用,还可能包含额外信息的一个字典。

       任何对象都能观察一个通知,但事先必须登记以及接收它。登记时,它必须规定一个选择器标示在通知提供时被调用的方法;登记的方法必须有一个单独的参数:通知对象。登记时,观察者还能够规定发送通知的对象。

       通知中心通知相似于代理模式的消息;两者在确定的事件发生时都发送事件到任意的对象。可是,处理通知的方法与代理方法不同的是不能返回值。和代理模式一样通知中心的通知是同步的。

       AppKit框架定义了许多没有返回值的对应于通知的代理方法。如果一个代理实现了这样的一个方法,那么它就处理这个通知。例如,如果一个代理实现了windowDidMove:方法,那么它就处理NSWindowDidMoveNotification通知。

      你的应用中的定制对象也能定义和提交自己的通知,你的应用中的其它定制对象能够观察这个通知。

    4)
目标-行为(Target-Action)模式 :封装当一个事件出现时被发送的消息。

       目标-行为设计模式的概念相当简单。一个对象包含一些生成一个消息表达式的元素,当一个确定事件出现时,把这些元素放到一起组成消息和发送这个消息。这些元素是标示消息(行为)和接收消息的对象(目标)的选择器。目标类实现对应的行为和目标的方法以及在运行时接收到消息时,通过执行方法来对事件作出应答。

       目标-行为模式对于Cocoa 和 Cocoa Touch框架的控件是基本的模式。一个控件是一个用户接口对象,例如用户操作(通过点击、轻敲、拖放等)一个按钮,一个滑块,或者一个开关按钮来发送它们的意图到一个应用。大多数Cocoa控件与一个或更多的存储目标和行为的单元对象配对;
换句话说,一个Cocoa Touch 控件存储着行为和目标。

       5) 键-值Key-Value)观察模式:当一个值改变时通知观察者

                键-值观察模式(或kvo)允许一个对象来观察另外对象的属性。当属性的值变化时观察者对象被通知。观察者对象记住老的值和新的值;如果被观察属性是一个一对多的关系(例如一个数组),它也记住包含在其中的被包含对象。

                KVO通过保持模式层、控制器、视图层中的对象与变化同步来帮助应用变得更一致。

                与NSNotificationCenter通知相似,多个KVO对象能观察一个单独的属性。然而KVO更动态,因为它允许对象观察任意属性,而不需要增加任何新的api,例如一个通知名称。KVO是一个点对点通讯的轻量级的机制,因此不允许观察所有实例对象的一个特定属性。

    6) 基于设计模式的其它框架设计

              Cocoa 和Cocoa Touch框架也包含其它基于设计模式的设计,包括:

              视图树模式:一个应用呈现的视图基于可视性以一个树的形式被组织到一起。这个模式允许应用以一种统一的方式来处理单个的视图和复合视图。树的根元素是一个窗口对象;在根下的每一个视图都有一个父视图和零个或更多的子视图。父视图包含子视图。视图树是窗口绘制和事件处理的一个结构化组件。

            应答职责链模式。应答职责链是一系列对象--大多是视图,但也可以是窗口,视图控制器,和应用对象本身,一个事件或行为消息沿着责任链传递,直到责任链上的一个对象处理该事件。因此它是合作处理事件的一种机制。应答责任链模式与视图树关系最接近。

            接待员模式。

            在接待员模式,一个应用正执行的工作从一个执行上下文被导向或绑定到另一个。(执行上下文是一个提交队列或与主线程或辅助线程相关的操作队列)。你主要在当一个在任务辅助队列执行的工作必须在主队列被执行时应用 接待员模式--例如,在操作更新用户接口的时候。

               分类模式(Category)。一个分类给你提供了一种通过添加方法到一个类来扩展它的方式。就象代理模式,分类模式允许你不用使用继承来定制类的行为。分类模式是Objective-C 的一个特性。 


@转载自http://blog.csdn.net/goohong/article/details/8274289

抱歉!评论已关闭.