美文网首页
桥接模式

桥接模式

作者: QG不吃鱼的猫 | 来源:发表于2018-01-02 17:46 被阅读4次

    桥接模式简介

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

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

    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

    相关文章

      网友评论

          本文标题:桥接模式

          本文链接:https://www.haomeiwen.com/subject/ayafnxtx.html