何时使用:
当一个类具有两个维度及以上的可变维度时,就可以使用到桥接模式,这也是桥接模式与策略模式的一个使用的区别,策略模式生成的策略树往往只能应对一个可变维度。
具体例子分析:
现在需要实现一个画图程序的主体框架,包括以下部分,图形:点、线、矩形、圆…,线形:实线、虚线、双线…,如果使用策略模式实现主体框架的话会导致具体策略实现的组合爆炸,会生成4*3种具体的策略方式,并且每次每个类型中增加一项都要增加很多具体的策略实现,显然此时策略模式就无法胜任这个工作。下面我们就来看一下怎么使用桥接模式去完成这个画图程序的框架。
public class bridge_pattern {
abstract class shape {
lineshape lineshape;
abstract void draw();
}
abstract class lineshape {
abstract void draw();
}
class real_line extends lineshape {
@Override
void draw() {
// TODO Auto-generated method stub
System.out.println("使用了实线");
}
}
class virtual_line extends lineshape {
@Override
void draw() {
// TODO Auto-generated method stub
System.out.println("使用了虚线");
}
}
class double_line extends lineshape {
@Override
void draw() {
// TODO Auto-generated method stub
System.out.println("使用了双线");
}
}
class point extends shape {
@Override
void draw() {
// TODO Auto-generated method stub
System.out.println("画了一个点");
lineshape.draw();
}
}
class line extends shape {
@Override
void draw() {
// TODO Auto-generated method stub
System.out.println("画了一条线");
lineshape.draw();
}
}
class rectangle extends shape {
@Override
void draw() {
// TODO Auto-generated method stub
System.out.println("画了一个矩形");
lineshape.draw();
}
}
class circle extends shape {
@Override
void draw() {
// TODO Auto-generated method stub
System.out.println("画了一个圆");
lineshape.draw();
}
}
public static void main(String[] args) {
bridge_pattern b=new bridge_pattern();
shape circle =b.new circle();
lineshape virtual_line =b.new virtual_line();
circle.lineshape=virtual_line;
circle.draw();
}
}
对于维度的理解:
个人理解维度应该是需要被组合在一起的可变因素,如果两个可变部分不需要被同时考虑,则可以直接使用策略模式做成两棵独立的策略树,如果需要被组合在一起,那桥接模式会比策略模式更加适合。