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

前一篇《設計模式之感悟和實踐(一)》介紹瞭如何去掉if...elseswitch...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

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

新場景處理

無論有幾個點擊事件,咱們都是同一個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;方法,因此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
複製代碼

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

總結

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

相關文章
相關標籤/搜索