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

版本記錄

版本號 修改時間
V1.0 2017.04.24

前言

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

簡述

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

設(shè)計(jì)模式 說明
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è)計(jì)模式的基本原則非常重要的妖,只要真正深入地理解了設(shè)計(jì)原則绣檬,很多設(shè)計(jì)模式其實(shí)就是原則的應(yīng)用而已,或許在不知不覺中就在使用設(shè)計(jì)模式了羔味。

  • 單一職責(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è)計(jì)方式而已痊土。

后記

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末萌丈,一起剝皮案震驚了整個濱河市赞哗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辆雾,老刑警劉巖肪笋,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異度迂,居然都是意外死亡藤乙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門惭墓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坛梁,“玉大人,你說我怎么就攤上這事腊凶』溃” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵钧萍,是天一觀的道長褐缠。 經(jīng)常有香客問我,道長风瘦,這世上最難降的妖魔是什么队魏? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮万搔,結(jié)果婚禮上胡桨,老公的妹妹穿的比我還像新娘。我一直安慰自己瞬雹,他們只是感情好昧谊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挖炬,像睡著了一般揽浙。 火紅的嫁衣襯著肌膚如雪状婶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天馅巷,我揣著相機(jī)與錄音膛虫,去河邊找鬼。 笑死钓猬,一個胖子當(dāng)著我的面吹牛稍刀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敞曹,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼账月,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了澳迫?” 一聲冷哼從身側(cè)響起局齿,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎橄登,沒想到半個月后抓歼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拢锹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年谣妻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卒稳。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹋半,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出充坑,到底是詐尸還是另有隱情减江,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布匪傍,位于F島的核電站您市,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏役衡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一薪棒、第九天 我趴在偏房一處隱蔽的房頂上張望手蝎。 院中可真熱鬧,春花似錦俐芯、人聲如沸棵介。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邮辽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吨述,已是汗流浹背岩睁。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揣云,地道東北人捕儒。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像邓夕,于是被迫代替她去往敵國和親刘莹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

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