IOS 知识梳理之设计模式

一设计模式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 *arrayCommands;

 

// 命令管理者以单例方式呈现

+ (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

 

 

你可能感兴趣的:(个人OC知识梳理)