Cowboy Tech

iOS设计模式-桥接

遥控器和电视机

  1. 每个遥控器对应一个电视机,遥控器是控制类,电视机是执行类
  2. 通用的功能抽象出来成为一个模块,增加复用性, 例如每个遥控器都会有音量键,频道键

桥接模式

  1. 把抽象层次结构从具体的实现中分离出来,使其能够独立变更。
  2. 抽象层次定义了供客户端使用的上层抽象接口。实现层结构定义了供抽象层使用的底层接口。
  3. 实现类的引用被封装到抽象层的实例中,桥接就形成了。

抽象类

AbstractSystem

//拥有执行者的引用,让执行者去执行

@property (nonatomic, strong) AbstractImplementor  *implementor;

- (void)command_up {
[self.implementor loadCommand:kUp];
}

- (void)command_down {
[self.implementor loadCommand:kDown];
}

- (void)loadSystem {    
}

AbstractImplementor

//执行类要包含所有情形,例如KO, KX只是某个子类才有的特性,但也要包含在这里

typedef enum : NSUInteger {

kUp,
kDown,
kLeft,
kRight,
kA,
kB,

KO,
KX,

} EcommandType;

- (void)loadCommand:(EcommandType)command {

}

实现层1

GBASystem

@interface GBASystem : AbstractSystem

- (void)loadSystem {   
NSLog(@"GBASystem");
}

GBAImplementor

@interface GBAImplementor : AbstractImplementor

- (void)loadCommand:(EcommandType)command {

switch (command) {

    case kUp:

        NSLog(@"GBA up");
        break;

    case kDown:

        NSLog(@"GBA down");
        break;

        ......
}

实现层2

PSPSystem

@interface PSPSystem : AbstractSystem

- (void)loadSystem {   
NSLog(@"PSPSystem");
}

- (void)command_X {
[self.implementor loadCommand:KX];
}

- (void)command_O {
[self.implementor loadCommand:KO];
}

PSPImplementor

@interface PSPImplementor : AbstractImplementor

- (void)loadCommand:(EcommandType)command {

switch (command) {
  ....
      case KO:

        NSLog(@"PSP O");
        break;

    case KX:

        NSLog(@"PSP X");
        break;
}

使用

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

// GBA系统 + GBA执行器
AbstractSystem *gbaSystem = [[GBASystem alloc] init];
gbaSystem.implementor     = [[GBAImplementor alloc] init];

[gbaSystem loadSystem];
[gbaSystem command_up];

// PSP系统 + PSP执行器
PSPSystem *pspSystem  = [[PSPSystem alloc] init];
pspSystem.implementor = [[PSPImplementor alloc] init];

[pspSystem loadSystem];
[pspSystem command_X];
}