23種設(shè)計模式(一)

版本記錄

版本號 修改時間
V1.0 2017.04.24

前言

不管java、oc還是其他面向?qū)ο蟮恼Z言,它們在設(shè)計模式上是相通的,不同的只是語法。下面我就詳細(xì)的說一下oc中23種設(shè)計模式。再說之前先介紹兩篇我查閱的github地址和簡書博客,如下:
1、Github:Design-Pattern-For-iOS
2、簡書地址

簡述

下面簡單說明23種設(shè)計模式。

設(shè)計模式 說明
1.策略模式-Strategy 它定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化,不會影響到使用算法的客戶。
2.裝飾模式-Decorator 動態(tài)的給一個對象添加有一些額外的職責(zé),就增加功能來說,裝飾模式比生成子類更為靈活。
3.代理模式-Proxy 為其他對象提供一種代理以控制對這個對象的訪問。
4.工廠方法模式-Factory method 定義一個擁有創(chuàng)建對象的接口,讓子類決定實(shí)例化哪一個類,工廠方法使一個類的實(shí)例化延遲到其子類。
5.原型模式-Prototype 用原型實(shí)例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。
6.模板方式模式-Template method 定義一個操作中的算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
7.外觀模式-Facade 為子系統(tǒng)中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。
8.建造者模式-Builder 將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
9.觀察者模式-Observer 定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)發(fā)生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。
10.抽象工廠模式-Abstract Factory 提供了一個創(chuàng)建一些列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類。
11.狀態(tài)模式-State 當(dāng)一個對象的內(nèi)在狀態(tài)改變時允許改變其行為,這個對象看起來像是改變了其類。
12.適配器模式-Adapter 將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口,adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
13.備忘錄模式-Memento 在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài),這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)。
14.組合模式-Composite 將對象組合成樹形結(jié)構(gòu)以表示“部分--整體”的層次結(jié)構(gòu),組合模式使得用戶對單個對象和組合對象的使用具有一致性。
15.迭代器模式-Iterator 提供一種方法順序訪問一個聚合對象中的各個元素,而又不暴露該對象的內(nèi)部表示。
16.單例模式-Singleton 保證一個類僅有一個實(shí)例,使它們都可以獨(dú)立地變化。
17.橋接模式-Bridge 將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。
18.命令模式-Command 將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進(jìn)行參數(shù)化,對請求排隊(duì)或記錄請求日志,以及支持可撤銷的操作。
19.職責(zé)鏈模式-Chain of Responsibility 使多個對象都有機(jī)會處理請求,從而避免請求的發(fā)送者和接受者之間的耦合關(guān)系,將這個對象連成一條鏈傳遞該請求,直到有一個對象處理它為止。
20.中介者模式-Mediator 用一個中介對象來封裝一系列的對象交互,中介者使各個對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。
21.享元模式-Flyweight 使用共享技術(shù)有效地支持大量細(xì)粒度的對象。
22.解釋器模式-Interpreter 給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示中解釋語言匯中的句子。
23.訪問者模式-Visitor 表示一個作用于某對象結(jié)構(gòu)中的各元素的操作,它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。

設(shè)計模式的基本原則非常重要,只要真正深入地理解了設(shè)計原則,很多設(shè)計模式其實(shí)就是原則的應(yīng)用而已,或許在不知不覺中就在使用設(shè)計模式了。

  • 單一職責(zé)原則(SRP):對一個類而言,只做一件事。
  • 開放-封閉原則(OCP):是說軟件實(shí)體(類,模塊,函數(shù)等等)應(yīng)該可以拓展,但是不可修改。
  • 依賴倒轉(zhuǎn)原則(DIP):A. 高層模塊不應(yīng)該依賴于底層模塊,兩個都應(yīng)該依賴抽象。 B. 抽象不應(yīng)該依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴抽象。
  • 里氏代換原則(LSP):子類必須能夠替換掉它們的父類型。
  • 迪米特法則(LoD): 如果兩個類不需要彼此直接通信,那么這兩個類就不應(yīng)當(dāng)發(fā)生直接的相互作用,如果其中一個類需要調(diào)用另外一個類的某一個方法的話,可以通過第三者轉(zhuǎn)發(fā)這個調(diào)用。
  • 合成/聚合復(fù)用原則(CARP):盡量使用合成/聚合,盡量不要使用類繼承。

詳述

一、策略模式——Strategy

先看一下文檔結(jié)構(gòu)。

策略模式

下面看詳細(xì)代碼。

1. HCDCashBase.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@protocol HCDCashBase <NSObject>
//@property(nonatomic,assign)CGFloat money;

- (CGFloat)acceptCash:(CGFloat)cash;

@end


2. HCDCashNormal.h
#import <Foundation/Foundation.h>
#import "HCDCashBase.h"

