桥接模式不仅改变实现,也改变抽象
java类图
java代码
// 实现层次,电视机接口
public interface TV {
void on();
void off();
void tuneChannel(int channel);
int getChannel();
}
// 索尼电视机
public class SonyTV implements TV {
private int channel = 1;
@Override
public void on() {
System.out.println("Sony TV turn on");
}
@Override
public void off() {
System.out.println("Sony TV turn off");
}
@Override
public void tuneChannel(int channel) {
System.out.println("channel = " + channel);
this.channel = channel;
}
@Override
public int getChannel() {
return channel;
}
}
// 三星电视机
public class SamsungTV implements TV {
private int channel = 1;
@Override
public void on() {
System.out.println("Samsung TV turn on");
}
@Override
public void off() {
System.out.println("Samsung TV turn off");
}
@Override
public void tuneChannel(int channel) {
System.out.println("channel = " + channel);
this.channel = channel;
}
@Override
public int getChannel() {
return channel;
}
}
// 抽象层次,可以是接口也可以是抽象类
public abstract class RemoteControl {
protected TV tv;
public RemoteControl(TV tv) {
this.tv = tv;
}
public void on() {
tv.on();
}
public void off() {
tv.off();
}
public void tuneChannel(int channel) {
tv.tuneChannel(channel);
}
}
// 其中一个控制器实现
public class FirstRemoteControl extends RemoteControl {
public FirstRemoteControl(TV tv) {
super(tv);
}
public void addChannel() {
tuneChannel(tv.getChannel() + 1);
}
}
// 测试类
public class Test {
public static void main(String[] args) {
new Test().test();
}
private void test() {
FirstRemoteControl control = new FirstRemoteControl(new SonyTV());
control.on();
control.tuneChannel(10);
control.addChannel();
control.off();
}
}
注:
- 桥接模式和策略模式很接近,桥接模式不仅改变实现,也改变抽象;策略模式只能改变算法实现。
- 将实现予以解耦,让它和界面直接不在永久绑定。
- 抽象和实现可以对独立扩展,不会影响到对方。
- 对于“具体抽象类”所做的改变,不会影响到客户。
- 适合使用在需要跨越多个平台的图形和窗口系统上。
- 当需要用不同的方式改变接口和实现时,你会发现桥接模式很好用。
- 桥接模式的缺点是增加了复杂度。
参考文章
Head First 设计模式