设计模式之桥接模式

一、定义

桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者独立的变化”。

二、桥梁模式的用意

桥梁模式虽然不是一个使用频率很高的模式,但是熟悉这个模式对于理解面向对象的设计原则,包括“开-闭”原则以及组合/聚合复用原则都很有帮助,理解好这两个原则,有助于形成正确的设计思想和培养良好的设计风格。

桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者独立的变化”。这句话很短,但是第一次读到这句话的人很可能都会思考良久而不得其解。

这句话有三个关键词,也就是抽象化、实现化和脱耦。理解这三个词所代表的概念是理解桥梁模式用意的关键。

抽象化

从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征,就是抽象化。要抽象,就必须进行比较,没有比较就无法找到在本质上共同的部分。共同特征是指那些能把一类事物与他类事物分开来的特征,这些具有区分作用的特征又称为本质特征。因此抽取事物的共同特征就是抽取事物的本质特征,舍弃非本质的特征。所以抽象化的过程也是一个裁剪的过程。在抽象时,同与不同,决定于从什么角度上来抽象。抽象的角度决定于分析问题的目的。

通常情况下,一组对象如果具有相同的特征,那么它们就可以通过一个共同的类来描述。如果一些类具有相同的特征,往往可以通过一个共同的抽象类来描述。

实现化

抽象化给出的具体实现,就是实现化。

一个类的实例就是这个类的实例化,一个具体子类就是它的抽象超类的实例化。

脱耦

所谓耦合,就是两个实体的行为的某种强关联。而将它们的强关联去掉,就是耦合的脱耦。在这里,脱耦是指将抽象化和实例化之间的耦合解脱开,或者是将它们之间的强关联改成弱关联。

所谓强关联,就是在编译时期已经确定的,无法在运行时期动态改变的关联;所谓弱关联,就是可以动态确定并且可以在运行时期动态改变的关联。显然,在java语言中,继承关系是强关联,而聚合关系是弱关联。

将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联,因此,桥梁模式中的所谓脱耦,就是指在一个软件系统中的抽象化和实现化之间使用聚合关系,而不是继承关系,从而使两者可以相对对立的变化。

这就是桥梁模式的用意。

三、分析为什么用桥梁模式

    假如有三种水果:苹果、香蕉、橘子 ,颜色有两种:红、黄。这样组合就有3 * 2 = 6种,也就是说要写六个类来构建六种水果,分别是红苹果、黄苹果、红香蕉、黄香蕉、红橘子、黄橘子六种,但是随着引进了新的水果种类这样说过种类会乘爆炸性的增长,自然写的徐璈写的类就曾多了;但如果我们使用桥梁设计模式,这样我们只需要写3 + 2  = 5 个实现类就行了,现在看起来6种和5种差别不大,但是随着种类增多 m * n 和 m + n 差别就相差太多了,然后我们说说为什么要用3 + 2 ,刚开始我们就讲了桥梁模式,就是实现抽象化和实现化分开进行解耦,抽象化就是三种水果都是水果,实现化就是颜色


四、结构图

设计模式之桥接模式

五、实例源码

抽象类:

public abstract class Shape {


private Drawing drawing;


public Shape(Drawing drawing){
this.drawing = drawing;
}

public void doDraw(String message) {
drawing.draw(message);
}

}

实现接口:

public interface Drawing {
    //使用不同方式画法
public void draw(String message);

}

抽象类的实现类:

public class Circle extends Shape{


public Circle(Drawing drawing) {
super(drawing);
}


@Override
public void doDraw(String message) {
message  = "想要画圆" + message;
super.doDraw(message);
}

}




public class Trangle extends Shape{


public Trangle(Drawing drawing) {
super(drawing);
}


@Override
public void doDraw(String message) {
message  = "想要三角形" + message;
super.doDraw(message);
}

}


抽象类的实现:

public class Drawing1 implements Drawing{


@Override
public void draw(String message) {
System.out.println( message + ":使用第一种画法");
}


}

六、桥梁模式应用场景

程序中有两个可变的因素时可以试着使用

1、发送消息:

       抽象化:普通消息、紧急消息

       实现化:通过手机发送短信的方式、系统自带的发送方式

2、坦克大战:

     抽象化:都是坦克

     实现化:行走、停止、发子弹情况都不一样

 总而言之:抽象化就是找出他们的共同点