设计模式之桥接模式

设计模式之桥接模式

目的在于将抽象与其实现分离,以便两者可以独立变化。独立变化的同时能够根据抽象类的对象关联从而能够将两个继承结构联动起来。就像在两个结构之间建立个桥梁一样进行通信,所以叫桥接模式。

应用场景

  1. 如果想避免抽象类与实现的永久绑定,可以在运行时间选择和切换实现类。
  2. 抽象类和接口都应该通过子类来进行拓展,在桥接模式中,可以使用子类来进行组合的同时能够独立拓展他们。
  3. 接口的实现的变化对客户端无影响。
  4. 如果想要在多个对象类中共享实现,并且避免让客户端感知到。

桥接模式结构图

桥接模式

代码

主要分为四部分,1.抽象类 2.抽象实现类 3.接口类 4.接口实现类

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

// 抽象类与抽象实现类

public abstract class Shape {

Colors colors;

Shape(Colors colors) {
this.colors = colors;
}

public abstract void buildShape();
}

// 圆形实现类
public class ShapeCircle extends Shape {

public ShapeCircle(Colors colors) {
super(colors);
}

@Override
public void buildShape() {
System.out.println("\n first step : build circle\n and second step:");
colors.paint();
}
}
//方形实现类
public class ShapeSquare extends Shape {
public ShapeSquare (Colors colors) {
super(colors);
}

@Override
public void buildShape() {
System.out.println("\n first step : build Square\n and second step:");
colors.paint();
}
}

抽象方法中引用了Colors类变量,使用实现类中的buildShape方法实现具体功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public interface Colors {
public void paint();
}

public class ColorBlue implements Colors {
@Override
public void paint() {
System.out.println(" print blue !!");
}
}

public class ColorRed implements Colors {
@Override
public void paint() {
System.out.println(" paint inner with red !!");
}
}

通过使用Color接口,实现类实现Colors中的paint方法实现Color

1
2
3
4
5
6
7
8
public class App {
public static void main(String[] args) {
Shape circle = new ShapeCircle(new ColorBlue());
circle.buildShape();
Shape square = new ShapeSquare(new ColorRed());
square.buildShape();
}
}
1
2
3
4
5
6
7
8
9
结果:

first step : build circle
and second step:
print blue !!

first step : build Square
and second step:
paint red !!

上面的例子中,颜色和图形是两个独立不同的维度,两个可以分别变化。将两个维度设计为两个不同的继承的结构,在两个结构之间使用在抽象类中的关联来达到链接的目的,这个链接成为两个继承结构通信的桥梁。所以为桥接模式。

-------------本文结束感谢您的阅读-------------

本文标题:设计模式之桥接模式

文章作者:NanYin

发布时间:2019年06月03日 - 12:06

最后更新:2019年08月12日 - 13:08

原始链接:https://nanyiniu.github.io/2019/06/03/2019-06-03-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E6%A1%A5%E6%8E%A5%E6%A8%A1%E5%BC%8F/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。