首页 > 代码库 > 中介者模式

中介者模式

在iOS当中,如果控制器数量非常多,那么可以把它们之间的跳转逻辑独立到一个单独的类当中,这个类就是中介者。

实现中介者模式其实没必要按照类图来,没有必要把“中介”和“同事”做成抽象。这个中介者可以是一个单例。

下面给出一个用中介者来控制跳转的例子。

首先是中介者的定义:

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface RPControllerDirector : NSObject
 4 
 5 + (RPControllerDirector *)sharedInstance;
 6 
 7 - (void)registNavigationController:(UINavigationController *)navigationController;
 8 - (void)requestViewChange:(id)sender withIdentifier:(NSString *)identifier;
 9 
10 @end

这里定义了一个导演类负责控制器的切换,为了方便起见,定义了一个NavigationController属性,也可以根据需求不这么做。

并且,在这里定义了一个用于处理跳转的方法,留出了一个sender和一个字符串标记,因为不同界面可能有很多个按钮,但是给每个按钮都加TAG很不合理,所以干脆采用一个字符串。

在应用程序代理当中,设置NavigationController:

1 [[RPControllerDirector sharedInstance] registNavigationController:rootNC];

中介者的实现:

 1 static RPControllerDirector *sharedInstance = nil;
 2 
 3 @interface RPControllerDirector ()
 4 
 5 @property (weak, nonatomic) UINavigationController *navigationController;
 6 
 7 @end
 8 
 9 @implementation RPControllerDirector
10 
11 + (RPControllerDirector *)sharedInstance {
12     if (sharedInstance == nil) {
13         @synchronized(self) {
14             if (sharedInstance == nil) {
15                 sharedInstance = [[RPControllerDirector alloc] init];
16             }
17         }
18     }
19     return sharedInstance;
20 }
21 
22 - (void)registNavigationController:(UINavigationController *)navigationController {
23     self.navigationController = navigationController;
24 }

首先将中介者定义为单例模式,这里省略了单例的内存处理相关代码,之后实现了navigationController。

关键是跳转方法的实现:

1 - (void)requestViewChange:(id)sender withIdentifier:(NSString *)identifier {
2     if ([identifier isEqualToString: @"RootViewController_Btn1"]) {
3         RPOneViewController *oneViewController = [[RPOneViewController alloc] init];
4         [self.navigationController pushViewController:oneViewController animated:YES];
5     }

首先判断事件是从哪发出来的,然后进行跳转。这里只给出了一个按钮的跳转。

在按钮点击方法当中,只要调用中介者单例的对应方法即可:

1 - (void)onBtnClick:(UIButton *)sender {
2     [[RPControllerDirector sharedInstance] requestViewChange:sender withIdentifier:@"RootViewController_Btn1"];
3 }