Java设计模式之《桥接模式》及应用场景

原创做品,能够转载,可是请标注出处地址http://www.cnblogs.com/V1haoge/p/6497919.htmlhtml

  这里摘抄一份他处的概念,你能够没必要理会,先看下面得讲解与实例,而后返回来理解概念,否则抽象的概念会让你崩溃...数据库

  桥接(Bridge)是用于把抽象化与实现化解耦,使得两者能够独立变化。这种类型的设计模式属于结构型模式,它经过提供抽象化和实现化之间的桥接结构,来实现两者的解耦。设计模式

  这种模式涉及到一个做为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。ide

  我的理解:桥接是一个接口,它与一方应该是绑定的,也就是解耦的双方中的一方必然是继承这个接口的,这一方就是实现方,而另外一方正是要与这一方解耦的抽象方,若是不采用桥接模式,通常咱们的处理方式是直接使用继承来实现,这样双方之间处于强连接,类之间关联性极强,如要进行扩展,必然致使类结构急剧膨胀。采用桥接模式,正是为了不这一状况的发生,将一方与桥绑定,即实现桥接口,另外一方在抽象类中调用桥接口(指向的实现类),这样桥方能够经过实现桥接口进行单方面扩展,而另外一方能够继承抽象类而单方面扩展,而之间的调用就从桥接口来做为突破口,不会受到双方扩展的任何影响。测试

  下面的实例能真正体现着一点:spa

  实例准备:咱们假设有一座桥,桥左边为A,桥右边为B,A有A1,A2,A3等,表示桥左边的三个不一样地方,B有B1,B2,B3等,表示桥右边的三个不一样地方,假设咱们要从桥左侧A出发到桥的右侧B,咱们能够有多重方案,A1到B1,A1到B2,A1到B3,A2到B1...等等,以此为例,代码以下:设计

桥接口:Qiao代理

1 public interface Qiao {
2     //目的地B
3     void targetAreaB();
4 }

目的地B1,B2,B3:code

 1 /**
 2  * 目的地B1
 3  */
 4 public class AreaB1 implements Qiao {
 5 
 6     @Override
 7     public void targetAreaB() {
 8         System.out.println("我要去B1");
 9     }
10 
11 }
12 
13 /**
14  * 目的地B2
15  */
16 public class AreaB2 implements Qiao {
17 
18     @Override
19     public void targetAreaB() {
20         System.out.println("我要去B2");
21     }
22 
23 }
24 
25 /**
26  * 目的地B3
27  */
28 public class AreaB3 implements Qiao {
29 
30     @Override
31     public void targetAreaB() {
32         System.out.println("我要去B3");
33     }
34 
35 }

抽象来源地A:AreaAhtm

1 public abstract class AreaA {
2     //引用桥接口
3     Qiao qiao;
4     //来源地
5     abstract void fromAreaA();
6 }

来源地A1,A2,A3:

 1 /**
 2  * 来源地A1
 3  */
 4 public class AreaA1 extends AreaA {
 5 
 6     @Override
 7     void fromAreaA() {
 8         System.out.println("我来自A1");
 9     }
10     
11 }
12 
13 /**
14  * 来源地A2
15  */
16 public class AreaA2 extends AreaA {
17 
18     @Override
19     void fromAreaA() {
20         System.out.println("我来自A2");
21     }
22 
23 }
24 
25 /**
26  * 来源地A3
27  */
28 public class AreaA3 extends AreaA {
29 
30     @Override
31     void fromAreaA() {
32         System.out.println("我来自A3");
33     }
34 
35 }

测试类:Clienter

1 public class Clienter {
2     public static void main(String[] args) {
3         AreaA a = new AreaA2();
4         a.qiao = new AreaB3();
5         a.fromAreaA();
6         a.qiao.targetAreaB();
7     }
8 }

运行结果:

我来自A2
我要去B3

  如何,只要你认真看完了实例,你就明白了这种模式的好处,如今咱们要添加来源地和目的地,只要继续继承AreaA和实现Qiao便可,以前我所说的绑定,正式此处将桥与目的地绑定在一块儿,使用一个接口完成。

  其实要完成桥接模式,注意点并很少,重在理解模式的使用场景。

  注意点:

    一、定义一个桥接口,使其与一方绑定,这一方的扩展所有使用实现桥接口的方式。

    二、定义一个抽象类,来表示另外一方,在这个抽象类内部要引入桥接口,而这一方的扩展所有使用继承该抽象类的方式。

  其实咱们能够发现桥接模式应对的场景有方向性的,桥绑定的一方都是被调用者,属于被动方,抽象方属于主动方。

  其实个人JDK提供的JDBC数据库访问接口API正是经典的桥接模式的实现者,接口内部能够经过实现接口来扩展针对不一样数据库的具体实现来进行扩展,而对外的仅仅只是一个统一的接口调用,调用方过于抽象,能够将其看作每个JDBC调用程序(这是真实实物,固然不存在抽象)

  下面来理解一下开头的概念:

  桥接(Bridge)是用于把抽象化与实现化解耦,使得两者能够独立变化。这种类型的设计模式属于结构型模式,它经过提供抽象化和实现化之间的桥接结构,来实现两者的解耦。

  这种模式涉及到一个做为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

 

  理解:此处抽象化与实现化分别指代实例中的双方,并且实现化对应目的地方(经过实现桥接口进行扩展),抽象方对应来源地方(经过继承抽象类来进行扩展),若是咱们不使用桥接模式,咱们会怎么想实现这个实例呢?很简单,咱们分别定义来源地A一、A二、A3类和目的地B一、B二、B3,而后具体的实现就是,A1到B1一个类,A1到B2一个类,等,若是咱们要扩展了A和B ,要直接增长An类和Bn类,如此编写不说类内部重复性代码多,并且还会致使类结构的急剧膨胀,最重要的是,在经过继承实现路径的时候,会形成双方耦合性增大,而这又进一步加重了扩展的复杂性。使用桥结构模式能够很好地规避这些问题:重在解耦。


同系列文章:

相关文章
相关标签/搜索