target-action方案
通过给组件包装一层wrapper来给外界提供服务,然后调用者通过依赖中间件来使用服务;其中,中间件是通过runtime来调用组件的服务,是真正意义上的解耦,也是该方案最核心的地方。具体实施过程是给组件封装一层target对象来对外提供服务,不会对原来组件造成入侵;然后,通过实现中间件的category来提供服务给调用者,这样使用者只需要依赖中间件,而组件则不需要依赖中间件。
优点:
- 可读性,维护性,可扩展性高
- 内存中不需要维护映射表
- 不需要注册, 不影响启动速度
- 调用效率高
缺点:
- 不能跨平台使用
- 也是需要维护一个 target 类
- 还是字符串来获取类名,也是存在一定风险的。
MGJRouter
这是蘑菇街中应用的一种页面间调用的方式,通过在启动时注册组件提供的服务,把调用组件使用的url
和组件提供的服务block
对应起来,保存到内存中。在使用组件的服务时,通过url
找到对应的block
,然后获取服务。
优点:
1. 统一ios和安卓平台,使用一套后台来管理url
2. 方便H5跳转APP
缺点:
1. 内存中需要维护url表,组件多了可能会有内存问题
2. 启动的时候需要注册,可能会影响启动速度
3. url传参数被限制,没有办法传 UIImage,NSData等类型
4. 组件本身依赖中间件,分散注册,使用的耦合较多
5. 查找URL不够高效
6. 路由写错后,编译没有问题,而运行可能会出现问题。
protocol-class
蘑菇街又提出了另一种组件化的方案,就是通过protocol定义服务接口,组件通过实现该接口来提供接口定义的服务,具体实现就是把protocol和class做一个映射,同时在内存中保存一张映射表,使用的时候,就通过protocol找到对应的class来获取需要的服务。
优点:
- 解决无法传递非常规参数问题
- 协议方法改变之后,调用的地方也会报错。
- 协议没有实现的话,会有警告
缺点:
- 内存中需要维护映射表
- 协议方法虽然包警告,但是调用者并不知道有没有实现