• iOS设计模式之桥接模式


    一,什么是桥接模式

    • 定义

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

    • 使用场景
      游戏机模拟器、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

      桥接模式

  • 相关阅读:
    18-行列式及其性质
    17-正交矩阵和Gram-Schmidt正交化
    14-正交向量与子空间
    centOS7.3 离线安装docker
    10-四个基本子空间
    使用vim打造python-ide
    09-线性相关性、基、维数
    python小实例
    Elasticsearch学习之ES节点类型以及各种节点的分工
    基于Kibana和ES的苏宁实时日志分析平台
  • 原文地址:https://www.cnblogs.com/lxlx1798/p/11484069.html
Copyright © 2020-2023  润新知