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