設(shè)計(jì)模式-iOS常見

一、單例模式

系統(tǒng)的單例模式(Singleton Pattern)

[UIApplication sharedApplication];
[NSHTTPCookieStorage sharedHTTPCookieStorage];
二、中介者模式

中介者模式(Mediator Pattern):將對(duì)象之間的通信封裝到一個(gè)類中單獨(dú)處理,MVC模式中C就是V和M的中介者。

三、觀察者模式

觀察者模式(Observer Pattern):定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。iOS中有NSNotificationCenterKVO.

四、組合模式

組合模式(Composite Pattern):將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分--整體”的層次結(jié)構(gòu)。 這種模式創(chuàng)建了一個(gè)包含自己對(duì)象組的類,該類提供了修改相同對(duì)象組的方式(比如addObj:, removeObj:)。
在Cocoa Touch 框架中,UIView被組織成一個(gè)組合結(jié)構(gòu),每個(gè)UIView的實(shí)例可以包含UIView的其他實(shí)例(subViews),形成統(tǒng)一的樹形結(jié)構(gòu)。

五、命令者模式

命令者模式(Command Pattern):通過調(diào)用者調(diào)用接受者執(zhí)行命令,順序:調(diào)用者→命令→接受者。iOS 中的addTarget:action:forControlEvents:

[buton addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
六、代理模式

代理模式(Proxy Pattern): 常見的有tableviewDelegate.

六、迭代器模式

迭代器模式(Iterator Pattern): 讓你能通過迭代器對(duì)象訪問到數(shù)組或集合中的每個(gè)元素。iOS中的NSArray、NSSet、NSDictionay都可以通過方法獲取到迭代器。

NSArray *arr = @[@"A", @"B", @"C", @"D", @"E"];
NSEnumerator *iterator1 = [arr objectEnumerator];
NSEnumerator *iterator2 = [arr reverseObjectEnumerator];
id obj = nil;
while (obj = [iterator1 nextObject]) {
   NSLog(@"obj = %@", obj);
}
// 上面打印結(jié)果A B C D E
while (obj = [iterator2 nextObject]) {
    NSLog(@"obj = %@", obj);
}
// 上面打印結(jié)果E D C B A
七、享元模式

享元模式(Flyweight Pattern):避免大量地重復(fù)創(chuàng)建對(duì)象,減少內(nèi)存占用提高性能。
在iOS中的運(yùn)用比如有UITableViewCell的重用機(jī)制。

八、模板模式

模板模式(Template Pattern): 子類可以按需要重寫方法實(shí)現(xiàn),但調(diào)用以父類中定義的方式進(jìn)行。比如iOS中的UIViewController的- (void)viewWillAppear:(BOOL)animated等。

九、策略模式

策略模式(Strategy Pattern):解決在有多種算法相似的情況下,使用 if...else 所帶來的復(fù)雜和難以維護(hù)。
具體使用:定義一個(gè)基類,基類擁有一個(gè)共有的方法;然后將if...else 中執(zhí)行的操作定義到不同的子類中,使用時(shí)先創(chuàng)建不同的操作設(shè)置到原來類中作為屬性,然后原本的if...else中改為調(diào)用基類的這個(gè)方法,這樣實(shí)現(xiàn)了不同操作之間的解耦。

十、責(zé)任鏈模式

責(zé)任鏈模式(Chain of Responsibility Pattern): 創(chuàng)建一個(gè)事件接受者對(duì)象的鏈,事件來臨時(shí)如果對(duì)象自身不能處理就交給下一個(gè)對(duì)象。在iOS中的響應(yīng)鏈就是責(zé)任鏈模式。

十一、備忘錄模式

備忘錄模式(Memento Pattern): 保存一個(gè)對(duì)象及其狀態(tài),以便在合適的時(shí)候進(jìn)行恢復(fù),iOS中的運(yùn)用比如有解歸檔+屬性列表序列化實(shí)現(xiàn)。
對(duì)象遵守NSCoding協(xié)議,實(shí)現(xiàn)其方法:

- (void)encodeWithCoder:(NSCoder *)coder;
- (instancetype)initWithCoder:(NSCoder *)coder;

AFNetworking中也使用了:
AFSecurityPolicy.m中

- (instancetype)initWithCoder:(NSCoder *)decoder {

    self = [self init];
    if (!self) {
        return nil;
    }

    self.SSLPinningMode = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(SSLPinningMode))] unsignedIntegerValue];
    self.allowInvalidCertificates = [decoder decodeBoolForKey:NSStringFromSelector(@selector(allowInvalidCertificates))];
    self.validatesDomainName = [decoder decodeBoolForKey:NSStringFromSelector(@selector(validatesDomainName))];
    self.pinnedCertificates = [decoder decodeObjectOfClass:[NSArray class] forKey:NSStringFromSelector(@selector(pinnedCertificates))];

    return self;
}
十二、生產(chǎn)者消費(fèi)者模式

生產(chǎn)者消費(fèi)者模式(Producer-Consumer Pattern):有兩個(gè)模塊,生產(chǎn)者負(fù)責(zé)生產(chǎn)數(shù)據(jù),消費(fèi)者負(fù)責(zé)處理數(shù)據(jù),兩個(gè)模塊處理的時(shí)間可以是不一致的,這個(gè)時(shí)候我們就可以像建立“倉庫”那樣,建立一個(gè)緩沖區(qū),生產(chǎn)數(shù)據(jù)之后放到緩沖區(qū),處理數(shù)據(jù)時(shí)從緩沖區(qū)中取,這種模式就是消費(fèi)者生產(chǎn)者模式。
在iOS中,信號(hào)量dispatch_semaphore就是這個(gè)模式的一個(gè)例子

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);// 最大并發(fā)數(shù)
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 消費(fèi)者
        while (1) {
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
            NSLog(@"得到了一個(gè)信號(hào)!!!!");
        }
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 生產(chǎn)者
        while (1) {
            dispatch_semaphore_signal(semaphore);
            NSLog(@"生產(chǎn)了一個(gè)信號(hào)----");
            sleep(1);
        }
    });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容