1、定义
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
2、UML类图
-
抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
-
扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
-
实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
-
具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
3、实例
a、背景
(1)、一个公司,有产品,具体有服装公司、汽车公司、食品公司等。
(2)、一个产品,具体可以包含服装、汽车、食品等。
UML类图
b、实例
步骤一:定义一个产品抽象类
public abstract class Product {
public abstract void make();
public abstract void sell();
}
步骤二:定义产品具体实现
内衣
public class Shirt extends Product {
@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("生产内衣衬衫");
}
@Override
public void sell() {
// TODO Auto-generated method stub
System.out.println("销售内衣衬衫");
}
}
外套
public class Jacket extends Product {
@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("生产外套夹克");
}
@Override
public void sell() {
// TODO Auto-generated method stub
System.out.println("销售外套夹克");
}
}
步骤三:定义一个公司抽象类,并维护指向产品对象的指针
public abstract class company {
//生产服装
private Product product;
public company(Product product) {
this.product = product;
}
public void makeMoney() {
this.product.make();
this.product.sell();
}
}
步骤四:创建一个具体的公司,服装公司
public class ClotheCompany extends company{
public ClotheCompany(Product product) {
super(product);
// TODO Auto-generated constructor stub
}
@Override
public void makeMoney() {
// TODO Auto-generated method stub
super.makeMoney();
System.out.println("服装公司盈利");
}
}
步骤五:创建一个测试类
public class TestBridge {
public static void main(String[] args) {
System.out.println("外套这样挣的钱");
ClotheCompany shirt = new ClotheCompany(new Shirt());
shirt.makeMoney();
System.out.println("内衣这样挣的钱");
ClotheCompany Jacket = new ClotheCompany(new Jacket());
Jacket.makeMoney();
}
}
输出:
4、优点
-
可以将接口与实现相分离。
-
提高了可扩展性。
-
对客户端隐藏了实现的细节。
5、缺点
-
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
-
桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
6、使用场景
-
想避免在抽象及其实现之间存在永久的绑定。
-
抽象及其实现可以使用子类进行扩展。
-
抽象的实现被改动应该对客户端没有影响,不用重新编译代码