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

FlyOceanFish發表於2019-01-10

前一篇《設計模式之感悟和實踐(一)》介紹瞭如何去掉if...elseswitch...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 <NSObject>
- (void)handleClick;
- (void)handleClick2;//新增加的方法
- (void)setNext:(id<ActionClickProtocol>)actionClickHandle;
@end

typedef NS_ENUM(NSUInteger, HandleType) {
    EVENT1,
    EVENT2,
};
複製程式碼

增加了- (void)handleClick2;方法,所以ActionClickEvent1ActionClickEvent2ActionClickHandle均會增加該方法。

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
複製程式碼

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

總結

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

相關文章