設計模式之感悟和實踐(二)

收藏待读

設計模式之感悟和實踐(二)

前一篇 《設計模式之感悟和實踐(一)》 介紹了如何去掉 if...else switch...case 的應用場景,這篇文章我們將介紹另外一種場景的綜合運用

如果沒有看前一篇文章的,建議首先看一下。

具體使用

場景回憶

前一篇文章我們是使用責任鏈設計模式教大家消除判斷語句,具體如下格式:

//點擊事件
- (IBAction)actionButton1:(id)sender {
  //這是偽代碼,一個點擊事件對應兩種情況的處理
  if(EVENT1){
    //code處理
  }else if(EVENT2){
    //code處理
  }
}

經過設計模式的處理如下:

- (IBAction)actionButton1:(id)sender {
    MyHandle *myHandle = [[MyHandle alloc] initWithType:EVENT1];
    [myHandle handleClick];
}

好處可謂是不言而喻。

新場景

有時候我們還會遇到如下的場景:

//點擊事件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 的處理即可 則變成如下:

- (IBAction)actionButton2:(id)sender {
    MyHandle2 *myHandle = [[MyHandle2 alloc] initWithType:EVENT1];
    [myHandle handleClick];
}

把所有的類再重新聲明一遍就可解決。 這種方法針對這種情況確實也能處理,而且看着不錯的樣子喲。 不過缺點也顯而易見:

  • 類的數量暴增

  • 針對EVENT1和EVENT2事件的處理分散到多個類中

新場景處理

不管有幾個點擊事件,我們都是同一個 MyHandle 類來處理,這樣可以大大簡化使用。

類的設計還是之前那幾個類:

設計模式之感悟和實踐(二)

讓我們看看各個類中的設計:

ActionClickProtocol.h

@protocol ActionClickProtocol - (void)handleClick;
- (void)handleClick2;//新增加的方法
- (void)setNext:(id)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

看完代碼大家有沒有恍然大悟呢。其實遇到場景多了,思路多了,思路自然而然就來了。 源碼傳送門

總結

對於一個工程,如果基礎打的好,對於後期維護就是如魚得水,如果一開始工程就很爛,後期的維護真的是災難啊!所以各位有沒有遇到坑呢?反正我是遇到了深有體會。

原文 : CocoaChina

相關閱讀

免责声明:本文内容来源于CocoaChina,已注明原文出处和链接,文章观点不代表立场,如若侵犯到您的权益,或涉不实谣言,敬请向我们提出检举。