Decouple an abstraction from its implementation so that the two can vary independently.
将抽象和实现解耦,使得两者可以独立地变化。
Bridge 模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。
简单来说:抽象角色引用实现角色,或者说抽象角色的部分实现是由实现角色完成的。
公司是通过生成产品,销售产品来获取利润。
产品为实现化角色:
IProduct.java
public interface IProduct {
void beProduced();
void beSold();
}
公司为抽象化角色,并聚合产品:
Company.java
public abstract class Company {
private IProduct product;
public Company(IProduct product) {
this.product = product;
}
public void makeProfile() {
this.product.beProduced();
this.product.beSold();
}
}
现在有ipad和小米手机2个产品被生产和销售(具体实现化角色):
IpadProduct.java
public class IpadProduct implements IProduct {
@Override
public void beProduced() {
System.out.println("ipad生产出来了");
}
@Override
public void beSold() {
System.out.println("ipad卖掉了");
}
}
XiaoMiProduct.java
public class XiaoMiProduct implements IProduct {
@Override
public void beProduced() {
System.out.println("小米手机生产出来了");
}
@Override
public void beSold() {
System.out.println("小米手机卖掉了");
}
}
有的公司销售商品可以赚大钱,有的赚小钱,有的亏本,现在这个电子厂生产ipad和小米手机赚了大钱(修正抽象化角色):
ElecCommpany.java
public class ElecCompany extends Company{
public ElecCompany(IProduct product) {
super(product);
}
@Override
public void makeProfile() {
super.makeProfile();
System.out.println("电子厂赚大钱了");
}
}
测试:
public class Client {
public static void main(String[] args) {
ElecCompany company=new ElecCompany(new IpadProduct());
company.makeProfile();
company=new ElecCompany(new XiaoMiProduct());
company.makeProfile();
}
}
如果另外一个电子厂,生产同样的商品,赔钱了,可以扩展另外一个修正的抽象化角色。
如果一家房地产公司盖房子、卖房子赚钱了,可以扩展房子商品的具体实现化角色,和房地产公司修正的抽象化角色。
实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。
对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成。
桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。
桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程
桥接模式要求正确识别出系统中两个独立变化的维度(抽象、和实现),因此其使用范围有一定的局限性,即需要有这样的应用场景。
工厂模式主要负责创建对象而桥模式主要负责将抽象的不同形式与具体实现部分分离。
最典型的例子就是JDBC。JDBC API(Sun)提供抽象部分,各个JDBC驱动厂商(Oracle, Mysql…)提供实现部分。新的JDBC驱动可以“即插即用”在JDBC API中,而不需要修改我们调用者的代码。这就是所谓的抽象部分(JDBC API)与它的实现部分(JDBC Driver)分离。从宏观角度JDBC可以称为桥模式,但是从微观角度,JDBC中又使用了很多其他设计模式,比如工厂模式,策略模式等。
工厂模式是一个产品,自己只是提出来需要厂家生产,而桥接模式则是自己的产品去调用某个对象里的某个方法而已。