简介
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。其构成如下:
- 抽象化角色(Abstraction):抽象化给出的定义,并保存一个对实现化对象的引用。
- 修正抽象化角色(RefineAbstraction):拓展抽象化角色,改变和修正父类对抽象化的定义。
- 实现化角色(Implementor):这个角色给出实现化角色的接口,但是不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
- 具体实现化角色(ConcreteImplementor):这个角色给出实现化角色接口的具体实现
类图
代码
/**
* 数据线
* 抽象化角色(Abstraction):抽象化给出的定义,并保存一个对实现化对象的引用
* @author: 张彬
* @date: 2018年5月16日 上午11:38:47
* @version: V1.0
* @review: 张彬/2018年5月16日 上午11:38:47
*/
public abstract class DataWire {
protected Computer computer;
public DataWire(Computer computer){
this.computer = computer;
}
public abstract void sendData();
}
/**
* 手机
* 修正抽象化角色(RefineAbstraction):拓展抽象化角色,改变和修正父类对抽象化的定义。
* @author: 张彬
* @date: 2018年5月16日 上午11:44:19
* @version: V1.0
* @review: 张彬/2018年5月16日 上午11:44:19
*/
public class HuaWei extends DataWire{
public HuaWei(Computer computer) {
super(computer);
}
@Override
public void sendData() {
System.out.println("hw手机发送数据");
computer.receiveData();
}
}
/**
* 手机
* 修正抽象化角色(RefineAbstraction):拓展抽象化角色,改变和修正父类对抽象化的定义。
* @author: 张彬
* @date: 2018年5月16日 上午11:44:19
* @version: V1.0
* @review: 张彬/2018年5月16日 上午11:44:19
*/
public class XiaoMi extends DataWire{
public XiaoMi(Computer computer) {
super(computer);
}
@Override
public void sendData() {
System.out.println("xm手机发送数据");
computer.receiveData();
}
}
/**
* 电脑
* 实现化角色(Implementor)
* 这个角色给出实现化角色的接口,但是不给出具体的实现。
* 必须指出的是,这个接口不一定和抽象化角色的定义相同,实际上,这两个接口可以非常不一样。
* 实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
* @author: 张彬
* @date: 2018年5月16日 上午11:33:48
* @version: V1.0
* @review: 张彬/2018年5月16日 上午11:33:48
*/
public interface Computer {
public void receiveData();
}
/**
* 具体实现化角色(ConcreteImplementor):这个角色给出实现化角色接口的具体实现。
* @author: 张彬
* @date: 2018年5月16日 上午11:46:14
* @version: V1.0
* @review: 张彬/2018年5月16日 上午11:46:14
*/
public class Mac implements Computer{
@Override
public void receiveData() {
System.out.println("mac接受数据");
}
}
/**
* 具体实现化角色(ConcreteImplementor):这个角色给出实现化角色接口的具体实现。
* @author: 张彬
* @date: 2018年5月16日 上午11:46:14
* @version: V1.0
* @review: 张彬/2018年5月16日 上午11:46:14
*/
public class Windows implements Computer{
@Override
public void receiveData() {
System.out.println("windows接受数据");
}
}
/**
* 客户端
* @author: 张彬
* @date: 2018年5月16日 上午11:49:11
* @version: V1.0
* @review: 张彬/2018年5月16日 上午11:49:11
*/
public class Client {
public static void main(String[] args) {
DataWire hw = new HuaWei(new Mac());
hw.sendData();
DataWire xm = new XiaoMi(new Windows());
xm.sendData();
}
}
输出结果:
hw手机发送数据
mac接受数据
xm手机发送数据
windows接受数据
总结
优点:
1、抽象和实现的分离。
2、优秀的扩展能力。
3、实现细节对客户透明。
缺点:
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。