由 @krq_tiger(
http://weibo.com/xmuzyq
)翻译,如果你发现有什么翻译错误,请与我联系谢谢。
iOS
设计模式
-
你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不会太关注它。
在软件设计领域,设计模式是对通用问题的可复用的解决方案。设计模式是一系列帮你写出更可理解和复用代码的模板,设计模式帮你创建松耦合的代码以便你不需要费多大力就可以改变或者替换代码中的组件。
如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了
Cocoa
的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践。
其次本指南将带你使用绝大多数(并不是所有)
Cocoa
中频繁使用的
IOS
设计模式。
本指南被分为了许多部分,每个部分涉及一个设计模式。在每个部分中,你将会了解到如下内容:
•
设计模式是什么?
•
你为什么要用设计模式?
•
如何使用设计模式,以及在使用的时候,哪里是合适的,哪里是需要注意的坑。
在本指南中,你将创建一个音乐库应用,这个应用将显示你的专辑以及它们相关联的信息。
在开发本应用的过程中,你将熟悉被大量使用的
Cocoa
设计模式:
•
创建型:单利(单态)和
抽象工厂
•
结构型:模型
-
视图
-
控制器,装饰器,适配器,外观(门面
)
和组合模式
•
行为型:观察者,备忘录,责任链和命令模式
不要被误导认为这是一篇关于设计模式理论的文章,在本音乐应用中,你将使用这些设计模式中的大多数,最终你的音乐应用将长的像下图所示的那样:
我们开始吧!
工程里面没有太多的文件,仅仅包含缺省的
ViewController
以及空实现的
HTTP Client.
注意:当你创建一个新的
Xcode
工程的时候,你的代码其实已经涉及到了设计模式,你知道吗?模型
-
视图
-
控制器,委托,协议,单例
-
你不费吹灰之力就可以免费使用它们啦。
在你深入到第一个设计模式之前,你首先必须创建两个类,用这两个类去保存和显示音乐库专辑的信息。
在
Xcode
中,导航到
"File\New\File..."
(或者按
Command+N
快捷键),选择
IOS>Cocoa Touch,
然后
Objective-C class
,点击下一步。设置类名称为
Album
,父类选择
NSObject
,点击下一步,然后创建。
打开
Album.h
文件,在
@interface
和
@end
之间,增加如下的属性和方法原型:
@property (nonatomic, copy, readonly) NSString *title, *artist, *genre, *coverUrl, *year;
- (id)initWithTitle:(NSString*)title artist:(NSString*)artist coverUrl:(NSString*)coverUrl year:(NSString*)year;
注意到新增代码中所有的属性都是只读的,因为在
Album
对象创建以后,不需要修改它们的值。
新增的方法是对象初始化器(
object initializer),
当你创建一个新的专辑(
album
)对象的时候,你需要传递专辑(
album)
名
,
艺术家,专
辑封面URL
,以及年份。
现在打开
Album.m
文件,在
@implementation
和
@end
之间
增加如下代码:
- (id)initWithTitle:(NSString*)title artist:(NSString*)artist coverUrl:(NSString*)coverUrl
year:(NSString*)year {
self = [super init];
if (self)
{
_title = title;
_artist = artist;
_coverUrl = coverUrl;
_year = year;
_genre = @"Pop";
}
return self;
}
这里没什么复杂花哨的东西,仅仅是一个创建
Album
实例的初始化方法而已。
在
Xcode
中,再一次导航到
"File\New\File..."
选择
Cocoa Touch
,然后
Objective-C class,
点击下一步。设置类名为
AlbumView,
但是这一
次设置父类为UIView
。点击下一步然后点击创建。
注意
:如果你发现键盘快捷键更容易使用,
Command+N
将创建一个新文件,
Command+Option+N
将创建一个新组,
Command+B
将构建你的工程,
Command + R
将运行它。
现在打开
AlbumView.h
,在
@interface
和
@end
之间
增加如下的方法原型:
- (id)initWithFrame:(CGRect)frame albumCover:(NSString*)albumCover;
现在打开
AlbumView.m
,用如下代码替换
@implementation
之后所有的代码:
@implementationAlbumView
{
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
实例变量。它表示这个专辑的封面图。第二个变量是一个通过旋转来指示封面图正在下载的指示器。
在初始化器的实现中你设置背景颜色为黑色,创建了有
5
像素边框的图片视图,同时还创建了指示器。
注意:
你可能想知道为什么私有变量在实现文件中定义,而不是在接口文件中?这是因为
AlbumView
以外的类不需要知道这些变量的存在,这些变量仅仅只在类内部函数使用。如果你在开发给其它开发者使用的框架,这个约定就显得十分重要了。
构建(
Command + B
)你的工程确保每件事情都井井有条,都
ok
吗?然后准备迎接我们的第一个设计模式!
原文出处:http://xmuzyq.iteye.com/blog/1942376