什么是桥梁模式?
桥梁模式是将抽象与实现解耦,使得两者可以独立的变化。那么我们的重点就是如何将抽象与实现解耦?
桥梁模式的关键是什么?
如下如为桥梁模式的类图,其中的关键就是Abstraction和Implementor的关系。Abstraction为抽象角色,Implementor为实现角色,其中抽象类依赖实现类。
下面我们看一下桥梁模式的四个角色:
- Abstraction - 抽象化角色:它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。
- Implementor - 实现化角色:它是接口或者抽象类,定义角色必须的行为和属性。
- RefinedAbstraction - 修正抽象化角色:它引用实现化角色对修正化角色进行修正。
- ConcreteImplementor - 具体实现化角色:它实现接口或抽象类定义的行为和属性。
对于桥梁模式,主要解决的是多个模式控制下的复杂性,例如我们搬家时会准备很多箱子,包括有纸箱、布箱,有大箱子、中箱子、小箱子等。我们的UML设计如下:
SizeImpl接口(实现化角色)代码:
public interface SizeImpl {
public int size();
}
Big类(具体实现化角色)代码:
public class Big implements SizeImpl {
@Override
public int size() {
return 20;
}
}
Small类(具体实现化角色)代码:
public class Small implements SizeImpl {
@Override
public int size() {
return 5;
}
}
AbstractBox抽象类(抽象化角色)代码:
public abstract class AbstractBox {
private SizeImpl size;
public SizeImpl getSize() {
return size;
}
public void setSize(SizeImpl size) {
this.size = size;
}
public abstract void makeBox();
}
PaperBox类(修正抽象化角色)代码:
public class PaperBox extends AbstractBox {
@Override
public void makeBox() {
System.out.println("material:paper");
System.out.println("size:" + getSize().size());
}
}
client代码:
public class BoxClient {
public static void main(String[] args) {
PaperBox paperBox = new PaperBox();
paperBox.setSize(new Big());
paperBox.makeBox();
}
}
执行结果如下:
material:paper
size:20
这样做的好处是如果我们想扩展皮箱,不需要再去定义大皮箱、中皮箱、小皮箱三个类,只需要定义一个皮箱类。
桥梁模式的优点
- 实现抽象与现实的分离,很好的解决了继承的缺点。
- 优秀的扩展能力。
- 实现细节对客户透明。
桥梁模式的使用场景
- 系统需要再抽象化角色与具体化角色之间增加更多灵活性。
- 客户端要求实现化角色的任何改变不影响客户端。
- 一个构建有多于一个的抽象化角色和实现化角色。
- 虽然系统中使用继承没有问题,但是系统中的抽象化角色与具体化角色需要独立变化。
参考
http://blog.csdn.net/xingjiarong/article/details/50132727