桥接模式

使用桥接模式不只改变你的实现,也改变你的抽象。

示例—遥控器

有很多遥控器,可以控制不同的电视。实现遥控器与电视之间的关系和配合过程。遥控器的设置频道方法最终由不同的电视实现类去实现。

UML图表示

桥接模式-遥控器

代码演示

电视接口

package Bridge;

public interface TV {
    void on();
    void off();
    void tuneChannel(int channel);
}

RCA电视类

package Bridge;

public class RCA implements TV {
    @Override
    public void on() {
        System.out.println("RCA TV open");
    }

    @Override
    public void off() {
        System.out.println("RCA TV close");
    }

    @Override
    public void tuneChannel(int channel) {
        System.out.println("RCA TV is tuned to No." + channel + " Channel");
    }
}

SONY电视类

package Bridge;

public class Sony implements TV {
    @Override
    public void on() {
        System.out.println("Sony TV open");
    }

    @Override
    public void off() {
        System.out.println("Sony TV close");
    }

    @Override
    public void tuneChannel(int channel) {
        System.out.println("Sony TV is tuned to No." + channel + " Channel");
    }
}

遥控器抽象类

package Bridge;

public abstract class RemoteControl {

    TV implementor;

    RemoteControl(TV implementor){
        this.implementor = implementor;
    }

    void on(){
        this.implementor.on();
    }

    void off(){
        this.implementor.off();
    }

    void setChannel(int channel){
        implementor.tuneChannel(channel);
    }

}

RCA遥控器类

package Bridge;

public class RCAControl extends RemoteControl {

    int currentStation = 0;

    RCAControl(TV implementor) {
        super(implementor);
    }

    void setStation(){

    }

    void nextChannel() {
        setChannel(++currentStation);
    }

    void previousChannel() {
        setChannel(currentStation - 1 < 0 ? 0 : --currentStation);
    }


}

SONY遥控器类

package Bridge;

public class SonyControl extends RemoteControl {

    int currentStation = 0;

    SonyControl(TV implementor) {
        super(implementor);
    }

    void setStation(){

    }

    void nextChannel() {
        setChannel(currentStation + 1);
    }

    void previousChannel() {
        setChannel(currentStation - 1 < 0 ? 0 : currentStation - 1);
    }
}

测试代码

package Bridge;

public class ControlTVDriver {
    public static void main(String[] args) {

        RCAControl rcaControl = new RCAControl(new RCA());
        SonyControl sonyControl = new SonyControl(new Sony());

        rcaControl.on();
        rcaControl.nextChannel();
        rcaControl.nextChannel();
        rcaControl.previousChannel();
        rcaControl.off();

        sonyControl.on();
        sonyControl.nextChannel();
        sonyControl.previousChannel();
        sonyControl.previousChannel();
        sonyControl.off();

    }
}

测试结果

RCA TV open
RCA TV is tuned to No.1 Channel
RCA TV is tuned to No.2 Channel
RCA TV is tuned to No.1 Channel
RCA TV close
Sony TV open
Sony TV is tuned to No.1 Channel
Sony TV is tuned to No.0 Channel
Sony TV is tuned to No.0 Channel
Sony TV close
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1 场景问题# 1.1 发送提示消息## 考虑这样一个实际的业务功能:发送提示消息。基本上所有带业务流程处理的系统...
    七寸知架构阅读 10,536评论 5 63
  • 在正式介绍桥接模式之前,我先跟大家谈谈两种常见文具的区别,它们是毛笔和蜡笔。假如我们需要大中小3种型号的画笔,能够...
    justCode_阅读 5,758评论 0 7
  • 引言 在项目开发中,我们会遇到这样的一种场景:某些类型由于自身的逻辑,往往具有两个或多个维度的变化,比如说大话设计...
    泥孩儿0107阅读 2,972评论 0 0
  • 1.桥接模式概念 在《Head First Design Patterns》文中是这么介绍桥接模式的,“不仅可以改...
    lgy_gg阅读 1,639评论 0 1
  • 前几天,好友小雪向我推荐了十点读书上面的一篇文章《很感谢你能来,不遗憾你离开》(没看过的建议去看一看)。它主要讲了...
    冷冷123456阅读 4,206评论 0 1

友情链接更多精彩内容