- 双维度拓展
- 实际中用的不多,很少用,了解一下即可
- 分离抽象与具体
- 用聚合方式(桥)链接抽象与具体
- 为了防止类爆炸的问题(见下面gg追mm的例子),采用Bridge的设计模式
- 抽象和具体两个维度同时发展,互相之间不影响,也不会产生类爆炸
UML类图
- 抽象部分的继承树和实现部分的继承树分离开来
- 但是在抽象中聚合一个具体的实现
- 两个维度在不同发展,同时发展
- 用聚合代替继承
- 聚合到什么中去就代表什么样的什么……
以GG送不同礼物追MM的过程来说明
GG最初只考虑送花和书当礼物给MM
Gift抽象类
package com.mashibing.dp.bridge.v1;
public abstract class Gift {}
Flower类
package com.mashibing.dp.bridge.v1;
public class Flower extends Gift {
}
Book类
package com.mashibing.dp.bridge.v1;
public class Book extends Gift {
}
MM类
package com.mashibing.dp.bridge.v1;
public class MM {
String name;
}
GG类
package com.mashibing.dp.bridge.v1;
public class GG {
public void chase(MM mm) {
Gift g = new Book();
give(mm, g);
}
public void give(MM mm, Gift g) {
}
}
如果GG考虑将礼物分为温柔的礼物和狂野的礼物 (使用继承)WarmGift WildGift
- 耦合度高
- 容易产生类爆炸
- 如果礼物分为温柔的礼物和狂野的礼物 WarmGift、WildGift,这时Flower应该分为 WarmFlower、WildFlower、WarmBook、WildBook
- 如果再有别的礼物,比如抽象类型:ToughGift、ColdGift,或者具体的某种实现:Ring、Car ,就会产生类的爆炸WarmCar、ColdRing、WildCar、WildFlower…
WildGift类
```java package com.mashibing.dp.bridge.v2;
public class WildGift extends Gift { }
<a name="xnhug"></a>
#### WarmGift类
```java
package com.mashibing.dp.bridge.v2;
public class WarmGift extends Gift {
}
WarmFlower类
package com.mashibing.dp.bridge.v3;
/**
* 或者从WarmGift继承
* 或者从Flower继承
*/
public class WarmFlower extends Flower {
}
- 抽象的部分在发展,实现的部分也在发展===>m*n的增长,继承不合适(继承合适就不用设计模式了)
- 像装饰器模式???只不过装饰的是抽象的而不是具体的
- 不完美的解决方案:类型都变成interface===>但类型一般变不成interface
- 因为WarmGift相对有点具体,有自己的抽象方法或者部分实现的方法(不一定是个接口也不一定有接口的含义)
使用桥接模式
- 双维度拓展
- 分离抽象与具体
- 抽象和具体两个维度同时发展,互相之间不影响,也不会产生类爆炸
- 用聚合方式(桥)链接抽象与具体
- 使用桥接模式:
- 分离抽象与具体实现,让他们可以独自发展
- Gift -> WarmGift、ColdGift、WildGift
- GiftImpl -> Flower、Ring、Car
- 桥接模式,抽象类调用某一方法时,实际上是通过成员对象(即具体实现类)调用相应方法实现的
- 有点像visitor模式,实际上还是多态的灵活运用!
Gift抽象类
```java package com.mashibing.dp.bridge.v4;
// 将具体的礼物作为成员变量存在Gift中 public abstract class Gift { GiftImpl impl; }
<a name="SROKV"></a>
### WarmGift类
```java
package com.mashibing.dp.bridge.v4;
public class WarmGift extends Gift {
public WarmGift(GiftImpl impl) {
this.impl = impl;
}
}
WildGift类
package com.mashibing.dp.bridge.v4;
public class WildGift extends Gift {
public WildGift(GiftImpl impl) {
this.impl = impl;
}
}
GiftImpl类
package com.mashibing.dp.bridge.v4;
public class GiftImpl {
}
Book类(继承自GiftImpl)
package com.mashibing.dp.bridge.v4;
public class Book extends GiftImpl {
}
Flower类
package com.mashibing.dp.bridge.v4;
public class Flower extends GiftImpl {
}
MM类
package com.mashibing.dp.bridge.v4;
public class MM {
String name;
}
GG类
package com.mashibing.dp.bridge.v4;
public class GG {
public void chase(MM mm) {
// 将具体的礼物作为成员变量存在Gift中
Gift g = new WarmGift(new Flower());
give(mm, g);
}
public void give(MM mm, Gift g) {
System.out.println(g + "gived!");
}
}
经典的桥接模式(GOF)
- 字处理器在不同的操作系统上的实现
- 小窗口、半大窗口、……