1. 引言
為什么會(huì)抽象出設(shè)計(jì)模式?
設(shè)計(jì)模式是在眾多人開發(fā)大型項(xiàng)目遇到問題,為了解決特定問題而抽象出來的解決方案。設(shè)計(jì)模式可以解決什么問題?
適配器模式:解決Model與View連接關(guān)系,隔斷,解耦學(xué)習(xí)設(shè)計(jì)模式的必要性
封裝、繼承、多態(tài)設(shè)計(jì)模式的基本原則
開閉原則 對(duì)擴(kuò)展開放、對(duì)修改關(guān)閉。小項(xiàng)目用不到
2. 通過基類的例子來展示設(shè)計(jì)模式的魅力
2.1 開閉原則
#import <UIKit/UIKit.h>
@interface BaseAnimationView : UIView
@property(nonatomic, strong) NSString * title;
/**
* 切換到正常狀態(tài)
*
* @param animation 是否執(zhí)行動(dòng)畫
* @param duration 動(dòng)畫持續(xù)時(shí)間
*/
- (void)changeToNormalStateAnimation:(BOOL)animation duration:(NSTimeInterval)duration;
/**
* 切換到靜止?fàn)顟B(tài)
*
* @param animation 是否執(zhí)行動(dòng)畫
* @param duration 動(dòng)畫持續(xù)時(shí)間
*/
- (void)changeToDisableStateAnimation:(BOOL)animation duration:(NSTimeInterval)duration;
@end
#import "BaseAnimationView.h"
@implementation BaseAnimationView
- (void)changeToNormalStateAnimation:(BOOL)animation duration:(NSTimeInterval)duration{
}
- (void)changeToDisableStateAnimation:(BOOL)animation duration:(NSTimeInterval)duration{
}
我們想要對(duì)上面這個(gè)類進(jìn)行修改,就要再寫一個(gè)類繼承自以上的類,創(chuàng)建新的方法
#import "BaseAnimationView.h"
@interface FadeAnimationView : BaseAnimationView
@property(nonatomic, strong) NSAttributedString * attributedString;
/**
* 切換到高亮狀態(tài)
*
* @param animation 是否執(zhí)行動(dòng)畫
* @param duration 動(dòng)畫持續(xù)時(shí)間
*/
- (void)changeToHighLightStateAnimation:(BOOL)animation duration:(NSTimeInterval)duration;
@end
這樣做就體現(xiàn)了開閉原則,代碼只允許擴(kuò)展,不允許修改,以免出現(xiàn)不必要的錯(cuò)誤。
2.2 里氏代換原則
子類可以用父類所有的方法 父類也可以使用子類的所有方法
#import "ViewController.h"
#import "BaseAnimationView.h"
#import "FadeAnimationView.h"
#import "ScaleAnimationView.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 父類調(diào)用子類初始化,實(shí)現(xiàn)了里氏代換原則
BaseAnimationView *baseAnimationView = [[ScaleAnimationView alloc] init];
[baseAnimationView changeToNormalStateAnimation:YES duration:2.f];
}
@end
2.3 依賴倒轉(zhuǎn)原則
抽象不依賴于細(xì)節(jié) 細(xì)節(jié)依賴于抽象, 這個(gè)指的是私有方法不應(yīng)該暴露在外界,盡量要做到抽象的方法用具體的實(shí)現(xiàn)來實(shí)現(xiàn),而不暴露在外界。
#import "FadeAnimationView.h"
@implementation FadeAnimationView
// 私有方法
- (void)fadeAnimation: (BOOL)animation
{
}
- (void)changeToNormalStateAnimation:(BOOL)animation duration:(NSTimeInterval)duration{
// 調(diào)用私有方法,但在.h文件中不暴露該方法
[self fadeAnimation:YES];
}
- (void)changeToDisableStateAnimation:(BOOL)animation duration:(NSTimeInterval)duration{
}
- (void)changeToHighLightStateAnimation:(BOOL)animation duration:(NSTimeInterval)duration{
}
@end
2.4 接口隔離原則
盡量保證接口必要性原則,不要讓接口做一些八竿子打不著的事情
/**
* 切換到出錯(cuò)狀態(tài)
*
* @param animation 是否執(zhí)行動(dòng)畫
* @param duration 動(dòng)畫持續(xù)時(shí)間
*/
- (void)changeToErrorStateAnimation:(BOOL)animation duration:(NSTimeInterval)duration;
2.5 合成/聚合復(fù)用
#import <UIKit/UIKit.h>
#import "FadeAnimationView.h"
@interface AnimationView : UIView
@property (nonatomic, strong) FadeAnimationView *fadeAnimationView;
/**
* 切換到出錯(cuò)狀態(tài)
*
* @param animation 是否執(zhí)行動(dòng)畫
* @param duration 動(dòng)畫持續(xù)時(shí)間
*/
- (void)changeToErrorStateAnimation:(BOOL)animation duration:(NSTimeInterval)duration;
@end
#import "AnimationView.h"
@implementation AnimationView
- (void)changeToErrorStateAnimation:(BOOL)animation duration:(NSTimeInterval)duration{
// 實(shí)現(xiàn)想要修改的代碼
}
@end
3. 設(shè)計(jì)模式的類型
-
GOF設(shè)計(jì)模式
- 創(chuàng)建型模式:通常和對(duì)象的創(chuàng)建有關(guān),涉及到對(duì)象實(shí)例化的方法。(共5種)
- 結(jié)構(gòu)型模式:描述的是如何組合類和對(duì)象以獲得更大的結(jié)構(gòu)。(共7種)
- 行為型模式:用來對(duì)類或?qū)ο笤鯓咏换ズ驮鯓臃峙渎氊?zé)進(jìn)行描述。(共11種)
并發(fā)設(shè)計(jì)模式
處理線程執(zhí)行順序的一系列設(shè)計(jì)模式框架級(jí)別的設(shè)計(jì)模式
MVC MVVM

設(shè)計(jì)模式分類
參考書籍:Objective-C編程之道 iOS設(shè)計(jì)模式解析
參考鏈接:http://www.runoob.com/design-pattern