本文介绍23种设计模式之桥接模式。
定义
使用桥接模式(Bridge Pattern)不只改变你的实现,也改变你的抽象。 其实就是说通过组合的方式将抽象和实现分离,从而达到解耦的效果。
描述
- 模式名称:BRIDGE(桥接)
- 类型:对象结构型模式
- 意图:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
- 适用性:
- 在程序运行时实现部分应可以被切换,希望在抽象和它的实现部分之间是动态绑定的关系。
- 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必修改。
- 效果:
- 优点:
- 分离接口及其实现部分。
- 提高可扩展性,你可以独立地对抽象和实现类进行扩展。
- 缺点:
- 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
类图
- 抽象化(Abstraction):定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(ConcreteAbstraction):是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor):定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(ConcreteImplementor):给出实现化角色接口的具体实现。
实现代码
做一个遥控器和电视的实现,通过组合的方式可以将 遥控器和电视解构,其子类也可进行独立改变
电视机类(Implementor)
public interface Tv {
abstract void on();
abstract void off();
abstract void tuneChannel(int i);
}
ConcreteImplementor
public class ConcreteTv implements Tv {
@Override
public void on() {
}
@Override
public void off() {
}
@Override
public void tuneChannel(int i) {
System.out.println("ConcreteTv 切换为频道"+i);
}
}
遥控器类(Abstraction)
public abstract class RemoteControl {
private Tv tv;
public RemoteControl(Tv tv){
this.tv = tv;
}
public void on(){
tv.on();
}
public void off(){
tv.off();
}
public void setChannel(int i){
tv.tuneChannel(i);
}
}
ConcreteAbstraction
public class ConcreteRemote extends RemoteControl {
int currentStation;
public ConcreteRemote(Tv tv) {
super(tv);
}
//实现类可以在抽象类基础上进行独立改变
public void nextChannel(){
setChannel(currentStation+1);
}
}