iOS開發(fā)進(jìn)階-適配器&單例&命令

課程: 新浪微博資深大牛全方位剖析 iOS 高級(jí)面試

一戳气、六大設(shè)計(jì)原則

  • 單一職責(zé)原則:一個(gè)類只負(fù)責(zé)一件事
  • 依賴倒置原則:抽象不該依賴于具體實(shí)現(xiàn)哥捕,具體實(shí)現(xiàn)可以依賴抽象
  • 開閉原則:對(duì)修改關(guān)閉倒信,對(duì)擴(kuò)展開發(fā)
  • 里氏替換原則:父類可以被子類無(wú)縫替換猜拾,且原有功能不受影響(例如:KVO)
  • 接口隔離原則:使用多個(gè)專門的協(xié)議绍昂、而不是一個(gè)龐大臃腫的協(xié)議(例如:UITableViewDelegate,UITableViewDataSource)
  • 迪米特法則:一個(gè)對(duì)象應(yīng)當(dāng)對(duì)其他對(duì)象盡可能少的了解(高內(nèi)聚、低耦合)

二拼岳、適配器

適配器模式(Adapter Pattern) :將一個(gè)接口轉(zhuǎn)換成客戶希望的另一個(gè)接口枝誊,適配器模式使接口不兼容的那些類可以一起工作,其別名為包裝器(Wrapper)惜纸。適配器模式既可以作為類結(jié)構(gòu)型模式侧啼,也可以作為對(duì)象結(jié)構(gòu)型模式。

本節(jié)主要學(xué)習(xí)對(duì)象適配器模式堪簿,簡(jiǎn)單的類結(jié)構(gòu)如下痊乾。

適配對(duì)象中一個(gè)成員變量指向被適配對(duì)象。

示例代碼:有兩個(gè)類Target是被適配對(duì)象椭更,CoolTarget為適配對(duì)象哪审。

Target類

#import <Foundation/Foundation.h>

@interface Target : NSObject

- (void)operation;

@end

#import "Target.h"

@implementation Target

- (void)operation
{
    // 原有的具體業(yè)務(wù)邏輯
}

@end

CoolTarget類:

#import "Target.h"

// 適配對(duì)象
@interface CoolTarget : NSObject

// 被適配對(duì)象
@property (nonatomic, strong) Target *target;

// 對(duì)原有方法包裝
- (void)request;

@end

#import "CoolTarget.h"

@implementation CoolTarget

- (void)request
{
    // 額外處理
    
    [self.target operation];
    
    // 額外處理
}

@end

適配器優(yōu)點(diǎn):

  • 將目標(biāo)類和適配者類解耦,通過引入一個(gè)適配器類來(lái)重用現(xiàn)有的適配者類虑瀑,而無(wú)須修改原有代碼湿滓。
  • 增加了類的透明性和復(fù)用性,將具體的實(shí)現(xiàn)封裝在適配者類中舌狗,對(duì)于客戶端類來(lái)說(shuō)是透明的叽奥,而且提高了適配者的復(fù)用性。
  • 靈活性和擴(kuò)展性都非常好痛侍,通過使用配置文件朝氓,可以很方便地更換適配器,也可以在不修改原有代碼的基礎(chǔ)上增加新的適配器類,完全符合“開閉原則”赵哲。

三待德、單例

單例模式(Singleton Pattern):?jiǎn)卫J酱_保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例枫夺,這個(gè)類稱為單例類将宪,它提供全局訪問的方法。

單例模式的要點(diǎn)有三個(gè):一是某個(gè)類只能有一個(gè)實(shí)例橡庞;二是它必須自行創(chuàng)建這個(gè)實(shí)例较坛;三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。單例模式是一種對(duì)象創(chuàng)建型模式扒最。單例模式又名單件模式或單態(tài)模式燎潮。

示例代碼:

@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

注意點(diǎn):為了防止使用者創(chuàng)建對(duì)象,需要從重寫兩個(gè)方法allocWithZonecopyWithZone:扼倘。另外instance = [[super allocWithZone:NULL] init];需要使用super方法調(diào)用防止在第一創(chuàng)建時(shí)循環(huán)調(diào)用确封。

