Target - action(目標 - 行為)模式,我的理解就是給我們創(chuàng)建的某個控件或視圖或者自定義控件添加一個像按鈕(Button)那樣的監(jiān)測響應方法,來實現(xiàn)與用戶的交互.
例如iOS中的UIView能夠接收到觸摸事件,但是默認是對觸摸事件不做處理的,如果你想讓視圖做出處理,就必須要自定義一個視圖(繼承自UIView).那么我們通過一個簡單的小例子,來了解下什么是Target - action設計模式,假如現(xiàn)在我們有需求如下:
1.屏幕上的紅色視圖 ---點擊改變自身顏色
2.屏幕上的綠色視圖 -- 點擊改變父類顏色
3.屏幕上的藍色視圖 -- 點擊改變自身大小
初學的時候,會想到用三個自定義視圖,來分別實現(xiàn)點擊時,三個視圖分別做出不同的效果.這樣的做的話,太麻煩了.那么有沒有一種只需要定義一個視圖,分別調(diào)用三個不同的方法,來實現(xiàn)點擊不同視圖出現(xiàn)的不同效果呢?接下來,我們就來新建個工程做一下.
首先,我們先新建一個工程(我用的是MRC),之后再創(chuàng)建一個視圖控制器,創(chuàng)建好視圖控制器后,在AppDelegate.m文件的application:didFinishLaunchingWithOptions:方法中指定為window的根視圖控制器

接下來創(chuàng)建一個自定義視圖EventView,這個視圖就是用來添加方法的,從而使外部用EventView視圖創(chuàng)建的對象,可以用自身帶的方法,來響應事件的處理.


上圖在EventView.m文件中加了一個EventView類的延展,里面添加了兩個屬性,分別用來存放響應的目標,和響應的方法.然后再視圖控制器里面創(chuàng)建EventView視圖對象-- 紅色視圖,綠色視圖,和藍色視圖.

在視圖控制器中,我們用自定義的視圖EventView創(chuàng)建了一個紅色視圖對象,這個redView對象調(diào)用了EventView視圖的addTarget:action:方法,這樣就可以單獨的對這個紅色視圖進行響應處理,響應處理的方法是handleRedView:

由于我們改變顏色是隨機顏色,這樣我們需要寫一個UIColor類的擴展,添加一個+號方法,來實現(xiàn)顏色的隨機.

這樣整體寫完了,我們來理一理這個中間的過程到底是怎么回事,首先,我們在視圖控制器中創(chuàng)建一個EventView對象redView,因為當我們點擊時要改變自身的顏色,因此,它需要調(diào)用EventView里面的addTarget:action:方法,當我們點擊屏幕上的紅色視圖時,調(diào)用EventView視圖類的addTarget:action方法,方法調(diào)用完后,里面_target存放的響應目標是視圖控制器,_action存放的方法就為handleRedView:,因為是觸摸事件,我們將執(zhí)行EventView里面的- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;這個方法,讓響應目標Target執(zhí)行對應的action方法,最后,我們就回到了視圖控制器中執(zhí)行handleRedView:方法.

你想象一下Button按鈕的響應方法模式,再聯(lián)系這個,他們的思想是一樣的.而設計模式之所以存在,就是為了降低程序的耦合性,提高內(nèi)聚性,提升程序的可修改性,可擴展性.