设计模式之桥接模式
一、定义
桥梁模式是对象的结构模式。又称为柄体(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、坦克大战:
抽象化:都是坦克
实现化:行走、停止、发子弹情况都不一样
总而言之:抽象化就是找出他们的共同点