桥接模式

桥梁模式的重点在解耦。

定义

将抽象和实现解耦,使得两者可以独立的变化。
它使用了类间的聚合关系、继承、覆写等常用功能。解决了继承的缺点而提出的设计模式。

桥接模式通用类图

实现

抽象角色引用实现角色,或者说抽象角色的部分实现是由实现角色完成的。

Abstraction

抽象化角色,定义出该抽象角色的行为,同时保存一个对实现化角色的引用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public abstract class Abstraction{

private Implementor imp;
//必须指定实现者
public Abstraction(Implementor imp){
this.imp = imp;
}

public void request(){
this.imp.doSomething();
}
public Implementor getImp(){
return imp;
}
}

RefindAbstraction

修正抽象化角色,引用实现化角色对抽象化角色进行修正。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class RefindAbstraction extends Abstraction{

public RefindAbstraction(Implementor imp){
super(imp);
}

@Override
public void request(){
//....
super.request();
super.getImp().doAnyThing();
}
}

Implementor

实现化角色,接口或者抽象类,定义角色必须的行为和属性。

1
2
3
4
public interface Implementor{
public void doSomething();
public void doAnyThing();
}

ConcreteImplementor

具体实现化角色,实现接口或者抽象类定义的方法和属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ConcreteImplementor1 implements Implementor{

public void doSomething(){
//
}
public void doAnyThing(){
//
}
}

public class ConcreteImplementor2 implements Implementor{

public void doSomething(){
//
}
public void doAnyThing(){
//
}
}

Use

1
2
3
Implementor imp = new ConcreteImplementor1();
Abstraction abs = new RefindAbstraction(imp);
abs.request();

应用

优点

  • 抽象和实现分离
    为了解决继承的缺点而提出的设计模式,在该模式下,实现可以不受抽象的约束,不再绑定到固定的抽象层次上。

  • 优秀的扩展能力

可以随意增加抽象和实现。

  • 实现细节对客户透明

由抽象层通过聚合关系完成了封装。

使用场景

  • 不希望或者不适用使用继承的场景
    继承层次太高,无法更细化设计颗粒等场景,需要考虑使用。
  • 接口或者抽象类不稳定的场景
    接口或者抽象类不稳定,经常变更时,使用桥梁模式。
  • 重用型要求高的场景
    设计的颗粒度粤西,被重用的可能性越大。
    采用继承受到父类的限制,不可能出现太细的粒度。