桥接模式(Bridge Pattern):不常用的设计模式,为了继承的缺点而提出来的设计模式,在此模式下,实现可以不受抽象的约束,将实现独立出来,实现对用户透明,通过桥梁的关系,将实现细节与抽象层通过聚合关系完成封装
Decouple an abstraction from its implementation so that the two can vary independently.
将抽象部分与它的实现部分分离,使它们都可以独立的变化。
桥接模式的四个角色:
- 抽象化(Abstraction)角色:抽象化的给出定义,并保存一个对实现化对象的引用
- 实现化(Implementor)角色:具体实现化角色的接口,但不给出具体的实现
- 修正抽象化(RefinedAbstraction)角色:扩展抽象化角色,并对抽象化角色进行修正
- 具体实现化(ConcreteImplementor)角色:对实现化接口中的方法进行具体的实现
继承具有强入侵性质,而桥接模式是弱关联关系,因此对于比较明确不发生变化的,则可以通过继承来完成,若不能确定是否会发生变化,则通过桥接模式来完成
引用大话设计模式里的一句话来解释桥接模式就是:“实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少他们之间的耦合”
桥接模式基础代码实现:
public class BridgeModel {
/*
* 桥接模式——聚合关系
*/
public static void main(String[] args) {
Abstraction ab;
//抽象化角色A
ab=new RefinedAbsA();
ab.setImplementor(new ConcreteImpA());
ab.operation();//具体实现A
ab.setImplementor(new ConcreteImpB());
ab.operation();//具体实现B
//抽象化角色B
ab=new RefinedAbsB();
ab.setImplementor(new ConcreteImpA());
ab.operation();//具体实现A
ab.setImplementor(new ConcreteImpB());
ab.operation();//具体实现B
}
}
//实现化角色
interface Implementor {
public void operation();
}
//具体实现化角色
class ConcreteImpA implements Implementor {
@Override
public void operation() {
System.out.print("具体实现A+");
}
}
class ConcreteImpB implements Implementor {
@Override
public void operation() {
System.out.print("具体实现B+");
}
}
//抽象化角色(内部有一个实现对象的引用)
abstract class Abstraction {
//定义 实现对象 的引用
private Implementor implementor;
public void setImplementor(Implementor implementor) {
this.implementor=implementor;
}
//具体的实现操作
public void operation() {
implementor.operation();
};
}
//修正抽象化角色
class RefinedAbsA extends Abstraction{
public RefinedAbsA() {
System.out.println("抽象化角色A--:");
}
public void operation() {
super.operation();
//修正业务代码
System.out.println("修正具体实现业务代码");
}
}
class RefinedAbsB extends Abstraction{
public RefinedAbsB() {
System.out.println("抽象化角色B--:");
}
public void operation() {
super.operation();
//修正业务代码
System.out.println("修正具体实现业务代码");
}
}
运行结果:
抽象化角色A--:
具体实现A+修正具体实现业务代码
具体实现B+修正具体实现业务代码
抽象化角色B--:
具体实现A+修正具体实现业务代码
具体实现B+修正具体实现业务代码
参考书籍:《大话设计模式》《设计模式(Java版)》