前一篇《設計模式之感悟和實踐(一)》介紹瞭如何去掉if...else
和switch...case
的應用場景,這篇文章咱們將介紹另一種場景的綜合運用git
若是沒有看前一篇文章的,建議首先看一下。github
前一篇文章咱們是使用責任鏈設計模式教你們消除判斷語句,具體以下格式:設計模式
//點擊事件
- (IBAction)actionButton1:(id)sender {
//這是僞代碼,一個點擊事件對應兩種狀況的處理
if(EVENT1){
//code處理
}else if(EVENT2){
//code處理
}
}
複製代碼
通過設計模式的處理以下:spa
- (IBAction)actionButton1:(id)sender {
MyHandle *myHandle = [[MyHandle alloc] initWithType:EVENT1];
[myHandle handleClick];
}
複製代碼
好處可謂是不言而喻。設計
有時候咱們還會遇到以下的場景:3d
//點擊事件1
- (IBAction)actionButton1:(id)sender {
//這是僞代碼,一個點擊事件對應兩種狀況的處理
if(EVENT1){
//code處理
}else if(EVENT2){
//code處理
}
}
//點擊事件2
- (IBAction)actionButton2:(id)sender {
//這是僞代碼,一個點擊事件對應兩種狀況的處理
if(EVENT1){
//code處理
}else if(EVENT2){
//code處理
}
}
複製代碼
以上場景則是兩處點擊事件:針對於EVENT1和EVENT2都有不一樣的代碼處理,這時候咱們怎麼處理呢? 可能有的同窗第一個映入眼簾的想法則是賦值一遍- (IBAction)actionButton1:(id)sender
的處理便可 則變成以下:code
- (IBAction)actionButton2:(id)sender {
MyHandle2 *myHandle = [[MyHandle2 alloc] initWithType:EVENT1];
[myHandle handleClick];
}
複製代碼
把全部的類再從新聲明一遍就可解決。 這種方法針對這種狀況確實也能處理,並且看着不錯的樣子喲。 不過缺點也顯而易見:cdn
無論有幾個點擊事件,咱們都是同一個MyHandle
類來處理,這樣能夠大大簡化使用。blog
類的設計仍是以前那幾個類:事件
讓咱們看看各個類中的設計:
ActionClickProtocol.h
@protocol ActionClickProtocol <NSObject>
- (void)handleClick;
- (void)handleClick2;//新增長的方法
- (void)setNext:(id<ActionClickProtocol>)actionClickHandle;
@end
typedef NS_ENUM(NSUInteger, HandleType) {
EVENT1,
EVENT2,
};
複製代碼
增長了- (void)handleClick2;
方法,因此ActionClickEvent1
、ActionClickEvent2
和ActionClickHandle
均會增長該方法。
ActionClickEvent1.m
@implementation ActionClickEvent1
-(void)handleClick{
NSLog(@"點擊1事件1的處理");
}
-(void)handleClick2{//新增長的方法
NSLog(@"點擊2事件1的處理");
}
@end
複製代碼
MyHandle.m
@implementation MyHandle
- (instancetype)initWithType:(HandleType)type{
self = [super init];
if (self) {
_type = type;
_event1 = [[ActionClickEvent1 alloc] init];
_event1.type = EVENT1;
_event2 = [[ActionClickEvent2 alloc] init];
_event2.type = EVENT2;
[_event1 setNextHandle:_event2];
self.nextHandle = _event1;
}
return self;
}
- (void)handleClick{
if (self.nextHandle.type==self.type) {
[self.nextHandle handleClick];
}else{
while (self.nextHandle.type!=self.type) {
self.nextHandle = self.nextHandle.nextHandle;
}
[self.nextHandle handleClick];
}
}
- (void)handleClick2{//新增長的方法
if (self.nextHandle.type==self.type) {
[self.nextHandle handleClick2];
}else{
while (self.nextHandle.type!=self.type) {
self.nextHandle = self.nextHandle.nextHandle;
}
[self.nextHandle handleClick2];
}
}
@end
複製代碼
看完代碼你們有沒有恍然大悟呢。其實遇到場景多了,思路多了,思路天然而然就來了。 源碼傳送門
對於一個工程,若是基礎打的好,對於後期維護就是如魚得水,若是一開始工程就很爛,後期的維護真的是災難啊!因此各位有沒有遇到坑呢?反正我是遇到了深有體會。