介绍
桥接模式(BridgePattern)也成为桥梁模式,是结构型设计模式之一。
定义
将抽象部分与实现部分分离,使他们都可以独立进行变化。
使用场景
如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
UML类图
角色介绍:
- Abstraction:抽象部分
该类保持一个对实现部分对象的引用,抽象部分中的方法需要调用实现部分的对象来实现,该类一般为抽象类。
- RefindAbstraction:优化的抽象部分
抽象部分的具体实现,该类一般式对象部分的方法进行完善和扩展。
- Implementor:实现部分
可以为接口活抽象类,其方法不一定要与抽象部分一直,一般情况下是实现部分提供基本的操作,而抽象部分定义的则是基于实现部分这些基本操作的业务方法。
- ConcreteImplementorA/ConcreteImplementorB:实现部分的具体实现
完善实现部分中方法定义的具体逻辑
- Client:客户类,客户端程序
优点
- 分离抽象与实现
- 灵活的扩展
缺点
- 设计复杂
示例代码
Implementor
public interface IFunc {
void doFunc();
}
具体实现
public class PhoneFunc implements IFunc{
@Override
public void doFunc() {
System.out.println("打电话");
}
}
public class PhotoFunc implements IFunc {
@Override
public void doFunc() {
System.out.println("进行拍照");
}
}
Abstraction
public abstract class MobilePhone {
private IFunc mFunc;
public MobilePhone(IFunc func) {
this.mFunc = func;
}
public void doFunc() {
mFunc.doFunc();
}
}
RefindAbstraction
public class MobilePhoneFuncs extends MobilePhone {
public MobilePhoneFuncs(IFunc func) {
super(func);
}
public void refindedDoFunc() {
System.out.println("操作手机");
doFunc();
}
}
Test
public class TestBridge {
public static void main(String[] args) {
IFunc funcPhone = new PhoneFunc();
IFunc funcPhoto = new PhotoFunc();
System.out.println("----------");
MobilePhoneFuncs funcsPhone = new MobilePhoneFuncs(funcPhone);
funcPhone.doFunc();
System.out.println("----------");
MobilePhoneFuncs funcsPhoto = new MobilePhoneFuncs(funcPhoto);
funcsPhoto.doFunc();
System.out.println("----------");
}
}
Log
----------
打电话
----------
进行拍照
----------