结构模式之桥梁模式注解

来源:互联网 发布:安卓client软件 编辑:程序博客网 时间:2024/05/17 03:13

在提到桥梁模式之前,需要先提一下适配器模式。适配器模式中可以分为类的适配器模式和对象的适配器模式。类的适配器模式是通过继承实现的,而对象的适配器模式则是通过引用的方式得以实现的。这个对象的适配器模式其实很重要,因为按类的适配器来说,是通过继承方式实现的,但是我们也可以将这种继承关系改成对对象的引用达到同样的功能,而这种将继承关系改为对对象的引用关系就是桥梁模式存在的原因。

桥梁模式讲的就是将抽象化与实现化脱耦,即将继承关系转为引用关系。同时支持二者独立进行演化,即将原来认为的父子关系转换为一种引用关系,为了支持独立演化,则将原来的子类演化为另外一种接口。所以桥梁模式涉及到两个概念,一是脱耦,即将原来的抽象化和实现化之间的继承关系使用组合/聚合关系,二是独立演化,即将所脱离出来的子类抽象为另外一种接口(Implementor实现化),从而达到原来的父类(Abstraction抽象化)和现在的子类的抽象类独立深化的目的。但是原来的父类接口(Abstraction)和现在独立出来的子类接口(Implementor)之间仍然是有联系的,那就是原来的父类定义的那个接口,在子类独立出来之后,也仍然是需要关联的,只是原来的方式是如果父类定义了一个接口operation(),则子类继承时必须实现这个operation()的方法,而现在由于子类独立出来了,并且可以独立演化,因此其就不用必须实现operation()这个方法,但是由于既然原来二者是有一定的关系的,并且新的模式是要求原来的父类接口含有新独立出来的子类接口的引用,那么说明原来父类接口新的子类(RefinedAbstraction修正抽象化)会调用独立出来的子类接口(ConcreteImplementor具体实现化),所以新独立出来的子类是一定有一个类似的方法,比如叫operationImpl(),然后由原来的父类的接口的子类来调用这个operationImpl()方法,而沟通原来父类接口与子类接口的这个方式就叫桥梁模式,这个恐怕才是叫桥梁的原因,所谓桥梁就是用来进行两者之间的沟通的,这里的这个桥梁就是指的是原来的父类接口的子类(即RefinedAbstraction实现了operation()的子类)调用独立出来的新类的(即ConcreteImplementor中的operationImpl())方法,这个调用就叫桥梁。

所以桥梁模式一定要明确一个地方,就是在未独立出来之前,二者是有关系的,是有大关系的,即继承关系。就好比一条江的两边,如果没有这个江存在,那么江的两边是完整地对接了的,那么他们就是一体的,而现在如果有了江,则我们要将二者接通,则需要架一座桥才行。当然这个桥架好之后,对于两边的江而言是可以独立发展的,两者唯一的关系也因为这个桥的存在而存在联系。所以如果我们希望某两个地方可以独立进行变化,而又必须有联系,就可以用这种模式,比如一个城市,分了两个区,我们自然是希望这两个区自己独立发展,但是我们也要考虑将这两个区联系起来,所以才会在这两个区之间修一些公路啊这么,这就是这种模式的形象化表述。

下图为桥梁模式的静态UML类图结构:


下面给出桥梁模式的参考代码。

抽象化(Abstraction)角色的代码如下:

abstract public class Abstraction

{

    //对子类抽象化接口的引用,此处略去注入方法

    private Implementor imp;

    public void operation()

    {

    imp.operationImp();

    }

}

修正抽象化(Refined Abstraction)角色代码如下:

public class RefinedAbstractionextends Abstraction

{

    public void operation()

    {//修正抽象化角色,即原来的接口实现类分离出去之后,所留下的

     //原抽象类Abstraction的新的子类,注意是在原来的子类分离出去之后的

        //improved logic

    }

}

实现化(Implementor)角色

abstract public class Implementor

{

    //实现化角色为原来的抽象化角色Abstraction的子类分离出来之后的

    //抽象化角色,可以独立演化。此处的operationImp将会被原来的抽象化

    //角色Abstraction的新的子类修改抽象化角色RefinedAbstraction进行调用

    //RefinedAbstraction调用这个方法的方式就叫桥梁

    public abstract void operationImp();

}

具体实现化(Concrete Implementor)角色的代码如下:

public classConcreteImplementorA extends Implementor

{

    public void operationImp()

    {//实现了分离出来的抽象实现化角色的具体方法

        System.out.println("Do something...");

    }

}


原创粉丝点击