文章目录
一、简介
1.1 问题引入
假如我们有一个几何类,从它扩展出两个子类:圆形和方形,现在我们需要为这些几何子类添加颜色,所以需要为圆形类和方形类都添加红色和蓝色的颜色子类。当我们添加一个三角形类时,就需要为三角形类添加所有已存在的颜色子类。
假设我们已经有了多个颜色子类,现在需要添加一个新的的形状,那么就需要为这个新的形状类添加所有的颜色子类,这会造成类爆炸。
1.2 定义
桥接模式:桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化
- 桥接模式是一种对象结构型模式,又称为柄体模式或接口模式
- 桥接模式用抽象关联的方式取代传统的多层继承关系,巧妙的解决了多层继承存在的问题,使得系统更加灵活,易于拓展,同时有效的控制系统中类的个数
利用桥接模式,将形状和颜色分离,在增加新的形状或颜色时,不需要再为它添加新的子类
二、模式原理
2.1 模式组成
组成(角色) | 作用 |
---|---|
Abstraction(抽象) | 是一个抽象类,含有Implementor声明的变量,用来维护一个Implementor类型的对象 |
Refined Abstraction(细化抽象) | 细化抽象通常是具体的类,他是Abstraction的子类,该子类重写父类中的抽象方法 |
Implementor(实现者) | 它是一个接口,负责提供基本操作,而Abstraction类负责定义基于这些基本操作的较高层次操作 |
Concrete Implementor(具体实现者) | 它是Implementor的子类,用于具体实现Implementor接口的类 |
2.2 UML类图
三、实例
3.1 实例概况
- 利用桥接模式创建一个几何类,形状包括:圆形和方形,颜色包括:红色和蓝色
3.2 步骤
- 步骤一:创建Implementor实现者接口
public interface Color {
public abstract void showColor();
}
步骤二:创建具体实现者类,由具体实现者类实现Implementor接口中的方法
//具体实现者类-红色
public class Red implements Color{
public void showColor() {
System.out.println("我是red");
}
}
//具体实现者类-蓝色
public class Blue implements Color{
public void showColor() {
System.out.println("我是blue");
}
}
- 步骤三:创建抽象角色,通过聚合的方式,将接口变量的声明聚合到抽象类中
//抽象角色
public abstract class Shape {
Color color;
public Shape(Color color){
this.color = color;
}
public abstract void show();
}
步骤四:创建细化抽象角色,并且继承抽象父类
//细化抽象角色
public class Circle extends Shape {
public Circle(Color color) {
super(color); //调用父类Shape的构造方法,这里的color一般传的都是接口的子类
}
public void show() {
super.color.showColor();
System.out.println("我是圆形");
}
}
//细化抽象角色
public class Square extends Shape{
public Square(Color color){
super(color); //调用父类Shape的构造方法,这里的color一般传的都是接口的子类
}
public void show() {
super.color.showColor();
System.out.println("我是方形");
}
}
- 步骤五:实现不同形状和颜色的几何图形的实例创建
public class Client {
public static void main(String[] args) {
//红色圆形
Color color = new Red();
Shape shape = new Circle(color);
shape.show();
System.out.println("---------------");
//红色方形
Shape shape2 = new Square(color);
shape2.show();
System.out.println("---------------");
//蓝色圆形
Color color2 = new Blue();
shape = new Circle(color2);
shape.show();
System.out.println("---------------");
//蓝色方形
shape2 = new Square(color2);
shape2.show();
}
}
//执行结果
我是red
我是圆形
---------------
我是red
我是方形
---------------
我是blue
我是圆形
---------------
我是blue
我是方形
3.3 UML类图
四、优缺点
4.1 优点
- 桥接模式分离抽象和实现,使抽象和现实可以独立的扩展
- 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法
- 增加新的具体实现者,不需要修改细化抽象,同理,增加新的细化抽象也不需要修改具体实现者。它们之间不会相互影响,满足开闭原则
- 实现细节对客户透明,细节的实现已经由抽象层通过聚合关系完成了封装
4.2 缺点
- 桥接模式的引入会增加系统的理解与设计难度,由于聚合关系建立在抽象层,要求开发者针对抽象进行设计与编程。
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
- 对高内聚的类使用桥接模式可能会让代码更加复杂化
五、应用场景
- 如果一个系统需要在抽象角色和具体角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系。
- "抽象部分"和"实现部分"可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
- 一个类存在两个或多个独立变化的维度,且这两个或多个维度都需要独立进行扩展。
- 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时,桥接模式尤为适用。