定义

桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。

原理

抽象层与实现层相分离,抽象层定义了供客户端调用的抽象接口,实现层提供了具体的逻辑,实现类的引用被封装到抽象层的实例中,桥接就形成.
image.png

代码分析

  • Remote抽象类
  1. #import <Foundation/Foundation.h>
  2. #import "TV.h"
  3. @interface Remote : NSObject
  4. @property (nonatomic,strong)TV *tv;
  5. -(void)setCommand:(NSString *)command;
  6. @end
  7. #import "Remote.h"
  8. @implementation Remote
  9. - (void)setCommand:(NSString *)command
  10. {
  11. //桥接的形成
  12. [self.tv loadCommand:command];
  13. }
  14. @end
  • SubRemote类,继承Remote类
  1. #import "Remote.h"
  2. @interface SubRemote : Remote
  3. - (void)up;
  4. - (void)down;
  5. - (void)left;
  6. - (void)right;
  7. @end
  8. #import "SubRemote.h"
  9. @implementation SubRemote
  10. - (void)up
  11. {
  12. [super setCommand:@"up"];
  13. }
  14. - (void)down
  15. {
  16. [super setCommand:@"down"];
  17. }
  18. - (void)left
  19. {
  20. [super setCommand:@"left"];
  21. }
  22. - (void)right
  23. {
  24. [super setCommand:@"right"];
  25. }
  26. @end
  • TV类,抽象类
  1. #import <Foundation/Foundation.h>
  2. @interface TV : NSObject
  3. - (void)loadCommand:(NSString *)command;
  4. @end
  5. #import "TV.h"
  6. @implementation TV
  7. //抽象方法
  8. - (void)loadCommand:(NSString *)command
  9. {
  10. //无需实现
  11. }
  12. @end
  • XiaoMiTV类,继承TV
  1. #import "TV.h"
  2. @interface XiaoMiTV : TV
  3. @end
  4. #import "XiaoMiTV.h"
  5. @implementation XiaoMiTV
  6. - (void)loadCommand:(NSString *)command
  7. {
  8. if ([command isEqualToString:@"up"]) {
  9. NSLog(@"你按的是xiaoMi====:%@",command);
  10. }
  11. else if ([command isEqualToString:@"down"]) {
  12. NSLog(@"您按的是XM:----%@",command);
  13. }
  14. else if ([command isEqualToString:@"left"]) {
  15. NSLog(@"您按的是XM:----%@",command);
  16. }
  17. else if ([command isEqualToString:@"right"]) {
  18. NSLog(@"您按的是XM:----%@",command);
  19. }
  20. else {
  21. NSLog(@"超出范围");
  22. }
  23. }
  24. @end
  • HaiXinTV类,继承TV
  1. #import "TV.h"
  2. @interface HaiXinTV : TV
  3. @end
  4. #import "HaiXinTV.h"
  5. @implementation HaiXinTV
  6. - (void)loadCommand:(NSString *)command
  7. {
  8. if ([command isEqualToString:@"up"]) {
  9. NSLog(@"你按的是HaiXin====:%@",command);
  10. }
  11. else if ([command isEqualToString:@"down"]) {
  12. NSLog(@"您按的是HaiXin:----%@",command);
  13. }
  14. else if ([command isEqualToString:@"left"]) {
  15. NSLog(@"您按的是HaiXin:----%@",command);
  16. }
  17. else if ([command isEqualToString:@"right"]) {
  18. NSLog(@"您按的是HaiXin:----%@",command);
  19. }
  20. else {
  21. NSLog(@"超出范围");
  22. }
  23. }
  24. @end
  • VC类
  1. #import <UIKit/UIKit.h>
  2. @interface ViewController : UIViewController
  3. @end
  4. #import "ViewController.h"
  5. #import "SubRemote.h"
  6. #import "XiaoMiTV.h"
  7. #import "HaiXinTV.h"
  8. @interface ViewController ()
  9. @end
  10. @implementation ViewController
  11. - (void)viewDidLoad {
  12. [super viewDidLoad];
  13. SubRemote *subRemote = [[SubRemote alloc] init];
  14. XiaoMiTV *xmTV = [[XiaoMiTV alloc] init];
  15. subRemote.tv = xmTV;
  16. [subRemote up];
  17. [subRemote down];
  18. HaiXinTV *hxTV = [[HaiXinTV alloc] init];
  19. subRemote.tv = hxTV;
  20. [subRemote up];
  21. [subRemote down];
  22. }
  23. @end

测试结果

image.png

优点

  • 分离抽象接口及其实现部分。
  • 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。
  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
  • 实现细节对客户透明,可以对用户隐藏实现细节。

    缺点

  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。