将抽象部分与实现部分分开
示例:
在两个维度上可以自由地添加类,而不会影响到其它的类
结构
桥模式的组件
Abstraction
- 定义抽象的接口。
- 维护对Implementor类型的对象的引用。
RefinedAbstraction
- 扩展抽象定义的接口。
Implementor** **
- 定义实现类的接口。
- 这个接口不必完全对应于抽象的接口;事实上,这两个接口可能完全不同
Typically** **
- 实现接口仅提供原始操作
- 抽象接口定义基于原始操作的高层操作
The ConcreteImplementors : **ImplementorA and ImplementorB**
- 将接口与实现解耦
- 实现部分动态配置
- 取消编译时对实现部分的依赖
- 改变实现类不需要重新编译抽象类与客户类
- 改善了可扩展性
- 对用户隐藏实现细节
何时使用桥模式
当您想避免抽象与实现之间的永久绑定时,请使用桥接模式。
当必须在运行时选择或切换实现时
典型示例代码示例
class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals ( FINDPRICE )) {
String size = getTeaCup(); //获得用户输入:杯子大小
String kind = getTeaKind(); //获得用户输入:茶种类
//Create a TeaKindobject
if( kind.compareTo(GREENTEA)==0 )
tKind = new GreenTea();
if( kind.compareTo(REDTEA)==0 )
tKind = new RedTea();
if(size.compareTo(SUPERCUP)==0)
tCup= new Super(tKind);
if(size.compareTo(MEDIUMCUP)==0)
tCup= new Medium(tKind);
float price = tCup.getPrice();
}
}
}
抽象接口类
public interface **TeaCup** {
public abstract float getPrice();
}
抽象部分子类
public class Medium implements **TeaCup**{
private TeaKind tk;
public Medium (TeaKind tKind){
tk = tKind;
}
public float getPrice(){
float teaPrice = tk.price();
return teaPrice;
}
}
实现部分的抽象接口。
public interface **TeaKind** {
public abstract float price();
}
实现部分的实现类。
public class **RedTea implements TeaKind**{
private final float PRICE = 2.5f;
public float price(){
return PRICE;
}
}