zoukankan      html  css  js  c++  java
  • 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.小结:                      

    如果在子类的扩展中,有两个维度,那么这时候想解耦合,来解决他们的排列组合的问题,这个时候可以用桥接;
    桥接模式用的并不是很多;
     
     
     
  • 相关阅读:
    40.广搜练习:洪水
    40.广搜练习:洪水
    39.递推练习:   菲波那契数列(2)
    39.递推练习:   菲波那契数列(2)
    39.递推练习:   菲波那契数列(2)
    21世纪的信息化与20世纪的自动化
    一个文件夹就是一个信息系统
    团队的建设是部门管理目标的核心
    信息共享的另一种形式--复用
    如何工作体会
  • 原文地址:https://www.cnblogs.com/tenWood/p/9136392.html
Copyright © 2011-2022 走看看