iOS与桥接模式

首先,什么是桥接模式呢?
想到公司有个面试题是有关花和蜜蜂的,花开蜜蜂来采蜜,花谢蜜蜂回巢。把这个场景改造下,来说明今天的主题:

花园里有牵牛花,花开的时候蜜蜂来采蜜
那么我们可能就会这样来设计:

@interface QianniuHua : NSObject
@property (nonatomic, strong) Bee *bee;
  - (void)bloom;
@end

突然有一天,花园里多了牡丹花,牡丹花开的时候蝴蝶会来采蜜
这个简单,我们再增加一个牡丹花类就好了:

 @interface MudanHua : NSObject
 @property (nonatomic, strong) Butterfly *butterfly;
   - (void)bloom;
 @end

那么接下来呢?花园里的花会越来越多,昆虫也会越来越多。更重要的是,牵牛花蜜并不一定是由蜜蜂来采,蝴蝶也不一定单单只喜欢牡丹花。所以要实现的是牵牛花与蜜蜂的解耦,蝴蝶与牡丹花的解耦。牡丹花可以由蜜蜂蝴蝶飞蛾蜂鸟来采蜜,蜜蜂也可以去采集牡丹花牵牛花槐花蜜。花有不同的类型,昆虫有不同的种类,那么如何设计才能适应两方面的变化呢?

这就是今天想要介绍的桥接模式:
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。

将抽象部分与实现部分分离,使它们都可以独立的变化。
——《设计模式》GOF

具体的结构如下:


桥接模式

图中可以看到

  • Abstraction是一个虚基类,Operation()调用Implemetor的OperationImp()方法
  • Implemetor父类有两个子类A和B。
  • 两个基类间的关系是聚合关系,Abstrction是整体,Implementor是部分,说白了就是Implementor是Abstraction的成员变量。

好了,下面用桥接模式来实现下面这个比较简单的场景:
花园里有一朵牵牛花和一朵牡丹花,牵牛花开会吸引蜜蜂来采蜜,牡丹花开会吸引蝴蝶来采蜜

@interface AbstractInsect : NSObject
- (void)bloomImp;
@end

@interface AbstractFlower : NSObject
@property (nonatomic, strong) AbstractInsect *insect;
- (void)bloom;
@end

@interface QianniuHua : AbstractFlower
@end

@implementation QianniuHua
- (void)boom {
    NSLog(@"牵牛花开了");
    [self.insect bloomImp];
}
@end

@interface MudanHua : AbstractFlower
@end

@implementation MudanHua
- (void)bloom {
    NSLog(@"牡丹花开了");
    [self.insect bloomImp];
}
@end

@interface Butterfly : AbstractInsect
@end

@implementation Butterfly
- (void)bloomImp {
    NSLog(@"蝴蝶来了");
}
@end

@interface Bee : AbstractInsect
@end

@implementation Bee
- (void)bloomImp {
    NSLog(@"蜜蜂来了");
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        QianniuHua *qianniu = [[QianniuHua alloc] init];
        qianniu.insect = [[Bee alloc] init];
        [qianniu bloom];
        
        MudanHua *mudan = [[MudanHua alloc] init];
        mudan.insect = [[Butterfly alloc] init];
        [mudan bloom];
        
    }
    return 0;
}

运行结果:

2016-12-08 23:45:46.281 DesignPattern[10832:226597] 牵牛花开了
2016-12-08 23:45:46.282 DesignPattern[10832:226597] 蜜蜂来了
2016-12-08 23:45:46.282 DesignPattern[10832:226597] 牡丹花开了
2016-12-08 23:45:46.282 DesignPattern[10832:226597] 蝴蝶来了

以上就是一个比较简单的桥接模式,如果有什么理解不当的地方,欢迎批评指正!
本文系作者原创,转载请注明出处

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一直以来人类的烧杀掠夺使得地球面目全非,动物们绝地逃亡,许多动物濒临灭绝。他们破坏了自然平衡,又试着去弥补、去拯救...
    齐一文阅读 910评论 0 7
  • 想象中的云南之旅,是和闺蜜们一起走走停停,拍拍看看的那种有多点儿文艺小清新的旅行 现实是我的云南之旅,是和三个大妈...
    冬素阅读 548评论 0 0
  • 咱们接着昨天的话茬继续聊。 昨天老妖说了自己心目中的帝王文艺排行榜中的五位,分别是: 第十名:陈后主陈叔宝 第九名...
    尚有乾坤阅读 657评论 0 47