iOS设计模式之桥接模式

匿名 (未验证) 提交于 2019-12-02 23:59:01

一,什么是桥接模式

  • 定义

    抽象出层次结构。
    上层抽象接口的职能,实现上层抽象接口的职能,层级间的通信协议(可以抽象为接口)。
    桥接模式的目的,就是把抽象层次结构从具体的实现中分离出来,使其能够独立变更。抽象层次定义了供客户端使用的上层抽象接口。实现结构定义了供抽象层使用的底层接口。实现类的引用被封装到控制类抽象层的实例中,桥接就形成了。

  • 使用场景
    游戏机模拟器、H5混编解决方案

二,桥接模式结构图

  实现步骤

  1. 创建控制类基类,并定义变量持有具体实现类基类对象关系。
  2. 创建控制类基类子类,和实现类基类,并在控制器类接口方法中使用基类实现类对象实现功能(基类已经让控制器建立了持有实现类对象的关系)。
  3. 在控制器内调用控制器子类,建立控制器持有实现类对象。

  结构图
  

三,代码实现

  • 基类
    • 控制器基类
      • ConsoleController
        • ConsoleController.h
          #import <Foundation/Foundation.h> #import "ConsoleEmulator.h"  @interface ConsoleController : NSObject  /**  *  抽象模拟器  */ @property (nonatomic, strong) ConsoleEmulator  *emulator;  /**  *  执行指令  *  *  @param command 指令  */ - (void)excuteCommand:(ConsoleCommand)command;  @end
        • ConsoleController.m 
          #import "ConsoleController.h"  @implementation ConsoleController  - (void)excuteCommand:(ConsoleCommand)command {     [_emulator loadInstructionsForCommand:command];     [_emulator excuteInstructions]; }  @end
    • 实现基类
      • ConsoleEmulator
        • ConsoleEmulator.h
          #import <Foundation/Foundation.h>  typedef enum : NSUInteger {          kConsoleCommandUp,     kConsoleCommandDown,     kConsoleCommandLeft,     kConsoleCommandRight,          kConsoleCommandSelect,     kConsoleCommandStart,          kConsoleCommandAction1,     kConsoleCommandAction2,      } ConsoleCommand;  @interface ConsoleEmulator : NSObject  /**  *  加载指令  *  *  @param command 指令  */ - (void)loadInstructionsForCommand:(ConsoleCommand)command;  /**  *  执行指令  */ - (void)excuteInstructions;  @end
        • ConsoleEmulator.m 
          #import "ConsoleEmulator.h"  @implementation ConsoleEmulator  - (void)loadInstructionsForCommand:(ConsoleCommand)command {     // 由子类重载实现 } - (void)excuteInstructions {     // 由子类重载实现 } @end
               
  • 子类
    • 控制器基类
      • GameBoyConsoleController
        • GameBoyConsoleController.h
          #import "ConsoleController.h"  @interface GameBoyConsoleController : ConsoleController  - (void)up; - (void)down; - (void)left; - (void)right;  - (void)select; - (void)start;  - (void)action1; - (void)action2;  @end
        • GameBoyConsoleController.m
          #import "GameBoyConsoleController.h" @implementation GameBoyConsoleController - (void)up {     [super excuteCommand:kConsoleCommandUp]; }  - (void)down {     [super excuteCommand:kConsoleCommandDown]; } - (void)left {     [super excuteCommand:kConsoleCommandLeft]; } - (void)right {     [super excuteCommand:kConsoleCommandRight]; } - (void)select {     [super excuteCommand:kConsoleCommandSelect]; } - (void)start {     [super excuteCommand:kConsoleCommandStart]; } - (void)action1 {     [super excuteCommand:kConsoleCommandAction1]; } - (void)action2 {     [super excuteCommand:kConsoleCommandAction2]; } @end
    • 实现子类
      • GameBoyEmulator
        • GameBoyEmulator.h
          #import "ConsoleEmulator.h" @interface GameBoyEmulator : ConsoleEmulator - (void)loadInstructionsForCommand:(ConsoleCommand)command; - (void)excuteInstructions; @end
        • GameBoyEmulator.m
          #import "GameBoyEmulator.h" @implementation GameBoyEmulator - (void)loadInstructionsForCommand:(ConsoleCommand)command {     NSLog(@"GameBoyEmulator loadInstructionsForCommand"); } - (void)excuteInstructions {     NSLog(@"GameBoyEmulator excute"); } @end
  • 打印结果:
    2019-09-08 00:27:13.226801+0800 BridgePattern[26512:6943326] GameBoyEmulator loadInstructionsForCommand 2019-09-08 00:27:13.226970+0800 BridgePattern[26512:6943326] GameBoyEmulator excute 2019-09-08 00:27:13.227075+0800 BridgePattern[26512:6943326] GameGearEmulator loadInstructionsForCommand 2019-09-08 00:27:13.227162+0800 BridgePattern[26512:6943326] GameGearEmulator excute

四,优缺点

  • 优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。
  • 缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

五,demo

  桥接模式

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!