现在的位置: 首页 > 综合 > 正文

设计模式之6 桥接模式和adapter模式

2012年12月31日 ⁄ 综合 ⁄ 共 1976字 ⁄ 字号 评论关闭

1.    桥接模式就是bridge模式。

简单的来说,就是一个类如果想往两个维度扩展,就用耦合来代替继承关系,进行排列组合

 

所谓耦合就是在一个类当中持有另外一个类的对象。

通过耦合和继承相结合,就可以排列组合出各种情况。

Bridge模式是为了解决类的层次和结构过于复杂的问题,而提出的。

 

 

类与类的关系:

1.      如果一个类的对象是另外一个类的成员变量,表示这个类是另外一个类的一部分。

2.      类的对象也可以作为另外一个类的方法的参数。

分析,如果一个类的对象是另外一个类的成员变量,耦合度很高。修改维护成本高。如果类的对象也可以作为另外一个类的方法的参数,相对来说耦合度低一些。

 

聚合关系:

1.      GiftImpl类,是礼物类型的抽象类(flower,ring…)。

 

package com.bjsxt.dp.bridge;

 

publicclass GiftImpl {

 

}

 

package com.bjsxt.dp.bridge;

 

publicclass Flower
extends GiftImpl {

 

}

 

package com.bjsxt.dp.bridge;

 

publicclass Flower
extends GiftImpl {

 

}

 

2.      Gift类,是概念类型的抽象类(wild,warm)。

package com.bjsxt.dp.bridge;

 

publicclass Gift {

    //聚合关系,在gift当中持有GiftImpl的对象。

    protected GiftImpl
impl;

}

 

package com.bjsxt.dp.bridge;

 

publicclass WarmGift
extends Gift{

    //WarmGiftGift继承,并且在构造方法提供了一个参数

    //这个参数就是来自父类的当中的一个对象

    //这个对象就是另外一个维度的扩展(flower,ring...)

    public WarmGift(GiftImpl impl) {

       this.impl = impl;

    }

}

 

package com.bjsxt.dp.bridge;

 

publicclass WildGift
extends Gift {

 

    public WildGift(Ring ring) {

       this.impl =
impl;

    }

   

}

 

通过这样的方式就可以生成不同的排列组合。当然,这个是两个维度的扩展,至于3维或者更多,暂不考虑。

 

最后看看使用者类:

package com.bjsxt.dp.bridge;

 

publicclass Boy {

    private String
name;

   

 

    public String getName() {

       returnname;

    }

 

    publicvoid setName(String name) {

       this.name = name;

    }

 

    //使用的情况

    publicvoid pursue(MM mm) {

       //温暖的花

       Gift g1 = new WarmGift(new Flower());

       //狂野的戒指

       Gift g = new WildGift(new Ring());

       //give(g, mm);

    }

   

    publicvoid give(Gift g, MM mm) {

      

    }

}

 

 

2.    adapter模式就是一个转接器,提供了一个转换的接口。感觉有点像个变压器。

通常都有一个输入和一个输出。一个典型的应用就是:JDBC-ODBC桥。

典型的应用,就是inputstreamReader类,和outputstreamWriter类。能把inputStream转换成为Reader,outputStream转换成为writer。

下面说下在awt当中的adapter,从功能上来说,Adapter和Listener功能是重复的,但是listener是个接口,如果要实现listener接口,需要实现接口当中的所有的方法。比如说,在mouselistenter有mouseClicked, mouseEntered, mouseExited, mousePressed, mouseReleased六个方法。为了可以不用写Listener当中所有的方法。我们可以选择使用adapter接口。Adapter是个类,而listener是接口。Adapter实现了Listener接口。所以使用adapter的时候,不需要写哪些不想实现的方法。可以只写需要实现的接口。所以adapter的意义在于方便用户添加listener,如果不想实现listener,就添加一个adapter,同样可以完成任务。

 

抱歉!评论已关闭.