1. 桥接模式概述
概念
- 将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体模式或接口模式。桥接模式主要用于两个或多个同等级的接口
- 如果一个对象有两种或者多种分类方式,并且两种分类方式都容易变化,此时使用继承很容易造成子类越来越多,所以更好的做法是把这种分类方式分离出来,让它们独立变化,使用时将不同的分类进行组合即可
特点
- 合成/聚合复用原则:优先使用合成/聚合,而不是类继承
- 继承虽然是面向对象的三大特性之一,但继承会导致子类与父类有非常紧密的依赖关系,它会限制子类的灵活性和子类的复用性。而使用合成/聚合,也就是使用接口实现的方式,就不存在依赖问题,一个类可以实现多个接口,可以很方便地拓展功能
Demo
接口类 Color,仅包含一个获取颜色的方法
1
2
3public interface IColor {
String getColor();
}每种颜色都实现此接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30public class Red implements IColor {
public String getColor() {
return "红";
}
}
public class Blue implements IColor {
public String getColor() {
return "蓝";
}
}
public class Yellow implements IColor {
public String getColor() {
return "黄";
}
}
public class Green implements IColor {
public String getColor() {
return "绿";
}
}在每个形状类中,桥接 IColor 接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43class Rectangle implements IShape {
private IColor color;
void setColor(IColor color) {
this.color = color;
}
public void draw() {
System.out.println("绘制" + color.getColor() + "矩形");
}
}
class Round implements IShape {
private IColor color;
void setColor(IColor color) {
this.color = color;
}
public void draw() {
System.out.println("绘制" + color.getColor() + "圆形");
}
}
class Triangle implements IShape {
private IColor color;
void setColor(IColor color) {
this.color = color;
}
public void draw() {
System.out.println("绘制" + color.getColor() + "三角形");
}
}测试函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14@Test
public void drawTest() {
Rectangle rectangle = new Rectangle();
rectangle.setColor(new Red());
rectangle.draw();
Round round = new Round();
round.setColor(new Blue());
round.draw();
Triangle triangle = new Triangle();
triangle.setColor(new Yellow());
triangle.draw();
}- 抽象部分指的是父类,对应本例中的形状类,实现部分指的是不同子类的区别之处
- 将子类的区别之处,即本例中的颜色,分离成接口,通过组合的方式桥接颜色和形状,这就是桥接模式