1. 写在前面
上一小节中我们学习了 适配器 Adapter
,其主要的应用场景是将一类对象转换成为另一类对象。
这里转换的过程分为3步:
- 接受原对象
- 实现原对象的逻辑
- 返回目标对象
2. 桥接 Bridge
桥接Bridge Pattern
的特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。
这个概念还是非常抽象的,其主要应用在如下场景:
多维度变化,多层继承结构
我们将每一个维度进行独立封装,使得各个维度可以独立扩展。避免直接继承带来的子类爆炸。
3. 使用
使用场景:一个类在 2个维度
都会变化
记住这是桥接使用的唯一场景。
我们看一个电脑的例子,在传统的继承结构中我们会如下安排整体的结构。
按照传统的继承结构,我们会产生3个级别, 4 个子类。
但是如果我们按照维度来封装,即 Brand
& Type
直接看代码
首先是对第一个维度 Brand
的封装,将其封装为一个接口。
// 品牌维度
public Interface Brand(){
// 品牌维度的信息
void brandInfo();
}
public class AppleBrand implements Brand{
@Override
void brandInfo(){
sout("Apple Brand !")
}
}
public class AsusBrand implements Brand{
@Override
void brandInfo(){
sout("Asus Brand !")
}
}
然后是第二个维度的封装,因为最终我们需要包含2个维度的信息,因此需要使用一个 抽象类
来 持有第一个维度的引用,同时在 这个抽象类中的抽象方法中,写入第二个维度信息。
// 类型维度
// 这里因为类型是要包含品牌在内的,因此需要持有品牌的接口
public abstract class Computer(){
protected Brand brand;
void Computer(Brand brand){
this.brand = brand;
}
// 这个抽象接口是要实现2个维度的逻辑的
public abstract info();
}
// 具体的类型
public Laptop extends Computer{
void Laptop(Brand brand){
super(brand);
}
@Override
public void info(){
// Brand 维度的信息
brand.info();
// Type 维度的信息
sout("this is laotop !")
}
}
public class Desktop extends Computer{
public Desktop(Brand brand) {
super(brand);
}
@Override
public void info() {
// Brand 维度信息
brand.info();
// Type 维度信息
System.out.println("this is desktop");
}
}
现在到了具体的使用了。
可以看到两个维度可以灵活组合。
MacBrand macBrand = new MacBrand();
AsusBrand asusBrand = new AsusBrand();
Desktop macDesktop = new Desktop(macBrand);
macDesktop.info();
Desktop asusDesktop = new Desktop(asusBrand);
asusDesktop.info();
Laptop macLaptop = new Laptop(macBrand);
macLaptop.info();
Laptop asusLaptop = new Laptop(asusBrand);
asusLaptop.info();
下面是输出
this is Mac Brand!
this is desktop
This is Asus brand!
this is desktop
this is Mac Brand!
this is laptop!
This is Asus brand!
this is laptop!