一设计模式6大原则:
单一职责原则:一个类只做一件事(UILayer UIVIew)
开闭原则:对修改关闭 对拓展开放
依赖倒置原则:抽象不应该依赖具体实现 具体实现可以依赖于对象
接口隔离原则:使用多个专门协议,而不是一个庞大的臃肿的协议,tableview的DataSource 和Delegate
理氏替换原则:父类可以被子类无缝替换,且原有功能不受任何影响KVO
迪米特原则:一个对象应当对其他对象尽可能少了解
二、iOS具体操作实现:
责任链:某一类拥有它的属性 nextResponse
一个关于需求变更的问题
business A-->businessB-->businessC 转换成businessB-->businessC-->business A
桥接:一个关于解耦的问题 一个list具有多个网络数据源 抽象ClassA ----ClassB
(A1 A2 A3)-----(B1,B2B3)
适配器:一个现有类需要适应变化问题;
对象适配器:适配对象---成员变量--被适配对象
- (void){
//适配逻辑
【被适配对象 某方法】
//适配逻辑
}
类对象适配器
单例模式:一个健壮性强的单例模式
+ (id)sharedInstance
{
// 静态局部变量
static 类名 *instance = nil;
// 通过dispatch_once方式 确保instance在多线程环境下只被创建一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 创建实例 使用super来创建就是避免循环调用问题
instance = [[super allocWithZone:NULL] init];
});
return instance;
}
// 重写方法【必不可少】为了方式外界逃脱 就得返回sharedInstance方法
+ (id)allocWithZone:(struct _NSZone *)zone{
return [self sharedInstance];
}
// 重写方法【必不可少】规避外界对selfcopy导致对象发生改变
- (id)copyWithZone:(nullable NSZone *)zone{
return self;
}
命令行模式:
在一个命令管理器类中来管理使用的命令
@class Command;
typedef void(^CommandCompletionCallBack)(Command* cmd);
@interface Command : NSObject
@property (nonatomic, copy) CommandCompletionCallBack completion;
- (void)execute;
- (void)cancel;
- (void)done;
---------
@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];
});
}
#import "Command.h"
@interface CommandManager : NSObject
// 命令管理容器
@property (nonatomic, strong) NSMutableArray
// 命令管理者以单例方式呈现
+ (instancetype)sharedInstance;
// 执行命令
+ (void)executeCommand:(Command *)cmd completion:(CommandCompletionCallBack)completion;
// 取消命令
+ (void)cancelCommand:(Command *)cmd;
@end
#import "CommandManager.h"
@implementation CommandManager
// 命令管理者以单例方式呈现
+ (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) {
// 如果命令正在执行不做处理,否则添加并执行命令
if (![self _isExecutingCommand:cmd]) {
// 添加到命令容器当中
[[[self sharedInstance] arrayCommands] addObject:cmd];
// 设置命令执行完成的回调
cmd.completion = completion;
//执行命令
[cmd execute];
}
}
}
// 取消命令
+ (void)cancelCommand:(Command *)cmd
{
if (cmd) {
// 从命令容器当中移除
[[[self sharedInstance] arrayCommands] removeObject:cmd];
// 取消命令执行
[cmd cancel];
}
}
// 判断当前命令是否正在执行
+ (BOOL)_isExecutingCommand:(Command *)cmd
{
if (cmd) {
NSArray *cmds = [[self sharedInstance] arrayCommands];
for (Command *aCmd in cmds) {
// 当前命令正在执行
if (cmd == aCmd) {
return YES;
}
}
}
return NO;
}
@end