桥模式

来源:互联网 发布:淘宝炉石金币号 编辑:程序博客网 时间:2024/04/29 09:33

     定义:将抽象和实际解耦,使得它们可以分别独立的变化。该模式是继承关系的替代方案

    用处:可以通过聚合代替继承来解决子类爆炸性增长的问题

    应用例子:小说《知北游》里面分为九重天,什么清虚天 等,每一重天又分为许许多多不同的帮派,比如清虚天的碧落赋,罗生天的脉经海殿等等,要是把它们的关系用java或者其他面向对象的语言来抽象表示出来,有两种方案,其中之一是不使用桥模式的方案 ;第二种是使用桥模式的方案

             第二种:先设计一个接口(JiuChongSky),然后在设计九个实现类,每个实现类代表一重天,比如Class QingXuSky (implements JiuChongSky)代表清虚天,其余类似;然后对于每一重天的帮派类是派生于每一重天的类,比如清虚天的碧落赋,其类设计成Class BiLuoFu (extends QingXuSky);但是由于每一重天都有很多的帮派,所以每一重天都有很多的子类;其实这样的设计方案将九重天和帮派耦合在一起了,应该讲九重天和帮派解耦,所以为了解耦用桥模式正好适合这样的现象

            桥模式的设计方案:

                         设计两个接口,同样设计一个接口(JiuChongSky),代表九重天,然后设计其九个实现类,比如Class QingXuSky (implements JiuChongSky),其余的各重天都一次实现该接口;然后在设计个帮派的抽象类Gang,每一个帮派都继承了Gang接口,例如Class BiLuoFu extends Gang

                    代码如下:

  /**
 *九重天
 * @author Arthur
 */
public interface JiuChongSky {


    void inform();
}

**********************************************

各重天的代码如下:这里只列举清虚天和罗生天

/**
 *清虚天
 * @author Arthur
 */
public class QingXuSky implements JiuChongSky{


    @Override
    public void inform() {
       Print.print("清虚天");
    }
    
}


-------------------------------------------------------------------------------

/**
 *罗生天"
 * @author Arthur
 */
public class LuoShengSky implements JiuChongSky{


    @Override
    public void inform() {
       Print.print("罗生天");
    }
    
}

  

***********************************************************************

帮派抽象类

/**
 *帮派
 * @author Arthur
 */
public abstract class Gang {
    JiuChongSky jcs;//包含一个九重天的引用
    private String name = null;//帮派名称


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }
    
    public Gang(JiuChongSky jcs){
       this.jcs = jcs;
       this.inform();
    }
    
    public void inform(){
        jcs.inform();
    }
    
    
    @Override
    public String toString(){
        return name;
    }
}

*************************************************

帮派的子类。



/**
 *罗生天脉经海殿
 * @author Arthur
 */
public class MaiJingHaiDian extends Gang{


    public MaiJingHaiDian(JiuChongSky jcs) {
        super(jcs);
        this.setName("脉经海殿");
    }
    
}

----------------------------------------------------------------------------

/**
 *清虚天的音煞派
 * @author Arthur
 */
public class YinSha extends Gang{


    public YinSha(JiuChongSky jcs) {
        super(jcs);
        this.setName("音煞派");
    }
    
}

-------------------------------------------------------------------


/**
 *清虚天首席帮派碧落赋
 * @author Arthur
 */
public class BiLuoFu extends Gang{


    public BiLuoFu(JiuChongSky jcs) {
        super(jcs);
        this.setName("碧落赋");
    }
    
}

---------------------------------------------------------------------------

/**
 *罗生天的兵器甲御派
 * @author Arthur
 */
public class BingQiJiaYu extends Gang{


    public BingQiJiaYu(JiuChongSky jcs) {
        super(jcs);
        this.setName("兵器甲御派");
    }
    
}

-----------------------------------------------------------------------------------

客户端代码

/**
 *
 * @author Arthur
 */
public class Client {
    public static void main(String args[]){
        Gang g = new BiLuoFu(new QingXuSky());
        Print.print(g);
        Gang g1 = new MaiJingHaiDian(new LuoShengSky());
        Print.print(g1);
    }
}

****************************************************

运行结果:

清虚天碧落赋
罗生天脉经海殿


原创粉丝点击