桥接模式

2018-01-02  本文已影响4人  QG不吃鱼的猫

桥接模式简介

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

原理:抽象层和实现层分离,抽象层提供了客户端调用的抽象接口,实现层提供了具体的逻辑。实现类的引用被封装到抽象层的实例中,桥接就形成了。

UML图-demo


意图

1、把电视机进行抽象;

2、对电视机抽出不同子类化,去进行各种操作指令的处理;

3、抽象出遥控器类,桥接电视机抽象类,电视机对象进行指令的处理setCommand();

4、对遥控器进行子类化,定义具体的指令方法,子类里的方法去调用父类的setCommand();

我勒个去,逻辑是不是抽离的很干净?万能遥控器,小手指点一点,可以同时去控制小米和康佳,而且不用考虑小米和康佳内部是怎么操作滴。

上代码:

抽象类TV

@interface TV : NSObject

// 电视机提供给外界调用的一个方法

- (void)loadCommand:(NSString *)command;

@end

#import "TV.h"

@implementation TV

- (void)loadCommand:(NSString *)command {}

@end

XIAO米 康佳子类

#import "TV.h"

@interface TVXiaoMI : TV

@end

#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

#import "TV.h"

@interface TVKJ : TV

@end

#import "TVKJ.h"

@implementation TVKJ

- (void)loadCommand:(NSString *)command {

        if ([command isEqualToString:@"up"]) {

                NSLog(@"您按的是KJ:----%@",command);

        } else if ([command isEqualToString:@"down"]){

                NSLog(@"您按的是KJ:----%@",command);

        } else if ([command isEqualToString:@"left"]){

                NSLog(@"您按的是KJ:----%@",command);

        } else if ([command isEqualToString:@"right"]){

                NSLog(@"您按的是KJ:----%@",command);

    } else {

                NSLog(@"超出范围");

        }

}

@end

抽象遥控器

#import "TV.h"

@interface Remote : NSObject

@property (nonatomic, strong) TV *tv;

- (void)setCommand:(NSString *)commmand;

@end

#import "Remote.h"

@implementation Remote

- (void)setCommand:(NSString *)commmand {

        [self.tv loadCommand:commmand];

}

@end

子类化遥控器

#import "Remote.h"

@interface SubRemote : Remote

// 方向控制

- (void)up;

- (void)down;

- (void)left;

- (void)right;

@end

#import "SubRemote.h"

@implementation SubRemote

// 方向控制

- (void)up {

        [super setCommand:@"up"];

}

- (void)down {

        [super setCommand:@"down"];

}

- (void)left {

        [super setCommand:@"left"];

}

- (void)right {

        [super setCommand:@"right"];

}

@end

调用

// 遥控器调用康佳电视

    SubRemote *subremote = [[SubRemote alloc] init];

    subremote.tv = [[TVKJ alloc] init];

    [subremote up];

    // 遥控器来调用小米

    subremote.tv = [[TVXiaoMI alloc] init];

    [subremote up];

    [subremote down];

打印结果:

2018-01-02 17:46:06.453398+0800 BridgeDemo[5094:457451] 您按的是KJ:----up

2018-01-02 17:46:06.453598+0800 BridgeDemo[5094:457451] 您按的是XM:----up

2018-01-02 17:46:06.453748+0800 BridgeDemo[5094:457451] 您按的是XM:----down

上一篇下一篇

猜你喜欢

热点阅读