定义
桥接模式(bridge):将抽象部分与实现部分分离,使它们都可以独立的变化.
从定义来看,抽象的简直看不了,那么通俗点讲,我们怎么理解桥接模式呢?
我们再举一个例子,假设你是一个地主,你有两个管家,两个工人,那么每天你怎么指挥他们呢,你可以告诉管家A让工人1去干活,同时也可以告诉管家B让工人2去工作,或者管家A去指挥工人2,管家B去指挥工人1, 你可以自由组合这种变化,管家和工人之间也没有什么依赖,他们都可以独立的变化,那么我们再把管家和工人的职责和具体的人再分离,是不是就印证了定义呢? 将抽象部分和实现部分分离,使他们都可以独立的变化? 那么我们就实现了一个桥接模式了.
好像还是有点绕,那么我们来看看具体代码怎么去实现:
首先,我们先抽象一个管家的职责,这个管家的职责,就是管理工人工作:
public abstract class HouseKeep{
protected Work work;
public HouseKeep(Work work) {
this.work = work;
}
void manage() {
this.work.work();
}
}
接下来我们实现A和B两个管家:
public class HouseKeeperA extends HouseKeep {
public HouseKeeperA(Work work) {
super(work);
}
public void manage() {
System.out.println("管家A指派");
super.manage();
}
}
public class HouseKeeperB extends HouseKeep {
public HouseKeeperB(Work work) {
super(work);
}
public void manage() {
System.out.println("管家B指派");
super.manage();
}
}
接着我们抽象一个工人的职责,工人的职责当然就是工作了:
public interface Work {
void work();
}
再接着我们实现两个工作的工人:
public class woker1 implements Work {
public void work() {
System.out.println("工人1工作");
}
}
public class worker2 implements Work {
public void work() {
System.out.println("工人2工作");
}
}
好了,现在我们就可以随心所意的指挥他们了:
public class clinet {
public static void main(String[] args) {
//你让管家A指挥工人1
HouseKeep keep = new HouseKeeperA(new woker1());
keep.manage();
//你让管家A指挥工人2
keep = new HouseKeeperA(new worker2());
keep.manage();
//你让管家B指挥工人1
keep = new HouseKeeperB(new woker1());
keep.manage();
//你让管家B指挥工人2
keep = new HouseKeeperB(new worker2());
keep.manage();
}
}
来让我们看看他们都还听话吗:
管家A指派工人1工作
管家A指派工人2工作
管家B指派工人1工作
管家B指派工人2工作
结果还不错,我们把具体的工作和工作的人做了分离,并且可以让他们随意的组合,独立的变化,那么这不就是桥接模式吗?