一、概述
桥接模式,也叫作桥梁模式,抽象部分与它的实现部分分离,使它们都可以独立地变化。
一般来说,两个系统不应该直接地互相联接和依赖。相反,他们应该通过抽象来联接或依赖(参见依赖倒置和开闭原则),这样它们就是松耦合的,我们就可以在必要时轻松地修改实现,而不对系统的其它部分造成太大影响。
参与者
- Abstraction:定义抽象类的接口。维护一个指向Implementor类型对象的指针。
- RefinedAbstraction:扩充由Abstraction定义的接口。
- Implementor:定义实现类的接口,该接口不一定要与Abstraction的接口完全一致。事实上这两个接口可以完全不同。一般来讲,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。
- ConcreteImplementorA:实现Implementor接口并定义它的具体实现。
- ConcreteImplementorB:实现Implementor接口并定义它的具体实现。
类图
二、示例
采摘袋分不同的材质(纸/塑料/麻袋等十多种)和不同的型号(大/中/小/迷你)组合起来,共40多种采摘袋
1、采摘袋有两个属性:大小与材质
2、取舍采摘袋的主要属性,是大小;附属属性是材质。
3、剥离掉附属属性材质,放入一个扩展实体中去。
1、 材质属性Material,单独成为一个扩展属性接口
2、 BagAbstraction组合Material接口对象
3、 BagAbstraction具有两个子类(大/小),与Material子类组合变化
三、代码
材料
/**
* Material
* 原材料
*/
public interface Material {
// 装
void draw();
}
/**
* Material
*/
public class Plastic implements Material{
@Override
public void draw(){
System.out.print("用塑料袋");
}
}
/**
* 包装接口
* Material
*/
public class Sack implements Material{
@Override
public void draw(){
System.out.print("用麻袋");
}
}
/**
* 采摘容器
*/
public abstract class BagAbstraction {
// 原材料
protected Material material;
public void setMaterial(Material material) {
this.material = material;
}
//采摘
public abstract void pick();
}
/**
* 采摘大袋
*/
public class BigBag extends BagAbstraction {
@Override
public void pick() {
System.out.println("采摘水果开始");
this.material.draw();
System.out.println("采摘了一大袋");
}
}
/**
* 采摘小袋
*/
public class SmallBag extends BagAbstraction {
@Override
public void pick() {
System.out.println("采摘水果开始");
this.material.draw();
System.out.println("采摘了一小包");
}
}
/**
* 园丁采摘水果
*/
public class BridgeClient {
public static void main(String[] args) {
// 选择袋子型号
BagAbstraction bag = new SmallBag();
//袋子材质
Material material = new Sack();
bag.setMaterial(material);
//开始采摘
bag.pick();
}
}
四、适配器模式和桥接模式的异同
PS:都是把两个对象组合起来配合工作。桥接的目标是分离,适配的目标是合并。