iOS設計模式--橋接
學習設計模式推薦看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
//// ConsoleEmulator.h// BridgeTest//// Created by qitmac000246 on 15/7/14.// Copyright (c) 2015年 杜甲. All rights reserved.//#import typedef enum{ kConsoleUp,}ConsoleType;// 執行類的抽象父類@interface ConsoleEmulator : NSObject// 抽象的公用方法- (void) loadInstructionsForCommand;@end
ConsoleEmulator.m
#import ConsoleEmulator.h@implementation ConsoleEmulator- (void) loadInstructionsForCommand{ }@end
GameBoyEmulator.h
#import ConsoleEmulator.h@interface GameBoyEmulator : ConsoleEmulator@end
GameBoyEmulator.m
#import GameBoyEmulator.h@implementation GameBoyEmulator// 子執行類- (void) loadInstructionsForCommand{ NSLog(@%s,__func__);}@end
ConsoleController.h
#import #import ConsoleEmulator.h@interface ConsoleController : NSObject// 控制器的父類中定義 執行類的抽象父類@property (nonatomic , strong) ConsoleEmulator *emulator;// 抽象的公用調用方法- (void) setCommand:(ConsoleType)command;@end
ConsoleController.m
#import ConsoleController.h@implementation ConsoleController- (void) setCommand:(ConsoleType)command{ [_emulator loadInstructionsForCommand];}@end
TouchConsoleController.h
#import ConsoleController.h// 控制器子類@interface TouchConsoleController : ConsoleController- (void) up;@end
TouchConsoleController.m
#import TouchConsoleController.h@implementation TouchConsoleController- (void) up{ [super setCommand:kConsoleUp];}@end