设计模式之桥接模式
桥接模式(Bridge),其含义是将抽象部分与它的实现部分分离,使它们都可以独立地变化。这里的实现指的是功能的实现,并非接口实现。当一个抽象可能有多个实现时,通常用继承来协调它们。抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。该模式在抽象类与它的实现之间起到了桥梁作用,使它们可以独立地变化。
其适用性:
你不希望在抽象和它的实现部分之间有一个固定的绑定关系,
类的抽象以及它的实现都应该通过生成子类的方法加以扩充。这是Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充
对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译
你想对客户完全隐藏抽象的实现部分。在C++中,类的表示在类接口中是可见的
有许多类要生成,这种类层次结构说明你必须将一个对象分解成两个部分。Rumbaugh称这种类层次结构为”嵌套的普化“
你想在多个对象间共享实现(可能使用引用计数) ,但同时要求客户并不知道这一点。
桥接模式更多是提示我们如何组织面向对象设计的分解方式:第一要把依赖具体变成依赖抽象,第二如果同时存在多个正交的变化因素,就顺次展开,逐个抽象,第三为每个抽象因素提供具体实现。
如下:
桥接模式避免了在抽象和实现之间建立静态的联系,将其解耦独立变化,如下例子对应上图的模式结构图:
约会是抽象,其实现是活动类,活动类的具体实现是吃饭和看电影,而RefineAbstraction可以是和女生约会或者和女士约会,下面是实现:
package org.designpattern.structural.bridge;
private Activity activity;
public Activity getActivity() {
return activity;
}
public void setActivity(Activity activity) {
this.activity = activity;
}
public abstract void act(Activity activity);
}
Activity.java就是一个接口,package org.designpattern.structural.bridge;
public void doSomething();
}
DateWithGirl.java
package org.designpattern.structural.bridge;
public void act(Activity activity){
activity.doSomething();
}
}
DateWithLady.java
package org.designpattern.structural.bridge;
public void act(Activity activity){
activity.doSomething();
}
}
下面是两个具体的实现类;
EatMeal.java
public class EatMeal implements Activity{
System.out.println("eat a meal!");
}
}
WatchMovies.java
public class WatchMovies implements Activity {
System.out.println("watch movies!");
}
}
客户测试类:
public class Main {
Dating dating = new DateWithGirl();
dating.act(new WatchMovies());
Dating dat1 = new DateWithLady();
dat1.act(new EatMeal());
}
}
桥接模式是一个非常有用的模式,在需求中的相互关联的抽象有多个变化维度时,需要使用桥接模式来解耦。