IOS策略模式與多態,IOS策略模式多態

來源:互聯網
上載者:User

IOS策略模式與多態,IOS策略模式多態

策略模式是一種常見的軟體設計模式,這裡簡單得介紹一下策略模式並用IOS簡單實現一下。
所謂的策略模式,顧名思義是要採用不同的策略的。一般來說,在不同的情況下,處理某一個問題的方法也不一樣。比如說對字串的排序和對數位排序,雖然用的都是快排,但是顯然不可能使用一段通用的代碼。有人說java裡面的compareTo可以做到,但如果考慮這麼一個問題:同樣是出門旅行,老年人身體虛弱,需要大量的休息,而孩子則是精力充沛,希望玩到更多的景點。如何在同一模式下表達以上資訊、採用合理的設計模式進行封裝而不是大量重寫類似的代碼,就需要學習並採用策略模式。
首先建立一個通用的策略,這裡直接命名為Strategy。這個類是最終暴露出來,需要被調用的類。

//Strategy.h#import <Foundation/Foundation.h>@interface Strategy : NSObject- (void) go;@end

這個類比較簡單,只定義了一個go方法。

//Strategy.m#import "Strategy.h"@implementation Strategy- (void)go{    NSLog(@"I am going outside");}@end

.m方法裡並沒有過多的實現go方法,可以看到唯寫了一個NSLog,其實也完全可以不寫。這個類有點接近於java中的interface和C++中的純虛類。因為這個是一個通用的,暴露出來的介面,所以具體的實現並不需要在strategy類中的go方法內完成。

接下來定義兩個類,分別繼承自Strategy類,這兩個類中包含了具體的方法實現,是功能的主體部分。

//OldPeopleTravel.h#import <Foundation/Foundation.h>#import "Strategy.h"@interface OldPeopleTravel : Strategy- (void) go;@end

.m檔案裡是具體的針對對老年人的實現方法

//OldPeopleTravel.h#import "OldPeopleTravel.h"@implementation OldPeopleTravel-(void)go{    [super go];    NSLog(@"I am old, I need rest");}@end

類似的還有YoungPeopleTravel的.h和.m檔案

//YoungPeopleTravel.h#import "Strategy.h"@interface YoungPeopleTravel : Strategy- (void) go;@end
//YoungPeopleTravel.m#import "YoungPeopleTravel.h"@implementation YoungPeopleTravel- (void) go{    [super go];    NSLog(@"I am young, I am energetic");}@end

以上是策略類和具體的實作類別的實現,接下來就是調用這個策略了。

//ViewController.m#import "ViewController.h"#import "Strategy.h"#import "OldPeopleTravel.h"#import "YoungPeopleTravel.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    [self goOutside:[[OldPeopleTravel alloc]init]];    [self goOutside:[[YoungPeopleTravel alloc]init]];}- (void)goOutside:(id)theStrategy{    Strategy *strategy = theStrategy;    [strategy go];}@end

可以看到,最終我們調用的是自己的goOutside方法,方法中有一個參數是strategy,通過傳入不同的參數(策略),就可以調用這個策略下具體的方法實現。運行結果表示策略模式已經成功的實現了。通過調用不同的策略,得到了不同的處理結果。

2015-04-25 11:00:39.815 ios練習[27207:1752975] I am going outside2015-04-25 11:00:39.815 ios練習[27207:1752975] I am old, I need rest2015-04-25 11:00:39.816 ios練習[27207:1752975] I am going outside2015-04-25 11:00:39.816 ios練習[27207:1752975] I am young, I am energetic

再總結一下策略方法的實現,本質上就是需要完成一個事情(出行),但是並不清楚需要使用怎樣的策略,所以封裝出一個函數,能夠把需要的策略(young OR old)作為參數傳遞進來,並且使用相應的策略完成這個事件的處理。

最後簡單談一談個人對於策略模式和物件導向中多態的思想的理解,首先多態是高層次,高度抽象的概念,獨立於語言之外,是物件導向思想的精髓,而策略模式只是一種軟體設計模式,相對而言更加具體,而且具體實現依賴於具體的程式設計語言,比如OC和java的實現方法並不相同,是language-dependent的。其次,多態更多強調的是,不同的對象調用同一個方法會得到不同的結果,而策略模式更多強調的是,同一個對象(事實上這個對象本身並不重要)在不同情況下執行不同的方法,而他們的實現方式又是高度類似的,即共用同一個父類並且各自重寫父類的方法。

以上觀點純屬個人愚見,歡迎大牛指正,互相交流。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.