java设计模式-桥接模式

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){
        
    }
}
View Code

MM

public class MM {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    
}
View Code

其他的一些礼物类,都继承于Gift:

public class Gift {

}
public class Flower extends Gift{

}
public class Ring extends Gift{

}
public class WarmGift extends Gift{

}
public class WildGift extends Gift{

}
View Code

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{

}
View Code

Ring

public class Ring extends GiftImpl{
    
}
View Code

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;
    }
}
View Code

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){
        
    }
}
View Code

 

感觉有一点绕,需要仔细体会下....

 

3.小结:                      

如果在子类的扩展中,有两个维度,那么这时候想解耦合,来解决他们的排列组合的问题,这个时候可以用桥接;
桥接模式用的并不是很多;
 
 
 
posted on 2018-06-04 22:44  有点懒惰的大青年  阅读(358)  评论(0编辑  收藏  举报