桥梁模式
1.定义
桥梁(Bridge)模式 标准定义: 将抽象部分与它的实现部分分离,使它们都可以独立地变化。
2.实现
桥梁(Bridge)模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化.
桥梁模式
- 抽象化(Abstraction)角色: 定义抽象类的接口,维护一个指向Implemcntor类型对象的指针.
- 修正抽象化(Refine Abstraction)角色: 扩充由Abstraction定义的接口,Implementor定义实现类的接口.
- 实现化(Implementor)角色: 仅提供基本操作.这个抽象类规范具体实现化角色,规定出具体实现化角色当有的(非私有)方法和属性.
- 具体实现化(Concrete Implementor)角色: 实现Implementor接口并定义它的具体实现.
/**
* AbstractAction
* 实现化(Implementor)角色
*/
public abstract class AbstractAction {
public void doAction(String depart, String title) {
if (depart.length() == 0){
System.out.println("这是部门的标准工作活动");
}
System.out.println("这是" + depart + "部门的标准工作活动," + "主题是" + title);
}
}
/**
* AbstractDepartment
* 抽象化(Abstraction)角色
*/
public abstract class AbstractDepartment {
AbstractAction departAction;
void setAbstractAction(AbstractAction action) {
departAction = action;
}
public void action(String title) {
departAction.doAction("", title);
}
}
/**
* DevelopmentDep,FinanceDep,Meeting
* 具体实现化(Concrete Implementor)角色
*/
public class DevelopmentDep extends AbstractDepartment {
@Override
public void action(String title) {
String departName = "开发部";
departAction.doAction(departName, title);
}
}
public class FinanceDep extends AbstractDepartment {
@Override
public void action(String title) {
String departName = "财务部";
departAction.doAction(departName, title);
}
}
public class Meeting extends AbstractAction {
@Override
public void doAction(String depart, String title) {
if (depart.length() == 0) {
System.out.println("这是部门的会议工作活动");
}
System.out.println("这是" + depart + "会议工作活动," + "主题是" + title);
}
}
客户端
public class BridgeClient {
public static void main(String[] args) {
AbstractAction action = new Meeting();
AbstractDepartment depart = new DevelopmentDep();
depart.setAbstractAction(action);
depart.action("提高开发技能");
action = new Meeting();
depart = new FinanceDep();
depart.setAbstractAction(action);
depart.action("检查会计制度");
// out
// 这是开发部会议工作活动,主题是提高开发技能
// 这是财务部会议工作活动,主题是检查会计制度
}
}
3.扩展
JDK中的AWT就是采用的桥梁模式实现.
Component是提供给开发人员对窗体界面系统的抽象,代表图形用户界面中的一个控件,对于事件响应的处理,在Component类中有ComponentEvent属性.但是,在具体实现中,针对不同的Component类型,有着不同Event事件响应.例如,如果你使用AWT创建了一个Window类的实例,那么在程序运行时会创建一个窗口的实例,而由窗口实例会产生WindowEvent响应.不同的组件,有不同的事件响应实现.所以,作为Component有自己的一套继承体系,而Event事件响应也有对应的继承体系.而Component通过关联Event把这两者结合起来,形成这种一一映射关系.
实际上,从设计的角度来看,这是一个抽象和实现分离的过程.Component和ComponentEvent是抽象,Container和ContainerEvent是具体实现,抽象和实现各自成为一个对象体系,它们由一个桥连接起来,可以各自发展各自的对象层次,而不必顾虑另一方面.这就是Bridge模式所提供的思想.