设计模式之桥接模式

Posted 郭梧悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之桥接模式相关的知识,希望对你有一定的参考价值。

说实话,在应用中很少使用这个模式,这个模式个人表示有点令人费解。但是我想着既然自己单独弄了个设计模式的专栏,那就要一个不拉的把它们都写完,给本专栏来一个完美的结局。

定义

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

用处:

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

应用例子:

小说《知北游》这部十几年前看过的第一部网络小说,不知道读者里面有没有读过这本小说的同道中人,当时真的是被里面的内容给惊艳到了,原来小说还可以这么写吗!现在的网络小说基本上都是套路文,没啥看头了。咳咳,闲言少叙,书归正传。还是回到桥接模式上面来。《知北游》书里面分为九重天,比如清虚天、色欲天、黄泉天、罗胜天等,每一重天又分为许许多多不同的帮派(姑且这么理解,读过知北游的道友不要较真,比如有的天就没有帮派),比如清虚天的碧落赋,罗生天的脉经海殿等等,要是把它们的关系用java或者其他面向对象的语言来抽象表示出来,有两种方案,其中之一就是使用常规的继承方案 ;第二种是使用桥接模式的方案。

继承方案

先来看看第一种继承方案,先设计个九重天接口,然后罗生天、黄泉天、色欲天等为九重天的派生子类。而每重天又派生出了大大小小个帮派,所以其设计结构图如下:

但是这么做有一个缺点,就是帮派和每重天耦合太严重。上图中博主有意的将九重天的颜色和帮派的颜色作为区分。上面设计一个错误的地方就是将帮派作为每重天的子类,每重天和帮派之间并不是父子关系,比如在罗升天的某个帮派可以迁移到魔刹天去。但是上图天与帮派这种直接的派生关系限制了帮派的迁移,二者不能独立的变化。使用桥接模式可以解决这个问题。

桥接模式方案

将九重天和帮派解耦,分别对帮派和九重天设计成两个接口。变成如下的样式:

注意在本篇博文中抽象化的角色是帮派,而实现类的角色是九重天。简单用代码表示如下,九重天的接口及其实现类:

//九重天接口
public interface JiuChongSky {
    String inform();//提供九重天信息
}

//清虚天
public class QingXuSky implements JiuChongSky{
    @Override
    public String inform() {
       return "秘道术的天下,甘柠真出自这里";
    }    
}


//罗胜天
public class LuoShengSky implements JiuChongSky{
    @Override
    public String inform() {
       return "甲御术的天下,海姬出自这里。后其姐姐海妃被楚度与清虚天公子樱密谋所灭";
    }    
}
 

帮派的抽象类及其子类,帮派百度翻译成(Gang):

//帮派抽象类
public abstract class Gang {
     JiuChongSky jcs;//包含一个九重天的引用
    public Gang(JiuChongSky jcs){
       this.jcs = jcs;
    }   
    public void printSkyInfo(){
        System.out.println(jcs.inform());
    }

    public abstract String name();
}




/**
 *罗生天脉经海殿
 */
public class MaiJingHaiDian extends Gang{
    public MaiJingHaiDian(JiuChongSky jcs) {
        super(jcs);
    }
    public String name(){
      return "脉经海殿";
    }
}


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


    public BiLuoFu(JiuChongSky jcs) {
        super(jcs);
    }
   public String name(){
      return "碧落赋";
    }
}

总的来看桥接模式的思想就是让抽象部分持有实现部分的引用,可以通过该引用来操作具体的实现。但是怎么区分抽象部分和实现部分以及在代码里怎么实际应用,就不好说了:

以上是关于设计模式之桥接模式的主要内容,如果未能解决你的问题,请参考以下文章

php设计模式之桥接模式实例代码

设计模式之桥接模式

设计模式之桥接模式应用例题

设计模式之桥接模式 Bridge

设计模式之桥接模式

Java二十三设计模式之-----桥接模式