您的位置:首页 > 移动开发 > IOS开发

iOS开发常用的集中设计模式

2015-10-18 21:13 281 查看
    "设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。"  ----百度百科

    开篇点题 ------ 

    任何理论都需要实例来支撑, 相信也很少有人在码代码之前就要来把各种设计模式了解透彻.

    JAVA中为总所周知的设计模式有24种(也有说27种), 同样在iOS中适用且常用的设计模式有6种:

    1. 单例模式

    2. 委托模式 (代理模式)

    3. MVC模式

    4. 观察者模式 (KVO, Notification)

    5. 策略模式

    6. 工厂模式

上面这些设计模式最大的特点就是降低不同类之间的耦合度, 俗称"解耦合". 不同模块之间的代码互相独立, 分工明确, 不会因为相互调用而产生过多依赖.

1. 单例模式

    单例模式在项目中通常被用作管理类. 在整个项目中只需要创建一次, 使用时候调用即可.

    系统常见单例类有: UIApplication, NSNotificationCenter.

    有时候我们自己也需要自定义一个管理用的单例类.

    创建一个单例的常用方式:

+ (instancetype)shareUserInfoManager
{
static XLUserInfoManager *manager = nil;

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[self alloc] init];
});
return manager;
}
如上, 提供一个类方法创建类, 使用GCD保证这个类只会被创建一次.

    一个合格的单例类除了一个创建用的类方法外, 通常还需要重写系统的几个构造方法. 如果在MRC模式, 则还需要重写几个构造函数, 重写release, retain, retainCount, copy等和内存管理相关的方法, 以防止引用计数的增减. 不过因为单例类大家都会通过公共的类方法来调用, 实际开发中不写的场合也非常多.

2. 委托模式 (代理模式)

    当我们有这样一个需求: 一个页面的事件响应, 需要在另一个页面执行某些操作. 或者一个页面需要向另一个页面传值. 

    比如添加通讯录, 当我们通过编辑添加了一条通讯录信息, 通常会回到通讯录列表, 这时候需要这个列表进行刷新, 并显示刚添加的那条通讯录.

    代理的设置分委托和代理各三步:

委托方:1. 声明协议方法

              2. 声明代理属性

              3. 调用代理

代理方:1. 设置代理

               2. 添加协议

               3. 实现代理方法

    举个栗子:

@class BuyBook;

@protocol BuyBookDelegate <NSObject>

@optional

- (void)buyBookComplete:(BuyBook *)buyBook;

@end

@interface BuyBook : UIView

@property (nonatomic, weak) id<BuyBookDelegate> delegate;

@end
这里声明了一个BuyBook类。在.h文件中声明了BuyBookDelegate协议,并定义了协议方法。

其中@optional是指该协议方法并非必须实现。

之后定义delegate属性,该属性的类型为id,即任何遵从协议的对象都可以设置为该代理。

@implementation BuyBook

- (void)buyBook {

if ([self.delegate respondsToSelector:@selector(buyBookComplete:)]) {
[self.delegate buyBookComplete:self];
}
}

@end
当有程序调用到buyBook方法时候,就执行代理方法。

使用判断来保证代理被继承且对应方法已经被实现的时候才调用。

@interface ViewController () <BuyBookDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

BuyBook * buyBook = [[BuyBook alloc] init];
buyBook.delegate = self;

}

- (void)buyBookComplete:(BuyBook *)buyBook {

NSLog(@"buy book complete!");
}
在使用这个类的时候,需要设置对象的delegate属性为self。

添加对应的协议名称。

实现需要的协议方法。

3. MVC模式

使用Model(模型),View(视图),Controller(控制器)将整个项目功能划分成三个不同的模块,使得项目分工明确,层次清晰,易于维护。

iOS在编程的时候,也经常使用MVC的思想来构筑代码,最明显的就是文件夹的划分。

.... (未完待续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: