設計模式深入學習IOS版(6)委托模式 – iPhone手機開發技術文章 iPhone軟體開發教學課程

1 前言

委托模式是從裝飾(Decorator)模式,適配器(Adapter)模式和模板方法(Template Method)模式等演變而來的。而且使用十分頻繁,今天我們就來學習一下IOS開發中的委托模式。

轉載請註明出處:https://blog.csdn.net/developer_zhang

2 詳述

2.1 問題由來

對於應用生命周期的非運行狀態啟動應用場景,我們從點擊圖標到啟動第一個界面的過程細化如圖:

假設這一系列的處理都在UIApplication中完成的。那麼它將無所不能。在面向對象軟件設計中,這種類不是很友好,需要重構。在編程過程中,要盡量避免,因為它高耦合,職責不清,難以維護。我們需要去除掉,把看起功能很強大二期難以維護的類,按照職責將他的屬性或者方法分派到各自的類中或者分解成功能明確地類。vcD4KPHA+ICDGu7n70rLKx9Xiw7TX9rXEo6zL/L2r1eLQqbmmxNy31rjutb3Bvbj2srvNrLXEvcfJq9bQo6zSu7j2sOfR3bzcubnA4L3HyaujrL7f09DNqNPDtcSjrL/J1ti4tMq508OjrNPrvt/M5dOm08PO3rnYtcTM2LXjo7vB7dK7uPaw59Hd06bTw8/gudjA4LXEvcfJq6Os0+u+38zl06bTw9PQudiho9PJ09rK3LW9vNy5ucDgv9jWxqOs06bTw8/gudjA4LOjs6PJ6LzGzqqhsNCt0umhsaOs1NpKYXZh1tDSsrPG1/fOqqGwvdO/2qGxoaO/qreiyMvUsdDo0qrU2r7fzOW1xNOm08PW0Mq1z9bV4rj20K3S6aGjPC9wPgo8cD4gIMjnzbzL+cq+o6y9q9K70Km5psTczOHIobP2wLS3xdTaYXBwbGljYXRpb246ZGlkRmluaXNoTGF1bmNoaW5nV2l0aE9wdGlvbnM6us1hcHBsaWNhdGlvbkRpZEJlY29tZUFjdGl2ZTq3vbeo1tDN6rPJo6y2qNLl1NpVSUFwcGxpY2F0aW9uRGVsZWdhdGXQrdLp1tCjrNXi0flVSUFwcGxpY2F0aW9uwOC+zbHks8nBy7/yvNzA4KGjPC9wPgo8cD48aW1nIHNyYz0=”/uploadfile/Collfiles/20140226/20140226092703313.jpg” width=”800″ height=”500″ alt=”\”>

在具體使用時,需要實現UIApplicationDelegate協議。類圖如下:

UIApplication不直接依賴於AppDelegate類,而是依賴於UIApplicationDelegate協議,這再面向對象軟件設計中叫做“面向接口的編程”。AppDelegate類實現協議UIApplicationDelegate,他是委托類。

委托是為瞭降低一個對象的復雜度和耦合度,使其更具有通用性而將其中一些處理置於委托對象中的編碼方式。通用類因為通用性(與具體應用的無關性)而變為框架類,框架類保持委托對象的指針,並在特定時間向委托對象發送消息。消息可能隻是委托對象做一些事情,也可能是對委托對象進行控制。

2.2 實現原理

委托設計模式類圖如下:

2.3 代碼實例

下面我們舉一個實際應用的例子,現在有一個zhe”xue’jia,他會做三件事:睡覺,吃飯和工作。為瞭更好地生活,提高工作效率,他找一個學徒,把這些事情委托給徒弟做。要成為他的徒弟,需要實現一個協議,協議要求能夠處理“睡覺”,“吃飯”和“工作”的問題。三者的關系如類圖:

委托接口,哲學傢接口:

#import 


/*!
 *  委托接口,哲學傢接口
 *
 *  @since V1.0
 */
@protocol PhilosopherDelegate 

@required
-(void)sleep;
-(void)eat;
-(void)work;

@end

通用(框架)類:

#import 
#import "PhilosopherDelegate.h"

/*!
 *  通用(框架類)
 *
 *  @since V1.0
 */
@interface Philosopher : NSObject{
    NSTimer *timer;//計時器
    int count;//統計數
}
//委托對象:屬性使用弱引用,是為瞭防止內存引用計數增加而導致委托對象無法釋放
@property(nonatomic,weak) id delegate;

/*!
 *  開始執行計時器
 *
 *  @since V1.0
 */
-(void)start;
/*!
 *  處理方法
 *
 *  @since V1.0
 */
-(void)handle;

@end

委托對象:

#import 
#import "Philosopher.h"

/*!
 *  委托對象
 *
 *  @since V1.0
 */
@interface ViewController : UIViewController

@end

在本例中,Phiosopher模擬一些通用類發出調用,通過NSTimer每3秒發出一個,向委托對象發消息。

3 結語

以上是所有內容,希望對大傢有所幫助。

代碼實例:https://download.csdn.net/detail/u010013695/6959029

發佈留言