假设你要设计一个系统,该系统可以根据选择,创造不同颜色的各种图形。在没有学习桥接模式前,我的想法一定会是在一个抽象类(比方说叫graph)下派生各种子类(比方说RedRectangle之类的)。虽然在设计时候会很简单,但是一来这会导致产生大量的子类。(比方说有m种图形,n种颜色,那就要有m*n个子类)二来会给代码阅读以及代码维护、功能扩展(比方说直接对graph做扩展)带来巨大的不便。
因此很自然地想到,如果把图形(抽象)和颜色(产生实例)分开来写,这样就大大降低了类的数量。同时可以分别对这两者进行功能扩展而不互相影响
1、什么是桥接模式
桥接模式的定义:将抽象(类的功能层次结构)和实现(类的实现层次结构)分离,使它们可以独立变化。以组合关系代替了继承关系,降低了功能层次结构和实现按层次结构的耦合度。
所谓桥接模式其实就是构建一个桥将图形的类型(类的功能层次结构)和颜色(类的实现层次结构)连接在一起。而要想了解桥接模式就要先了解这个桥连接的两端是什么。
下面引用《图形设计模式》里的解释
类的功能层次结构:
父类具有基本功能(这是一个什么图形)
在子类中添加新的功能(图形的边是弯曲的、图形的边是虚线的)
类的实现层次结构:
父类通过声明定义接口
子类通过实现具体方法来实现接口
2、角色定义
抽象功能:类的功能层次结构的最上层。(可以通过扩展新的功能来完善功能层次结构)
实现者:类的实现层次结构的最上层。
具体实现者:实现实现者中的各个接口。
3、代码呈现
以不同颜色的图形举例。
步骤一:创建实现者
interface Color{
String getColor();
}
步骤二:创建具体实现者
class Red implements Color{ 实现接口功能
public String getColor() {
return "Red";
}
}
class Orange implements Color{ 实现接口功能
public String getColor() {
return "Orange";
}
}
步骤三:创建抽象功能
abstract class Shape{
Color color;
public void setColor(Color color) {
this.color = color;
}
public abstract String getName();
}
其中实现桥接的部分
Color color;
public void setColor(Color color) {
this.color = color;
}
步骤四:扩展抽象功能
class Rectangle extends Shape{ 实现创建三角形功能
public String getName() {
return color.getColor()+"Rectangle";将颜色与图形对接
}
}
class Circle extends Shape{ 实现创建圆形功能
public String getName() {
return color.getColor()+"Circle";将颜色与图形对接
}
}
测试
public class Bridge {
public static void main(String[] args) {
// TODO Auto-generated method stub
Red red = new Red();
Orange orange = new Orange();
Rectangle rectangle = new Rectangle();
Circle circle = new Circle();
rectangle.setColor(red);
System.out.println(rectangle.getName());
circle.setColor(orange);
System.out.println(circle.getName());
}
}
RedRectangle
OrangeCircle
4、总结
桥接模式特别适用于一个类存在两个独立变化维度的情景,通过分离抽象功能与实现,能方便的扩展这两个维度的功能。但是设计难点也恰恰在于此,需要设计者能很好判断这个事物是否具有两个独立维度,以及是哪两个维度。桥接模式增加了理解与设计的难度。