@interface HCDCashNormal : NSObject <HCDCashBase>

@end


3. HCDCashNormal.m
#import "HCDCashNormal.h"

@implementation HCDCashNormal

//@synthesize money = _money;

- (CGFloat)acceptCash:(CGFloat)cash{
    return cash;
}
@end

4. HCDCashRobate.h

#import <Foundation/Foundation.h>
#import "HCDCashBase.h"

@interface HCDCashRobate : NSObject <HCDCashBase>

- (instancetype)initWithMoneyRebate:(CGFloat)moneyRebate;

@end



5. HCDCashRobate.m

#import "HCDCashRobate.h"

@interface HCDCashRobate ()

@property (nonatomic, assign) CGFloat moneyRebate;

@end

@implementation HCDCashRobate
//@synthesize money = _money;

-(instancetype)initWithMoneyRebate:(CGFloat)moneyRebate{
    self = [super init];
    if (self) {
        _moneyRebate = moneyRebate;
    }
    return self;
}

-(CGFloat)acceptCash:(CGFloat)cash{
    
    return self.moneyRebate * cash;
}

@end

6. HCDCaseReturn.h

#import <Foundation/Foundation.h>
#import "HCDCashBase.h"

@interface HCDCaseReturn : NSObject <HCDCashBase>

- (instancetype)initWithMoneyReturn:(CGFloat)moneyReturn;

@end


7. HCDCaseReturn.m

#import "HCDCaseReturn.h"

@interface HCDCaseReturn ()

@property(nonatomic)CGFloat moneyReturn;

@end

@implementation HCDCaseReturn
//@synthesize money = _money;

- (instancetype)initWithMoneyReturn:(CGFloat)moneyReturn{
    self = [super init];
    if (self) {
        _moneyReturn = moneyReturn;
    }
    return self;
}

- (CGFloat)acceptCash:(CGFloat)cash{
    return cash - self.moneyReturn;
}

@end


8. HCDCashContext.h

#import <Foundation/Foundation.h>
#import "HCDCashBase.h"


typedef NS_ENUM(NSInteger, HCDCashType){
    
    CashTypeNormal = 0,
    CashTypeRobate,
    CashTypeReturn
    
};


@interface HCDCashContext : NSObject

- (instancetype)initWithCashSuper:(id<HCDCashBase>)cashBase;

- (instancetype)initWithCashType:(HCDCashType)type;

- (CGFloat)getResult:(CGFloat)money;

@end


9. HCDCashContext.m
#import "HCDCashContext.h"
#import "HCDCaseReturn.h"
#import "HCDCashNormal.h"
#import "HCDCashRobate.h"

@interface HCDCashContext()

@property (strong, nonatomic) id<HCDCashBase> cashSuper;

@end

@implementation HCDCashContext

- (instancetype)initWithCashSuper:(id<HCDCashBase>)cashBase{
    self = [super init];
    if (self) {
        self.cashSuper = cashBase;
    }
    return self;
}

- (instancetype)initWithCashType:(HCDCashType)type{
    self = [super init];
    if (self) {
        if (type == CashTypeNormal) {
            self.cashSuper = [[HCDCashNormal alloc]init];
           // self.cashSuper.money = money;
        }else if(type == CashTypeRobate){
            self.cashSuper = [[HCDCashRobate alloc]initWithMoneyRebate:0.8];
           // self.cashSuper.money = money;
        }else if(type == CashTypeReturn){
            self.cashSuper = [[HCDCaseReturn alloc]initWithMoneyReturn:5];
        }
    }
    return self;
}

- (CGFloat)getResult:(CGFloat)money{
    return [self.cashSuper acceptCash:money];
}

@end
10. ViewController.m

#import "ViewController.h"
#import "HCDCashContext.h"
#import "HCDCashNormal.h"
#import "HCDCashRobate.h"
#import "HCDCaseReturn.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    
    HCDCashContext *context = [[HCDCashContext alloc]initWithCashType:CashTypeNormal];
    NSLog(@"結(jié)果是%f",[context getResult:100]);

    
    HCDCashContext *contextReturn = [[HCDCashContext alloc]initWithCashType:CashTypeReturn];
    NSLog(@"結(jié)果是%f",[contextReturn getResult:100]);
    
    HCDCashContext *contextRobate = [[HCDCashContext alloc]initWithCashType:CashTypeRobate];
    NSLog(@"結(jié)果是%f",[contextRobate getResult:100]);
}

@end

這里寫了策略模式,相信大家都能看懂。就不多解釋了,代碼不難,就是列舉了一種思維模式或者設(shè)計方式而已。

后記

這里先寫一個策略模式,其他的待續(xù)哦,這里我要感謝其他作者分享的資料,謝謝大家對我的支持。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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