版本記錄
版本號 | 修改時間 |
---|---|
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ù)哦墨林,這里我要感謝其他作者分享的資料施戴,謝謝大家對我的支持。