學習設計模式推薦看OBJECTIVE - C設計模式。
何時使用橋接模式
1、不想在抽象與其實現之間形成固定的綁定關系(這樣就在運行時切換實現)
2、抽象及其實現都應可以通過子類化獨立進行擴展;
3、對抽象的實現進行修改不應影響客戶端代碼
4、如果每個實現需要額外的子類以細化抽象,則說明有必要把它們分成兩個部分
5、想在帶有不同抽象接口的多個對象之間共享一個實現
下面用代碼說說這個設計模式
先展示下調用的代碼
// // ViewController.m // BridgeTest // // Created by qitmac000246 on 15/7/13. // Copyright (c) 2015年 杜甲. All rights reserved. // #import ViewController.h #import TouchConsoleController.h #import GameBoyEmulator.h @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 子功能實現 GameBoyEmulator *gbe = [[GameBoyEmulator alloc] init]; // 功能模塊調用 TouchConsoleController *tcc = [[TouchConsoleController alloc] init]; [tcc setEmulator:gbe];// 指定功能對象 [tcc setCommand:kConsoleUp];// 實現 } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
// // ConsoleEmulator.h // BridgeTest // // Created by qitmac000246 on 15/7/14. // Copyright (c) 2015年 杜甲. All rights reserved. // #importtypedef enum { kConsoleUp, }ConsoleType; // 執行類的抽象父類 @interface ConsoleEmulator : NSObject // 抽象的公用方法 - (void) loadInstructionsForCommand; @end
#import ConsoleEmulator.h @implementation ConsoleEmulator - (void) loadInstructionsForCommand { } @endGameBoyEmulator.h
#import ConsoleEmulator.h @interface GameBoyEmulator : ConsoleEmulator @end
#import GameBoyEmulator.h @implementation GameBoyEmulator // 子執行類 - (void) loadInstructionsForCommand { NSLog(@%s,__func__); } @end
#import#import ConsoleEmulator.h @interface ConsoleController : NSObject // 控制器的父類中定義 執行類的抽象父類 @property (nonatomic , strong) ConsoleEmulator *emulator; // 抽象的公用調用方法 - (void) setCommand:(ConsoleType)command; @end
#import ConsoleController.h @implementation ConsoleController - (void) setCommand:(ConsoleType)command { [_emulator loadInstructionsForCommand]; } @end
#import ConsoleController.h // 控制器子類 @interface TouchConsoleController : ConsoleController - (void) up; @end
#import TouchConsoleController.h @implementation TouchConsoleController - (void) up { [super setCommand:kConsoleUp]; } @end