结构型设计模式之--桥接模式

继续我们水果园的新业务,当水果成熟后我们采摘水果时需要将水果放入到不同的采摘袋中,采摘袋又分为不同的材质(纸/塑料/麻袋等十多种)和不同的型号(大///迷你)组合起来,共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还有一点就是我们的适配器模式一般是在于我们一些异常情况,比如说不太常见的一些特异情况,里面偶尔用一下对吧,如果我们大量的使命这么适配器的模式的话,它就会引起我们的体系混乱,他是为了为了办已有的两个对象联合起来,让他们工作,我没有办法做出来一个适配器。这是一个事后诸葛亮的一个补救措施。适配器模式,是先用了两单独的东西才有了适配器,这中间的这样一个桥梁对吧?那么我们的桥接模式呢是我们先就有这个桥一上来,这个桥和所有的东西都是没有的,我们完全的一个架构设计。

猜你喜欢

转载自blog.csdn.net/cpcpcp123/article/details/107297097
今日推荐