1.背景
追MM的例子,Boy追MM,需要送礼物Gift,有Flower,Ring继承自Gift;
还有WarmGift温暖的礼物,WildGift狂野的礼物;
Boy:
public class Boy { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void pursue(MM mm){ Gift g = new Ring(); give(g, mm); } public void give(Gift g, MM mm){ } }
MM
public class MM { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
其他的一些礼物类,都继承于Gift:
public class Gift { } public class Flower extends Gift{ } public class Ring extends Gift{ } public class WarmGift extends Gift{ } public class WildGift extends Gift{ }
Gift在往子类扩展,扩展类型的时候,它会有两个维度上的扩展;
一种是具体的维度,比如说ring
一种是类型上的划分,比如是warm的,wild的;
比如现在有一种温柔的花,怎么组织呢,一种方法是从flower继承,为warmFlower;
....
慎用继承,因为继承关系代表着很强烈的一种耦合关系,父类要变了,子类马上要跟着变;而设计的时候讲究高内聚低耦合;
那么能不能找到一种方式,同时支持在上面两种维度上的扩展呢?
——桥接模式:
2.桥接模式引入
使用聚合代替继承;
礼物的具体实现类,GiftImpl.java:
/** * 礼物具体的实现 * @author CY * */ public class GiftImpl extends Gift{ }
Gift:
public class Gift { protected GiftImpl impl; }
Flower:
public class Flower extends GiftImpl{ }
Ring
public class Ring extends GiftImpl{ }
WarmGift:
public class WarmGift extends Gift{ public WarmGift(GiftImpl impl){ this.impl = impl; } }
WildGift:
public class WildGift extends Gift{ public WildGift(GiftImpl impl){ this.impl = impl; } }
Boy:
public class Boy { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void pursue(MM mm){ //Gift g = new WarmGift(new Flower()); //温暖的花 Gift g = new WildGift(new Ring()); //狂野的戒指 give(g, mm); } public void give(Gift g, MM mm){ } }
感觉有一点绕,需要仔细体会下....
3.小结:
如果在子类的扩展中,有两个维度,那么这时候想解耦合,来解决他们的排列组合的问题,这个时候可以用桥接;
桥接模式用的并不是很多;