设计模式-桥接模式

4 篇文章 0 订阅
2 篇文章 0 订阅

设计模式-桥接模式

模式介绍

桥接模式用于分离要做的功能和具体实现,从而让各个模块独立出来。接下来我们看一个例子,假如我们有一个机器人,这个机器人能够动手指,能够跑步,以及思考。假如我们不用桥接模式,普通的写法就是把动手指的实现写到和机器人写到同一个类里面,这样的话,以后我们要调整实现的话,每次都要修改机器人里面关于动手指的实现。假如我们还有动脚指头的实现,也在机器人类里面,这样每次修改这些模块的实现都要去机器人类里面,很明显,这样不便于后面的拓展。如果我们用接口定义出来要实现的功能,然后再写个类来实现呢?这样就实现了要做的功能和具体实现的分离,调用者只关心供应方提供的功能,然后调用就行了,并不需要关心具体的实现。供应方功能需要改变的话,直接修改实现就行了,接下来我们来看代码

类间关系

在这里插入图片描述

代码实现

零件的接口

public interface IPart {
    /**
     * 打印信息
     * */
    void printInfo();
}

手的接口

public interface IHand extends IPart{
    void wigglingFingers();
}

一个实现了手接口的实现类

public class XXHand implements IHand {
    private Logger logger=Logger.getLogger(XXHand.class.getSimpleName());
    @Override
    public void wigglingFingers() {
        logger.info("我开始扭动我的手指");
    }

    @Override
    public void printInfo() {
        logger.log(Level.INFO,"我是一个机械臂,我很灵活");
    }
}

脚的接口

public interface IFoot extends IPart{
    /**
     * 获得腿的最大跑步速度
     * @return
     */
    Double getMaxRunSpeed();

    /**
     * 开始跑步
     */
    void startRun();
}

一个实现了脚接口的实现类

public class XXFoot implements IFoot {
    private Logger logger=Logger.getLogger(XXFoot.class.getSimpleName());
    @Override
    public Double getMaxRunSpeed() {
        return 300D;
    }

    @Override
    public void startRun() {
        for(;;){
            try {
                Thread.sleep(200);
                logger.log(Level.INFO    ,"我开始走了,我就随便走走");
            } catch (Exception e) {
                logger.info(e.getMessage());
            }
        }
    }

    @Override
    public void printInfo() {
        logger.log(Level.INFO,"这是一个钛合金脚,踢开椰子只要一脚");
    }
}

头的接口

public interface IHead extends IPart{
    void doThinking();
}

一个实现了头接口的实现类

public class XXHead implements IHead {
    private Logger logger=Logger.getLogger(XXHead.class.getSimpleName());

    @Override
    public void printInfo() {
        logger.log(Level.INFO,"我是一个头,我有自我意识");
    }

    @Override
    public void doThinking() {
        logger.log(Level.INFO,"我在考虑怎么毁灭地球");
    }
}

机器人接口

public interface IRobot {
    void insertHands(IHand hand);
    void insertFoot(IFoot foot);
    void insertHead(IHead head);

    void startMove();
    void startThinking();
    void startHand();
}

一个实现了机器人接口的实现类

public class XXRobot implements IRobot {
    private Logger logger=Logger.getLogger(XXRobot.class.getSimpleName());
    private IHand hand;
    private IFoot foot;
    private IHead head;

    @Override
    public void insertHands(IHand hand) {
        this.hand=hand;
    }

    @Override
    public void insertFoot(IFoot foot) {
        this.foot=foot;
    }

    @Override
    public void insertHead(IHead head) {
        this.head=head;
    }

    @Override
    public void startMove() {
        if(foot!=null){
            Double maxRunSpeed = foot.getMaxRunSpeed();
            logger.log(Level.INFO,"最大速度:->"+maxRunSpeed);
            foot.startRun();
        }
    }

    @Override
    public void startThinking() {
        if(head!=null){
            head.doThinking();
        }
    }

    @Override
    public void startHand() {
        if(hand!=null){
            hand.wigglingFingers();
        }
    }
}

接下来看一下测试代码

public class Content {
    public static void main(String[] args) {
        XXRobot robot=new XXRobot();
        robot.insertFoot(new XXFoot());
        robot.insertHands(new XXHand());
        robot.insertHead(new XXHead());
        robot.startHand();
        robot.startThinking();
        robot.startMove();
    }
}

output:

七月 17, 2019 6:08:42 下午 bridgemode.XXHand wigglingFingers
信息: 我开始扭动我的手指
七月 17, 2019 6:08:42 下午 bridgemode.XXHead doThinking
信息: 我在考虑怎么毁灭地球
七月 17, 2019 6:08:42 下午 bridgemode.XXRobot startMove
信息: 最大速度:->300.0
七月 17, 2019 6:08:42 下午 bridgemode.XXFoot startRun
信息: 我开始走了,我就随便走走
七月 17, 2019 6:08:42 下午 bridgemode.XXFoot startRun
信息: 我开始走了,我就随便走走
一些总结

这里功能接口和实现分离开了,调用者直接通过接口来调用,接口供应方来进行实现

完整代码可以去我的GitHub

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值