桥接模式是软件设计模式中最复杂的模式之一,它把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。事物对象仅是一个抽象的概念。如“圆形”、“三角形”归于抽象的“形状”之下,而“画圆”、“画三角”归于实现行为的“画图”类之下,然后由“形状”调用“画图”。----WIKIPEDIA
个人理解
桥梁模式的核心在于解耦,通过抽象化将具体的事物抽象成一般的事物,也就是具有共性的东西,将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联。因此,桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥梁模式的用意。
实例
对于一家汽车公司而言,最常用的应该说是生产汽车、卖汽车,对于这两项应该说大部分的汽车公司应该都是一致的。那么以这个为背景进行举例。(注:不知道什么原因,无法上传图片,将类的结构图放在源码中,需要的读者可以查看)。
首先各个公司业务,我们可以提供一个赚钱的接口。这里让抽象类与实现接口类耦合。
public abstract class CarCompanyBusi { protected CompanyImplementor carCompany; public CarCompanyBusi(CompanyImplementor carCompany){ this.carCompany = carCompany; } public abstract void getMoney(); }
public class CarCompanyBussiness extends CarCompanyBusi{ public CarCompanyBussiness(CompanyImplementor company){ super(company); this.carCompany = company; } @Override public void getMoney() { this.carCompany.produceCar(); this.carCompany.sellCar(); } }
实现接口类主要定义公司的具体行为
public interface CompanyImplementor { public void produceCar(); public void sellCar(); }
其实现类
public class HongQICompany implements CompanyImplementor { @Override public void produceCar() { System.out.println("生产汽车"); } @Override public void sellCar() { System.out.println("出售汽车"); } }
桥梁模式的优点
1. 抽象和实现分离:它完全是为了解决集成的缺点而提出的设计模式。在该模式下,实现可以不受抽象的约束,不用再绑定在一个固定的抽象层次上。
2. 优秀的扩展能力
3. 实现细节对客户透明。客户不用关心细节的实现,它已经由抽象层通过聚合关系完成了封装。
桥梁模式使用场景
1. 不希望或不适合使用集成的场景:例如继承层次过渡、无法更细化设计颗粒等场景,需要考虑使用桥梁模式。
2. 接口或抽象类不稳定的场景:明知道接口不稳定还想通过实现或继承来实现业务需求,那是得不偿失的,也是比较失败得作法。
3. 重用性要求较高的场景:设计的颗粒度越细,则被重用的可能性就越大,而采用继承则受父类的限制,不可能出现太细的颗粒度。
代码下载