概要
說(shuō)到設(shè)計(jì)模式爱沟,可能大多數(shù)程序員的腦海里第一時(shí)間飄過(guò)的是下面的一系列文字:?jiǎn)卫J健⒋砟J酱冶场⒂^察者模式呼伸、工廠方法模式等等,以上幾個(gè)是平時(shí)用得最多的也是大家耳熟能詳?shù)脑O(shè)計(jì)模式钝尸。當(dāng)然括享,設(shè)計(jì)模式并不僅限于這幾個(gè),還有更多珍促,諸如:適配器模式铃辖、組合模式、裝飾模式猪叙、策略模式娇斩、命令模式、責(zé)任鏈模式穴翩、中介者模式等等犬第,這些設(shè)計(jì)模式有的會(huì)很好的應(yīng)用在項(xiàng)目中,也有的用到的概率很低芒帕。接下來(lái)歉嗓,就介紹一下其中比較簡(jiǎn)單的一個(gè) —— 中介者模式。
簡(jiǎn)介
<p>
何為中介者模式背蟆?
中介者模式是用一個(gè)對(duì)象來(lái)封裝一組或者一系列對(duì)象的交互方式鉴分,使對(duì)象間的交互可以在一個(gè)中介者對(duì)象中處理哮幢,從而使各對(duì)象耦合松散,而且可以獨(dú)立的改變它們之間的交互志珍。中介者就好比站在十字路口的交通警察家浇,如果改變十字路口的交通模式,只需要把新的交通策略給交通警察即可碴裙,而不是路上的所有車輛钢悲,這樣才能更好的協(xié)調(diào)來(lái)自不同方向車輛。
中介者模式有什么用舔株?
說(shuō)到中介者模式的作用莺琳,其實(shí)從上述的定義中便可以知道其大體用處,無(wú)非是用來(lái)集中的管理一組對(duì)象的交互载慈,從而降低各個(gè)對(duì)象間的耦合度惭等。當(dāng)一組對(duì)象彼此間的依賴程度較高,導(dǎo)致難以復(fù)用時(shí)办铡,便可以采用該模式辞做。中介者,在應(yīng)用程序整個(gè)生命周期應(yīng)該只有一個(gè)實(shí)例寡具,否則將無(wú)法管理多個(gè)對(duì)象間的交互秤茅,所以要使用單例實(shí)現(xiàn)。
使用場(chǎng)景
有這樣的一個(gè)需求童叠,在一個(gè)根視圖控制器中(暫且稱之為rootVC)框喳,有三個(gè)button,點(diǎn)擊不同的button都會(huì)跳到對(duì)應(yīng)的視圖控制器中厦坛,分別是firstVC五垮、secondVC、thirdVC杜秸。也許你會(huì)說(shuō)放仗,直接在rootVC中寫跳轉(zhuǎn)不是更簡(jiǎn)單嗎?在視圖控制器數(shù)量很少的情況下撬碟,這樣的確比較簡(jiǎn)單直接诞挨,但是當(dāng)后期試圖控制器數(shù)量增多時(shí),你會(huì)發(fā)現(xiàn)rootVC中的代碼量變得復(fù)雜難以維護(hù)小作,所以需要一個(gè)中介者來(lái)協(xié)調(diào)他們的之間交互亭姥,從而降低耦合度、提高代碼的維護(hù)性顾稀。代碼如下:
1达罗、rootVC中的button點(diǎn)擊方法:
- (IBAction)clickedFirstAction:(UIButton *)sender {
[self coordinateToDifferentControllerWith:sender.tag];
}
- (IBAction)clickedSecondAction:(UIButton *)sender {
[self coordinateToDifferentControllerWith:sender.tag];
}
- (IBAction)clickedThirdAction:(UIButton *)sender {
[self coordinateToDifferentControllerWith:sender.tag];
}
- (void)coordinateToDifferentControllerWith:(NSInteger)tag {
[[MediatorManager sharedManager] coordinateViewControllers:@(tag)];
}
2、中介者(MediatorManager)中要保持一個(gè)對(duì)rootVC的引用,.h文件代碼如下:
#import <Foundation/Foundation.h>
@class ViewController, UIViewController;
typedef NS_ENUM(NSInteger, ButtonTag) {
ButtonTagFirstVC = 1,
ButtonTagSecondVC = 2,
ButtonTagThirdVC = 3,
};
@interface MediatorManager : NSObject
@property (nonatomic, strong, readonly) ViewController *rootVC;
@property (nonatomic, strong, readonly) UIViewController *activeVC;
+ (MediatorManager *)sharedManager;
- (void)coordinateViewControllers:(id)tagValue;
@end
3粮揉、MediatorManager的.m文件代碼:
#import "MediatorManager.h"
#import "ViewController.h"
#import "FirstViewController.h"
#import "SecondViewController.h"
#import "ThirdViewController.h"
@implementation MediatorManager
+ (MediatorManager *)sharedManager {
static MediatorManager *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
- (void)coordinateViewControllers:(id)tagValue {
if ([tagValue isKindOfClass:[NSNumber class]]) {
switch ([tagValue integerValue]) {
case ButtonTagFirstVC:
{
FirstViewController *firstVC = [[FirstViewController alloc] init];
_activeVC = firstVC;
[self.rootVC.navigationController pushViewController:firstVC animated:YES];
}
break;
case ButtonTagSecondVC:
{
SecondViewController *secondVC = [[SecondViewController alloc] init];
_activeVC = secondVC;
[self.rootVC.navigationController pushViewController:secondVC animated:YES];
}
break;
case ButtonTagThirdVC:
{
ThirdViewController *thirdVC = [[ThirdViewController alloc] init];
_activeVC = thirdVC;
[self.rootVC.navigationController pushViewController:thirdVC animated:YES];
}
break;
default:
_activeVC = self.rootVC;
[self.rootVC.navigationController popViewControllerAnimated:YES];
break;
}
}
}
@end
注意:在coordinateViewControllers方法里巡李,用的是switch語(yǔ)句來(lái)判斷各個(gè)試圖控制的跳轉(zhuǎn),此方法并不是很好扶认,如果視圖控制器的數(shù)量增多時(shí)侨拦,這樣顯然不好,采用策略模式會(huì)更好一些辐宾。至于策略模式狱从,會(huì)在以后的文章中作介紹。