继续我们水果园的新业务,当水果成熟后我们采摘水果时需要将水果放入到不同的采摘袋中,采摘袋又分为不同的材质(纸/塑料/麻袋等十多种)和不同的型号(大/中/小/迷你)组合起来,共40多种采摘袋。
这么多类型的采摘袋,我们如何对这些组合进行管理呢?细细想下,采摘袋的两个属性,一是大小,另一个是材质。我们可以将这两个属性进行剥离。
我们将采摘袋的大小和材质进行了拆分,通过组合的方式,让这两个属性类产生关系,最终把材质组合进了采摘袋的对象中去。这个就是桥接模式的表达方式,把两个类型的东西接到一起。桥接模式的主要目的不是结合而是为了分离,把对象的多个属性分离到不同类中,最终通过桥接的方式组合进来形成一个完整属性的对象。
首先我们将采摘袋分的材质属性分离出去,先来抽象一个材质的接口:
public interface Material {
public void draw();
}
有下面几个实现类,纸质包装,塑料包装、麻袋包装:
public class Paper implements Material {
@Override
public void draw() {
System.out.print("用纸盒");
}
}
public class Plastic implements Material {
@Override
public void draw() {
System.out.print("用塑料袋");
}
}
public class Sack implements Material {
@Override
public void draw() {
System.out.print("用麻袋");
}
}
包装袋的对象,这个就是桥接模式的核心,将材质通过组合的方式设置到了包装袋中,
public abstract class BagAbstraction {
public Material material;
public void setMaterial(Material material){
this.material = material;
}
//采摘
public abstract void pick();
}
下面有几个实现包装袋的类:
/**
* 采摘大袋
*/
public class BigBag extends BagAbstraction {
public void pick(){
System.out.println("采摘水果开始");
this.material.draw();
System.out.println("采摘了一大袋");
}
}
/**
* 采摘中型袋
* Material
*/
public class MidBag extends BagAbstraction {
public void pick(){
System.out.println("采摘水果开始");
this.material.draw();
System.out.println("采摘了一中型袋");
}
}
/**
* 采摘小袋
* Material
*/
public class SmallBag extends BagAbstraction {
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 Paper();
bag.setMaterial(material);
//开始采摘
bag.pick();
}
}
测试结果:
适配器和桥接模式对比
下面我们来对比下适配器和桥接模式,这两种模式的实现方案非常相似,都是通过组合方式,来将两个类产生关联。
在桥接模式里面对吧,我们采购袋组装进来了材料对象,那么在我们的适配器模式里面,我们是通过一个适配帮他组装了一个被适配的对象组装到这里面的,这两种模式在我们的结构体上看来是非常的相近的,唯一一个不同的区别的地方就是他们两个:桥接的目的是分离,我们前面的桥接还是他的目标,其实不是想把材料组合进来,他是想他的目标是按材料层采集在这个。对象里面,这个是发给分离出去,它的目标是分离。
那么适配器的目标呢,他的目的是合并。他这是是为了把目标对象,合并到我这个里面混我们的使用者来使用对吧?I还有一点就是我们的适配器模式一般是在于我们一些异常情况,比如说不太常见的一些特异情况,里面偶尔用一下对吧,如果我们大量的使命这么适配器的模式的话,它就会引起我们的体系混乱,他是为了为了办已有的两个对象联合起来,让他们工作,我没有办法做出来一个适配器。这是一个事后诸葛亮的一个补救措施。适配器模式,是先用了两单独的东西才有了适配器,这中间的这样一个桥梁对吧?那么我们的桥接模式呢是我们先就有这个桥一上来,这个桥和所有的东西都是没有的,我们完全的一个架构设计。