四、命令模式

命令模式(Command Pattern):將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象再菊,從而使我們可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化爪喘;對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志,以及支持可撤銷的操作纠拔。命令模式是一種對(duì)象行為型模式秉剑,其別名為動(dòng)作(Action)模式或事務(wù)(Transaction)模式。

代碼實(shí)例:一個(gè)命令對(duì)象和一個(gè)命令管理者稠诲。

Command

@class Command;
typedef void(^CommandCompletionCallBack)(Command* cmd);

@interface Command : NSObject
@property (nonatomic, copy) CommandCompletionCallBack completion; // 執(zhí)行回調(diào)

- (void)execute; // 執(zhí)行
- (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;
        // 在數(shù)組中移除
        [[CommandManager sharedInstance].arrayCommands removeObject:self];
    });
}

@end

CommandManager

#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

命令模式的優(yōu)點(diǎn)

  • 降低系統(tǒng)的耦合度。
  • 新的命令可以很容易地加入到系統(tǒng)中臀叙。
  • 可以比較容易地設(shè)計(jì)一個(gè)命令隊(duì)列和宏命令(組合命令)略水。
  • 可以方便地實(shí)現(xiàn)對(duì)請(qǐng)求的Undo和Redo。

代碼:DesignPatten

參考

適配器模式
單例模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末劝萤,一起剝皮案震驚了整個(gè)濱河市渊涝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌床嫌,老刑警劉巖跨释,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異厌处,居然都是意外死亡鳖谈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門阔涉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)缆娃,“玉大人捷绒,你說(shuō)我怎么就攤上這事×淞担” “怎么了疙驾?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵凶伙,是天一觀的道長(zhǎng)郭毕。 經(jīng)常有香客問我,道長(zhǎng)函荣,這世上最難降的妖魔是什么显押? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮傻挂,結(jié)果婚禮上乘碑,老公的妹妹穿的比我還像新娘。我一直安慰自己金拒,他們只是感情好兽肤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绪抛,像睡著了一般资铡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幢码,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天笤休,我揣著相機(jī)與錄音,去河邊找鬼症副。 笑死店雅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贞铣。 我是一名探鬼主播闹啦,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辕坝!你這毒婦竟也來(lái)了亥揖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤圣勒,失蹤者是張志新(化名)和其女友劉穎费变,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體圣贸,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挚歧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吁峻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滑负。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡在张,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矮慕,到底是詐尸還是另有隱情帮匾,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布痴鳄,位于F島的核電站瘟斜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏痪寻。R本人自食惡果不足惜螺句,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望橡类。 院中可真熱鬧蛇尚,春花似錦、人聲如沸顾画。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)研侣。三九已至谱邪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間义辕,已是汗流浹背虾标。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓回论,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蘸吓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時(shí)需要注意以下幾點(diǎn):a) 高內(nèi)聚撩幽、低耦合和單一職能的“沖突”實(shí)際上库继,這兩者...
    彥幀閱讀 3,734評(píng)論 0 14
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)窜醉,斷路器宪萄,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 參考資料:菜鳥教程之設(shè)計(jì)模式 設(shè)計(jì)模式概述 設(shè)計(jì)模式(Design pattern)代表了最佳的實(shí)踐,通常被有經(jīng)驗(yàn)...
    Steven1997閱讀 1,165評(píng)論 1 12
  • 現(xiàn)如今居凶,整個(gè)互聯(lián)網(wǎng)現(xiàn)已進(jìn)入大數(shù)據(jù)年代虫给,“大數(shù)據(jù)”一詞的要點(diǎn)現(xiàn)也現(xiàn)已不只在于數(shù)據(jù)規(guī)劃的定義,它更代表著信息技術(shù)展開進(jìn)...
    bigdata大大閱讀 1,108評(píng)論 2 6
  • 這本《藍(lán)獅子寫作課系列》吳曉波老師寫作的,很喜歡他寫的書弄兜,這本書合集也是曉波老師講述寫作的一些技巧药蜻,非常的坦誠(chéng)。但...
    孫慕言閱讀 162評(píng)論 0 0