在23种设计模式当中,个人体会,bridge模式是比较难以理解的,今天我们通过一个例子,来深入的解释一下这种模式。
首先,我们用一句话来说明一下bridge模式究竟要做些什么样的事情。
桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦
举一个简单的例子:
public interface Person {
void relax();
}
public class Man implements Person {
@Override
public void relax() {
System.out.println("Play football");
}
}
public class Woman implements Person {
@Override
public void relax() {
System.out.print("shopping");
}
}
我们定义了一个Person的interface,定义了一个行为,relax,然后我们认为,男人拿踢球当放松,女人拿逛街当放松。
那么如果按照bridge的模式来实现的话,应该是这个样子的。
public class Person {
protected RelaxImpl relaxImpl;
public Person(RelaxImpl relaxImpl){
this.relaxImpl = relaxImpl;
}
public void relax(){
relaxImpl.relax();
}
}
public abstract class RelaxImpl {
public abstract void relax();
}
public class PlayFootball extends RelaxImpl{
@Override
public void relax() {
System.out.println("Play football");
}
}
public class Shopping extends RelaxImpl {
@Override
public void relax() {
System.out.print("shopping");
}
}
那么bridge这个模式本身最关键的地方在哪里,在一般的面向对象的概念当中,抽象概念的具体化,更多的是通过继承来实现的,父类或者interface只是定义了一个抽象行为的概念,具体该怎么做,把它放在子类当中来具体实现;而在桥接器模式当中,把抽象的概念和具体的实现分离开来。
在上面的例子当中,传统方式下,person是一个包含了具体行为(relax)的概念,不同人的不同relax方式,是通过类继承来实现的。而在birdge模式下,person只是起到了一个桥接器的作用,具体的实现交给了RelaxImpl以及它的子类们来完成。
在这里,我们把抽象的人的概念和具体的relax行为的实现做了一个划分,把基于继承关系的强耦合转换为了基于聚合关系的弱耦合。可是这么做,究竟有什么样的意义呢?
我们考虑一下这个问题更加的复杂化之后是什么样子的,之前的例子当中,我们按照性别把人分为了2类,Man和Woman,可是实际情况是,relax的方式,绝不仅仅受到性别的影响,可能还会受到年龄、受教育程度等等不同维度信息的影响。如果这样考虑的话,通过继承关系来实现不同的行为,就变得不可接受了。
那么一个可行的做法,就是把具体的行为和抽象的概念分割开来。多维度问题的解决,也是bridge模式一个常见的应用模式。