天天看点

JAVA bridge设计模式,java 设计模式 bridge

在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模式一个常见的应用模式。