設計模式的功能是在軟件設計當中是解決一些重複的公共問題。他們是一些模板來幫助你更容易的書寫代碼和複用你的代碼。他們還可能幫助你建立低耦合的代碼,你能夠很輕鬆的修改和替換其中的組件。設計模式
若是你已經很熟習設計模式了,我這裏有一些好的建議。首先,你已經使用了大量由 Cocoa 建立 iOS 設計模式,同時最好的練習就是去使用她們。第二,這個教程將帶給你全面瞭解全部最新的 iOS 設計模式,她們通常都是由 Cocoa 編寫的。xcode
這個教程被分紅幾個小節。在每個小節裏, 你都能在下面讀到說明:框架
什麼是設計模式ui
爲何你應該用她atom
怎麼用,在哪裏用,在使用當中如何注意一些常見的陷阱設計
在這個教程中,你將要建立一個音樂庫的 APP,它可以顯示你的音樂專輯和一些相關信息。代理
在開發這個 APP 的過程中,你將會了解到不少常見的 Cocoa 設計模式。code
建立 (Creational):單例 (Singleton)和抽象工廠 (Abstract Factory)cdn
結構 (Structural):MVC,裝飾器 (Decorator),適配器 (Adapter),外觀 (Facade)和複合器 (Composite)server
行爲 (Behavioral):觀察者 (Observer),備忘錄 (Memento),責任鏈 (Chain of Responsibility)和命令 (Command)
不要被帶偏了,這只是一篇理論文章;你將會在你的音樂 APP 中使用不少的設計模式。在這個教程的最後,你的 APP 看來應該是像這個樣子的:
下載 啓動項目:cdn2.raywenderlich.com/wp-content/uploads/2013/07/BlueLibrary-Starter.zip (複製到電腦下載),從 ZIP 文件中提取文件,用 Xcode 打開 BlueLibrary.xcodeproj。
這沒有多少文件,僅僅只有一個默認的 ViewController 文件和一個空的可執行的簡單 HTTP 客戶端。
提示:你知道嗎,當你建立一個新的 Xcode 項目的時候,你的代碼已經使用被設計模式?MVC,代理,協議,單例模式 ─ 這些你都能免費獲得!:]
在你開始研究第一個設計模式時,你必須建立兩個類用於存儲和顯示專集數據。
從」File\New\File…」(或者使用快捷鍵 Command + N)。選擇 iOS > Cocoa Touch,而後選擇 Objective-C class 後點擊 Next。設置類的名稱爲 Album,子類爲 NSObject。點擊 Next 建立。
打開 Album.h 文件,在 @interface 和 @end 這間添加下面的屬性和方法原型:
@propery (nonatomic, copy, readonly) NSString *title, *artist, * genre, *coverUrl, *year; - (id)initWithTitle:(NSString *)title artist:(NSString *)artist coverUrl:(NSString *)coverUrl year:(NSString *)year;
注意這裏的全部屬性都是 readonly,Album 對象被建立後是不可以被修改的。
這個方法是用來初始化對象的。當你建立一個新專輯時,須要提供專輯名稱,做者,封面 URL 和年份。
如今打開 Album.m 文件而後在 @implementation 和 @end 之間加入以下代碼:
- (id)initWithTitle:(NSString*)title artist:(NSString*)artist coverUrl:(NSString*)coverUrl { self = [super init]; _title = title; _artist = artist; _coverUrl = coverUrl; _year = year; _genre = @"Pop"; return self; }
這裏沒有什麼複雜的,只是一個簡單的建立 Album 實例的初始化方法。
現次從菜單 File\New\File 選擇中 Cocoa Touch,而後選擇 Object-C class,點擊 Next。設置類的名稱爲 AlbumView,子類爲 UIView。點擊 Next 建立文件。
提示:若是你會使用快捷鍵,建立這些會更容易,Command+N 建立新文件,Command+Option+N 建立新的文件夾,Command+B 建立新項目,Command+R 運行項目。
打開 AlbumView.h,在 @interface 和 @end 中 添加一個方法原型
- (id)initWithFrame:(CGRect)fram albumCover:(NSString*)albumCover;
如今打開 AlbumView.m 文件,用下面代碼替換 @implementaton 後面的全部代碼:
@implementation AlbumView { UIImageView *coverImage; UIActivityIndicatorView *indicator; } - (id)initWithFrame:(CGRect)frame albumCover:(NSString*)albumCover { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor blackColor]; // the coverImage has a 5 pixels margin from its frame coverImage = [[UIImageView alloc] initWithFrame:CGRectMake(5, 5, frame.size.width-10, frame.size.height-10)]; [self addSubview:coverImage]; indicator = [[UIActivityIndicatorView alloc] init]; indicator.center = self.center; indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; [indicator startAnimating]; [self addSubview:indicator]; } return self; } @end
第一個須要注意的地方是 coverImage 是一個實例變量。這個變量表明專集的封面圖片。第二個變量是一個提示器,在封面圖片開始下載的時候提示用戶正在下載。
在初始化的過程當中你須要設置背景爲黑色,建立一個比封面圖片大 5px 的圖片視圖,再建立和添加一個活動指示器。
提示:爲何私有變量定義在執行文件而不是定義在接口文件?這是由於其它外部類不須要知道 AlbumView 類裏的這些變量,這些變量只會在這個類的內部方法中使用到。若是你要開發一些庫或者框架給別的開發者使用,遵照這個習俗是很是重要的。
Build 你的項目確保全部代碼都能構運行。沒有問題?你的第一個設計模式已經準備好了。