1.定义
使抽象和实现解耦,使之都可以独立扩展不会影响对方
2.使用场景及设计
2.1.场景
现在有十种不同类型的电视,每种电视都有自己的遥控器,电视变化,对应的遥控器也要变化,而且如果新增一种电视型号,就要新增一种对应的遥控器
2.2.设计
使用桥接模式制作一个抽象tv接口,在抽象出一个RemoteControl遥控器类,使用RemoteControl类关联(桥接)tv接口,将实现予以解耦,而且抽象和实现可以独立扩展互不影响,如想给RemoteControl加个game功能,则不会对现有实现影响
2.3.类图
3.测试代码
入口代码
package com.glt.designpattern.bridge;
public class InitMain {
public static void main(String[] args) {
TV mi = new MiTV();
TV sony = new SonyTV();
ConcreteRemote miControl = new ConcreteRemote(mi);
ConcreteRemote sonyControl = new ConcreteRemote(sony);
miControl.on();
miControl.setStation(5);
miControl.nextChannel();
sonyControl.on();
sonyControl.setStation(10);
sonyControl.nextChannel();
}
}
package com.glt.designpattern.bridge;
/**
* 电视接口
*/
public interface TV {
/**
* 开
*/
public void on();
/**
* 关
*/
public void off();
/**
* 切换频道
*/
public void tuneChannel(int channel);
}
package com.glt.designpattern.bridge;
/**
* 抽象遥控器类
*/
public abstract class RemoteControl {
TV tv;
public RemoteControl(TV tv) {
this.tv = tv;
}
public void on() {
tv.on();
}
public void off() {
tv.off();
}
public void setChannel(int channel) {
tv.tuneChannel(channel);
}
}
package com.glt.designpattern.bridge;
/**
* 具体遥控器类
*/
public class ConcreteRemote extends RemoteControl {
public int currentStation = 0;
public ConcreteRemote(TV tv) {
super(tv);
}
public void on() {
super.on();
}
public void off() {
super.on();
}
public void setStation(int currentStation) {
this.currentStation = currentStation;
setChannel(this.currentStation);
}
public void nextChannel() {
setChannel(this.currentStation + 1);
}
public void prevChannel() {
setChannel(this.currentStation - 1);
}
}
package com.glt.designpattern.bridge;
/**
* 小米-具体电视类
*/
public class MiTV implements TV {
@Override
public void on() {
System.out.println("open xiaomi tv ...");
}
@Override
public void off() {
System.out.println("close xiaomi tv ...");
}
@Override
public void tuneChannel(int channel) {
System.out.println(String.format("change xiaomi tv channel is %s", channel));
}
}
package com.glt.designpattern.bridge;
/**
* 索尼-具体电视类
*/
public class SonyTV implements TV {
@Override
public void on() {
System.out.println("open sony tv ...");
}
@Override
public void off() {
System.out.println("close sony tv ...");
}
@Override
public void tuneChannel(int channel) {
System.out.println(String.format("change sony tv channel is %s", channel));
}
}
输出如下
open xiaomi tv …
change xiaomi tv channel is 5
change xiaomi tv channel is 6
open sony tv …
change sony tv channel is 10
change sony tv channel is 11
4.总结
桥接模式其实也是为了抽象和实现解耦,通过桥接类保证tv和遥控器两个维度互不影响单独改变。
- 优点
1、抽象和实现的分离。
2、优秀的扩展能力。
3、实现细节对客户透明 - 缺点
桥接会增加系统理解与设计的复杂程度,增加开发者的开发难度。