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{
//WarmGift从Gift继承,并且在构造方法提供了一个参数
//这个参数就是来自父类的当中的一个对象
//这个对象就是另外一个维度的扩展(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,同样可以完成任务。