IOS设计架构模式:桥接-工厂-享元模式

一、桥接模式

 1、定义:

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

2、原理:

抽象层与实现层相分离,抽象层定义了供客户段调用的抽象接口,实现层提供了具体的逻辑,实现类的应用被封装到抽象层的实例中。

3、UML图如下:

       模式使用场景:1,如果一个系统需要在构建的抽象化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系0.2,对于哪些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用0.3,一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

       比如,一个小米遥控器对应一个小米电视机,一个康佳遥控器对应一个康佳电视机,能不能想办法把各个品牌的遥控器统一抽象出来成一个万能的遥控器去对应所有品牌的电视机呢?下面我们具体来写一个demo。

4、demo

一般方式,我们都是一个品牌遥控器对应一个品牌电视的,比如,一个小米遥控器对应一个小米电视机,一个康佳遥控器对应一个康佳电视机,如下:

XiaoMiTV.h

#import <Foundation/Foundation.h>

@interface XiaoMiTV : NSObject
// 电视提供给外界的接口
- (void)loadCommand:(NSString *)command;
@end

XiaoMiTV.m

#import "XiaoMiTV.h"

@implementation XiaoMiTV
- (void)loadCommand:(NSString *)command {
    // 点击之后, 实现的业务逻辑
    NSLog(@"您按的是:----%@",command);
}
@end

XiaoMiRemote.h

#import <Foundation/Foundation.h>
#import "XiaoMiTV.h"

@interface XiaoMiRemote : NSObject
@property (nonatomic, strong) XiaoMiTV *TV;

// 方向控制
- (void)up;
- (void)down;
- (void)left;
- (void)right;
@end

XiaoMiRemote.m

#import "XiaoMiRemote.h"

@implementation XiaoMiRemote
- (void)up {
    [self.TV loadCommand:@"up"];
}
- (void)down {
    [self.TV loadCommand:@"down"];

}
- (void)left {
    [self.TV loadCommand:@"left"];

}
- (void)right {
    [self.TV loadCommand:@"right"];

}
@end

KJTV.h

#import <Foundation/Foundation.h>

@interface KJTV : NSObject
// 电视提供给外界的接口
- (void)loadCommandKJ:(NSString *)command;
@end

KJTV.m

#import "KJTV.h"

@implementation KJTV
- (void)loadCommandKJ:(NSString *)command {
    // 点击之后, 实现的业务逻辑
    NSLog(@"您按的是KJ:----%@",command);
}
@end

KJRemote.h

#import <Foundation/Foundation.h>
#import "KJTV.h"

@interface KJRemote : NSObject
@property (nonatomic, strong) KJTV *TV;

// 方向控制
- (void)up;
- (void)down;
- (void)left;
- (void)right;

- (void)action1;
- (void)action2;

@end

KJRemote.m

#import "KJRemote.h"

@implementation KJRemote
- (void)up {
    [self.TV loadCommandKJ:@"up"];
}
- (void)down {
    [self.TV loadCommandKJ:@"down"];
    
}
- (void)left {
    [self.TV loadCommandKJ:@"left"];
    
}
- (void)right {
    [self.TV loadCommandKJ:@"right"];
    
}

- (void)action1 {
    [self.TV loadCommandKJ:@"action1"];

}
- (void)action2 {
    [self.TV loadCommandKJ:@"action2"];

};
@end

客户端:

ViewController.m

    XiaoMiTV *TV = [[XiaoMiTV alloc] init];
    XiaoMiRemote *remote = [[XiaoMiRemote alloc] init];
    remote.TV = TV;
    [remote up];
    
    KJTV *TV2 = [[KJTV alloc] init];
    KJRemote *remote2 = [[KJRemote alloc] init];
    remote2.TV = TV2;
    [remote2 action1];
    [remote2 up];

将抽象层和实现层进行分离,设计成桥接模式

TV.h

#import <Foundation/Foundation.h>

@interface TV : NSObject
// 电视机提供给外界调用的一个方法
- (void)loadCommand:(NSString *)command;

@end

TV.m

#import "TV.h"

@implementation TV
- (void)loadCommand:(NSString *)command {}
@end

TVXiaoMI.h

#import "TV.h"

@interface TVXiaoMI : TV

@end

TVXiaoMI.m

#import "TVXiaoMI.h"

@implementation TVXiaoMI
- (void)loadCommand:(NSString *)command {
    
    if ([command isEqualToString:@"up"]) {
        NSLog(@"您按的是XM:----%@",command);
    }
    else if ([command isEqualToString:@"down"]){
        NSLog(@"您按的是XM:----%@",command);
    }
    else if ([command isEqualToString:@"left"]){
        NSLog(@"您按的是XM:----%@",command);
    }
    else if ([command isEqualToString:@"right"]){
        NSLog(@"您按的是XM:----%@",command);
    }
    else {
        NSLog(@"超出范围");
    }
}

@end

TVKJ.h

#import "TV.h"

@interface TVKJ : TV

@end

TVKJ.m

#import "TVKJ.h"

@im
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值