前一篇《設計模式之感悟和實踐(一)》介紹瞭如何去掉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 <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
複製程式碼
看完程式碼大家有沒有恍然大悟呢。其實遇到場景多了,思路多了,思路自然而然就來了。 原始碼傳送門
總結
對於一個工程,如果基礎打的好,對於後期維護就是如魚得水,如果一開始工程就很爛,後期的維護真的是災難啊!所以各位有沒有遇到坑呢?反正我是遇到了深有體會。