設計模式之一:概論

設計模式的功能是在軟件設計當中是解決一些重複的公共問題。他們是一些模板來幫助你更容易的書寫代碼和複用你的代碼。他們還可能幫助你建立低耦合的代碼,你能夠很輕鬆的修改和替換其中的組件。設計模式

若是你已經很熟習設計模式了,我這裏有一些好的建議。首先,你已經使用了大量由 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 你的項目確保全部代碼都能構運行。沒有問題?你的第一個設計模式已經準備好了。

相關文章
相關標籤/搜索