背景: 男孩要最妹妹
桥接模式:::如果在子类的扩展上有两个维度,,那么这时候想要解耦合,,解决两个维度的
排列组合问题,,这个时候 可以用桥接 {两个维度排列组合问题}
===========================================
男孩类
package com.linux_lihuafeng.bridge;
public class Boy {
private String name;
//这种表示:妹妹是哥哥的一部分,,妹妹和Boy之间的关系更紧密
//不建议用这种方式,,建类时最好高内聚,低耦合
// MM mm ;
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) {
}
}
========================================================
妹妹类
package com.linux_lihuafeng.bridge;
public class MM {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
==========================================================
礼物类
package com.linux_lihuafeng.bridge;
public class Gift {
}
===========================================================
温暖的礼物类
package com.linux_lihuafeng.bridge;
public class WarmGift extends Gift{
}
============================================================
狂野的礼物类
package com.linux_lihuafeng.bridge;
public class WildGift extends Gift{
}
==============================================================
花类
package com.linux_lihuafeng.bridge;
public class Flower extends Gift{
}
==============================================================
戒指类
package com.linux_lihuafeng.bridge;
public class Ring extends Gift{
}
作为Gift类来讲,,向子类扩展具体类型时,会有两个维度上的扩展
第一个维度::如 温暖型(WarmGift)、狂野型(WildGift)
第二个维度::如 花(Flower)、戒指(Ring)
这两个维度会有交叉,,如花 既有温暖型的,,又有狂野型的
Gift
WarmGift WildGift Flower Ring
一种不好的解决办法::: 如 新建一个类WarmFlower,继承Flower类,这样会造成类的复杂化
使用继承时要谨慎, 因为继承是一种强烈的高耦合关系,,父类改变时,子类也会跟着改变
而设计原则是高内聚,低耦合
利用Bridge设计模式可解决这类问题
增加一个新的类,,GiftImpl,, 现在关于类型的(如 WarnGift、WildGift)继承Gift
而 具体礼物的实现(如 Flower、Ring)继承GiftImpl
如果我们想要温暖的花,,怎么办呢???
可以用聚合的手段代替继承,,{这是实际中经常用的手段}
现在的类图如下:
聚合
Gift <--------------------------- GiftImpl
WarmGift WildGift Flower Ring
=============================================================
Gift类
package com.linux_lihuafeng.bridge;
public class Gift {
//聚合
GiftImpl impl ;
}
==============================================================
GiftImpl类
package com.linux_lihuafeng.bridge;
public class GiftImpl {
}
==============================================================
Flower类
package com.linux_lihuafeng.bridge;
public class Flower extends GiftImpl{
}
===============================================================
Ring类
package com.linux_lihuafeng.bridge;
public class Ring extends GiftImpl{
}
===============================================================
WarmGift类
package com.linux_lihuafeng.bridge;
public class WarmGift extends Gift{
public WarmGift(GiftImpl impl) {
this.impl = impl;
}
}
================================================================
WildGift类
package com.linux_lihuafeng.bridge;
public class WildGift extends Gift{
public WildGift(GiftImpl impl) {
this.impl = impl;
}
}
=================================================================
MM类 {没有改变}
package com.linux_lihuafeng.bridge;
public class MM {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
==================================================================
Boy类
package com.linux_lihuafeng.bridge;
public class Boy {
private String name;
//这种表示:妹妹是哥哥的一部分,,妹妹和Boy之间的关系更紧密
//不建议用这种方式,,建类时最好高内聚,低耦合
// MM mm ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void pursue(MM mm) {
//将一朵温暖的花给妹妹
Gift g = new WarmGift(new Flower());
give(g, mm);
//将一枚狂野的戒指给妹妹
Gift g2 = new WildGift(new Ring());
give(g2, mm);
}
public void give(Gift g, MM mm) {
}
}
===================================================================