声明:本系列文章内容摘自《iOS设计模式》
中介者模式
用一个对象来封装一系列对象的交互方式。中介者使个对象不需要显式地相互调用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
何时使用中介者模式
1.对象间的交互虽定义明确然而非常复杂,导致椅子对象彼此相互依赖而且难以理解;
2.因为对象引用了许多其他对象并与其通信,导致对象难以复用;
3.想要制定一个分布在多个对象中的逻辑或行为,又不想生成太多子类。
举个例子
有三个视图,我们可能需要两两之间进行跳转,类比于公司内同时每两个人都有可能进行业务上的交流。如果不借助通讯工具的话,公司内的每个人都需要相互认识。如果我们使用tabbarcontroller这一控件,三个是图相互切换就可以通过tabbar这一工具来实现,简化了两两跳转的复杂逻辑。类比于公司同事使用QQ群或者微信群进行业务交流。
简单的代码说明:
目录结构:
三个控制器中没有代码,仅在tabbarcontroller中将它们添加进去。
PatternRootViewController.h
#import <UIKit/UIKit.h>typedef enum
{kButtonTagFirst,kButtonTagSecond,kButtonTagThird
}ButtonTag;@interface PatternRootViewController : UITabBarController+(PatternRootViewController *)sharedInstance;
@end
PatternRootViewController.m
#import "PatternRootViewController.h"
#import "FirstViewController.h"
#import "SecondViewController.h"
#import "ThirdViewController.h"
@interface PatternRootViewController ()@end@implementation PatternRootViewController- (void)viewDidLoad {[super viewDidLoad];self.title = @"中介者模式";FirstViewController *firstVC = [[FirstViewController alloc] init];firstVC.tabBarItem.title = @"页面一";SecondViewController *secondVC = [[SecondViewController alloc] init];secondVC.tabBarItem.title = @"页面二";ThirdViewController *thirdVC = [[ThirdViewController alloc] init];thirdVC.tabBarItem.title = @"页面三";self.viewControllers = @[firstVC,secondVC,thirdVC];
}#pragma mark - 创建实例
+(PatternRootViewController *)sharedInstance
{static PatternRootViewController *sharedCoordinatingController = nil;static dispatch_once_t predicate;dispatch_once(&predicate,^{sharedCoordinatingController = [[self alloc] init];});return sharedCoordinatingController;
}@end
总结
虽然对于处理应用程序的行为分散与不同对象并且对象相互依存的情况,中介者模式非常有用,但是应该注意避免让中介者类过于庞大而难以维护。