桥梁模式也叫桥接模式,其定义如下:将抽象和实现解耦,使得两者可以独立变化。它的重点在“解耦”上面。
它有一下四个角色:
- Abstraction抽象角色:它的职责是定义该角色的行为,同时保存对一个实现化角色的引用,该角色一般是一个抽象类。
- Implementor实现化角色:它是接口或抽象类,定义角色所必须的行为和属性。
- RefinedAbstraction修正抽象化角色:它引用实现化角色对抽象化角色进行修正。
- ConcreateImplementor具体实现化角色:他实现接口或抽象类角色定义的方法和属性。
下面看一个通用代码:
//实现化角色 public interface implementor{ //基本方法 public void doSomething(); public void doAnything(); } //具体实现化角色 public class ConcreateImplementor1 implements Implementor{ public void doSomething(){ } public void doAnything(){ } } public class ConcreateImplementor2 implements Implementor{ public void doSomething(){ } public void doAnything(){ } }
//抽象化角色 public abstract class Abstraction{ //定义对实现化角色的引用 private Implementor imp; //约束子类必须实现的构造函数 public Abstraction(Implementor impl){ this.imp = impl; } //自身的行为或属性 public void request(){ this.imp.doSomething(); } //获得实现化角色 public Implementor getImpl(){ return imp; } } //具体抽象化角色 public class RedifinedAbstraction extends Abstraction{ public RedifinedAbstraction(Implementor impl){ super(impl); } //修正父类的行为 @Override public void request(){ super.request(); super.getImpl.doSomething(); } } //场景类 public class Client{ public static void main(String[] args){ //定义一个实现化角色 Implementor imp = new ConcreateImplementor1(); //定义一个抽象化角色 Abstraction abs = new RedifinedAbstraction(imp); //执行行文 abs.request(); } }
桥梁模式的优点:
- 抽象和实现分离:这源于桥梁模式的特点,完全是为了解决继承的缺点而提出的,在这种模式下,实现可以不受抽象的约束,不再绑定到一个固定的抽象层次上。
- 优秀的扩充能力。
- 实现细节对客户透明:客户不用关心细节的实现,他已经由抽象层通过聚合完成了封装。
使用场景:
- 不希望或不适合使用继承的场景:比如继承层次过度,无法更细化设计颗粒的场景
- 接口或抽象类不稳定的场景:明知道接口不稳定,可能会经常发生变化,还要使用继承或实现来实现业务需求,那是得不偿失的。
- 重用性要求比较高的场景:设计的颗粒度越细,被重用的的可能性越大,而采用继承则受限于父类,难以实现细粒度设计。