1.六大設(shè)置原則
- 單一職責(zé)原則
一個(gè)類只負(fù)責(zé)一件事,諸如UIView和Calayer - 開閉原則
對(duì)修改關(guān)閉,對(duì)擴(kuò)展開放恳守。諸如定義一個(gè)類,盡量考慮以后迭代的考慮剔蹋。 - 接口隔離原則
使用多個(gè)專門的協(xié)議旅薄,不是一個(gè)辅髓。諸如UITableview的delegate和。UITableViewDataSource - 依賴倒置原則
抽象不應(yīng)該依賴具體實(shí)現(xiàn)少梁,具體實(shí)現(xiàn)可以依賴抽象 - 里氏替換原則(子類不影響父類)
父類可以被子類無縫替換洛口。諸如KVO - 迪米特法則(高內(nèi)聚,低耦合)
一個(gè)對(duì)象對(duì)另一個(gè)對(duì)象盡可能少的了解凯沪。
2.責(zé)任鏈模式
任務(wù)執(zhí)行順序可以很方便的更改
#import <Foundation/Foundation.h>
@class BusinessObject;
typedef void(^CompletionBlock)(BOOL handled);
typedef void(^ResultBlock)(BusinessObject *handler, BOOL handled);
@interface BusinessObject : NSObject
// 下一個(gè)響應(yīng)者(響應(yīng)鏈構(gòu)成的關(guān)鍵)
@property (nonatomic, strong) BusinessObject *nextBusiness;
// 響應(yīng)者的處理方法
- (void)handle:(ResultBlock)result;
// 各個(gè)業(yè)務(wù)在該方法當(dāng)中做實(shí)際業(yè)務(wù)處理
- (void)handleBusiness:(CompletionBlock)completion;
@end
//----------------------實(shí)現(xiàn)文件--------------------
@implementation BusinessObject
// 責(zé)任鏈入口方法
- (void)handle:(ResultBlock)result
{
CompletionBlock completion = ^(BOOL handled){
// 當(dāng)前業(yè)務(wù)處理掉了第焰,上拋結(jié)果
if (handled) {
result(self, handled);
}
else{
// 沿著責(zé)任鏈,指派給下一個(gè)業(yè)務(wù)處理
if (self.nextBusiness) {
[self.nextBusiness handle:result];
}
else{
// 沒有業(yè)務(wù)處理, 上拋
result(nil, NO);
}
}
};
// 當(dāng)前業(yè)務(wù)進(jìn)行處理
[self handleBusiness:completion];
}
- (void)handleBusiness:(CompletionBlock)completion
{
/*
業(yè)務(wù)邏輯處理
如網(wǎng)絡(luò)請(qǐng)求妨马、本地照片查詢等
*/
// NSLog(@" 如網(wǎng)絡(luò)請(qǐng)求挺举、本地照片查詢等");
}
@end
//----------------------使用--------------------
//aBusinessObject集成 BusinessObject 重寫handleBusiness 方法
BusinessObject *Aobject = [[aBusinessObject alloc] init];
BusinessObject *Bobject = [[bBusinessObject alloc] init];
BusinessObject *Cobject = [[cBusinessObject alloc] init];
Aobject.nextBusiness = Bobject;
Bobject.nextBusiness = Cobject;
NSLog(@"%@ %@ %@",Aobject,Bobject,Cobject);
[Aobject handle:^(BusinessObject *handler, BOOL handled) {
NSLog(@"處理完成~~~~~~~~ %@ %d",handler,handled);
}];
3.橋接的模式
解耦,
image
#import <Foundation/Foundation.h>
#import "BaseObjectB.h"
@interface BaseObjectA : NSObject
// 橋接模式的核心實(shí)現(xiàn)
@property (nonatomic, strong) BaseObjectB *objB;
// 獲取數(shù)據(jù)
- (void)handle;
@end
//----------------------實(shí)現(xiàn)文件--------------------
@implementation BaseObjectA
/*
A1 --> B1烘跺、B2湘纵、B3 3種
A2 --> B1、B2滤淳、B3 3種
A3 --> B1梧喷、B2、B3 3種
*/
- (void)handle
{
// override to subclass
[self.objB fetchData];
}
@end
//------------------------------------------
#import <Foundation/Foundation.h>
@interface BaseObjectB : NSObject
- (void)fetchData;
@end
//-------------------實(shí)現(xiàn)-----------------------
#import "BaseObjectB.h"
@implementation BaseObjectB
- (void)fetchData
{
// override to subclass
}
@end
//-------------------使用現(xiàn)-----------------------
@interface BridgeDemo()
@property (nonatomic, strong) BaseObjectA *objA;
@end
@implementation BridgeDemo
/*
根據(jù)實(shí)際業(yè)務(wù)判斷使用那套具體數(shù)據(jù)
A1 --> B1、B2铺敌、B3 3種
A2 --> B1汇歹、B2、B3 3種
A3 --> B1偿凭、B2产弹、B3 3種
*/
- (void)fetch
{
// 創(chuàng)建一個(gè)具體的ClassA
_objA = [[ObjectA1 alloc] init];
// 創(chuàng)建一個(gè)具體的ClassB
BaseObjectB *b1 = [[ObjectB1 alloc] init];
// 將一個(gè)具體的ClassB1 指定給抽象的ClassB
_objA.objB = b1;
// 獲取數(shù)據(jù)
[_objA handle];
}
@end
4.適配器模式
對(duì)原有代碼不用調(diào)整
// 適配對(duì)象
@interface CoolTarget : NSObject
// 被適配對(duì)象
@property (nonatomic, strong) Target *target;
// 對(duì)原有方法包裝
- (void)request;
@end
//--------------------------------------
@implementation CoolTarget
- (void)request {
// 額外處理
[self.target operation];
// 額外處理
}
@end
5.單例模式
@implementation Mooc
+ (id)sharedInstance
{
// 靜態(tài)局部變量
static Mooc *instance = nil;
// 通過dispatch_once方式 確保instance在多線程環(huán)境下只被創(chuàng)建一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 創(chuàng)建實(shí)例
instance = [[super allocWithZone:NULL] init];
});
return instance;
}
// 重寫方法【必不可少】
+ (id)allocWithZone:(struct _NSZone *)zone{
return [self sharedInstance];
}
// 重寫方法【必不可少】
- (id)copyWithZone:(nullable NSZone *)zone{
return self;
}
@end
6.命令模式
行為參數(shù)化、降低代碼重合度
需要一個(gè)管理者和一個(gè)命令(繼承使用)
#import <Foundation/Foundation.h>
#import "Command.h"
@interface CommandManager : NSObject
// 命令管理容器
@property (nonatomic, strong) NSMutableArray <Command*> *arrayCommands;
// 命令管理者以單例方式呈現(xiàn)
+ (instancetype)sharedInstance;
// 執(zhí)行命令
+ (void)executeCommand:(Command *)cmd completion:(CommandCompletionCallBack)completion;
// 取消命令
+ (void)cancelCommand:(Command *)cmd;
@end
//---------------------------------------
#import "CommandManager.h"
@implementation CommandManager
// 命令管理者以單例方式呈現(xiàn)
+ (instancetype)sharedInstance
{
static CommandManager *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[super allocWithZone:NULL] init];
});
return instance;
}
// 【必不可少】
+ (id)allocWithZone:(struct _NSZone *)zone{
return [self sharedInstance];
}
// 【必不可少】
- (id)copyWithZone:(nullable NSZone *)zone{
return self;
}
// 初始化方法
- (id)init
{
self = [super init];
if (self) {
// 初始化命令容器
_arrayCommands = [NSMutableArray array];
}
return self;
}
+ (void)executeCommand:(Command *)cmd completion:(CommandCompletionCallBack)completion
{
if (cmd) {
// 如果命令正在執(zhí)行不做處理弯囊,否則添加并執(zhí)行命令
if (![self _isExecutingCommand:cmd]) {
// 添加到命令容器當(dāng)中
[[[self sharedInstance] arrayCommands] addObject:cmd];
// 設(shè)置命令執(zhí)行完成的回調(diào)
cmd.completion = completion;
//執(zhí)行命令
[cmd execute];
}
}
}
// 取消命令
+ (void)cancelCommand:(Command *)cmd
{
if (cmd) {
// 從命令容器當(dāng)中移除
[[[self sharedInstance] arrayCommands] removeObject:cmd];
// 取消命令執(zhí)行
[cmd cancel];
}
}
// 判斷當(dāng)前命令是否正在執(zhí)行
+ (BOOL)_isExecutingCommand:(Command *)cmd
{
if (cmd) {
NSArray *cmds = [[self sharedInstance] arrayCommands];
for (Command *aCmd in cmds) {
// 當(dāng)前命令正在執(zhí)行
if (cmd == aCmd) {
return YES;
}
}
}
return NO;
}
@end
//----------------------------------------------
@class Command;
typedef void(^CommandCompletionCallBack)(Command* cmd);
@interface Command : NSObject
@property (nonatomic, copy) CommandCompletionCallBack completion;
- (void)execute;
- (void)cancel;
- (void)done;
@end
//----------------------------------------------
#import "Command.h"
#import "CommandManager.h"
@implementation Command
- (void)execute{
//override to subclass;
[self done];
}
- (void)cancel{
self.completion = nil;
}
- (void)done
{
dispatch_async(dispatch_get_main_queue(), ^{
if (_completion) {
_completion(self);
}
//釋放
self.completion = nil;
[[CommandManager sharedInstance].arrayCommands removeObject:self];
});
}
@end
//---------------------使用-------------------------
//Command 采用繼承重寫 execute 的方式
Command *command1 = [[Command alloc] init];
Command *command2 = [[Command alloc] init];
Command *command3 = [[Command alloc] init];
[CommandManager executeCommand:command1 completion:^(Command *cmd) {
NSLog(@"1");
}] ;
[CommandManager executeCommand:command2 completion:^(Command *cmd) {
NSLog(@"2");
}] ;
[CommandManager executeCommand:command3 completion:^(Command *cmd) {
NSLog(@"3");
}] ;