桥接模式

桥接模式

  • 动机: 由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个维度的变化
  • 将抽象部分(业务功能)与实现部分(平台实现)分离,使它们可以独立变化

代码例子

常见写法

1
2
3
4
5
6
7
8
9
10
abstract class Messager {
public abstract void login(String name);
public abstract void sendMessage(String msg);
public abstract void sendPicture(Image image);

public abstract void playSound();
public abstract void drawShape();
public abstract void connect();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//平台实现
abstract class PCMessagerBase extends Messager{
@Override
public abstract void playSound(){
//......
}
@Override
public abstract void drawShape();

@Override
public abstract void connect();
}

abstract class MobileMessagerBase extends Messager{
@Override
public abstract void playSound(){
//......
}
@Override
public abstract void drawShape();

@Override
public abstract void connect();
}
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//业务实现
class PCMessagerLite extends PCMessagerBase {
@Override
public void login(String name){
super.connect();
//.....
}

@Override
public void sendMessage(String msg){
super.drawShape();
//...
}

@Override
public void sendPicture(Image image){
super.drawShape();
//...
}
}

class PCMessagerPerfect extends PCMessagerBase {
@Override
public void login(String name){
super.playSound)();
//==================
super.connect();
//.....
}

@Override
public void sendMessage(String msg){
super.playSound)();
//==================
super.drawShape();
//...
}

@Override
public void sendPicture(Image image){
super.playSound)();
//==================
super.drawShape();
//...
}
}

class MobileMessagerLite extends MobileMessagerBase {
@Override
public void login(String name){
super.connect();
//.....
}

@Override
public void sendMessage(String msg){
super.drawShape();
//...
}

@Override
public void sendPicture(Image image){
super.drawShape();
//...
}
}

class MobileMessagerPerfect extends MobileMessagerBase {
@Override
public void login(String name){
super.playSound)();
//==================
super.connect();
//.....
}

@Override
public void sendMessage(String msg){
super.playSound)();
//==================
super.drawShape();
//...
}

@Override
public void sendPicture(Image image){
super.playSound)();
//==================
super.drawShape();
//...
}
}

桥接模式改良版本

  • 要点总结: Bridge模式使用”对象间的组合关系”解耦了抽象和现实之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化.一般应用在”两个非常强的变化维度”,有时一个类也有多余两个的变化维度,这时可以使用Bridge模式扩展.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    abstract class Messager {

    protected MessagerImpl msgImg;

    protected Messager(MessagerImpl msgImg){
    this.msgImg = msgImg;
    }

    public abstract void login(String name);
    public abstract void sendMessage(String msg);
    public abstract void sendPicture(Image image);
    }

    abstract class MessagerImpl {
    public abstract void playSound();
    public abstract void drawShape();
    public abstract void connect();
    }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//平台实现
abstract class PCMessagerImpl extends MessagerImpl{
@Override
public abstract void playSound(){
//......
}
@Override
public abstract void drawShape();

@Override
public abstract void connect();
}

abstract class MobileMessagerImple extends MessagerImpl{
@Override
public abstract void playSound(){
//......
}
@Override
public abstract void drawShape();

@Override
public abstract void connect();
}
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
43
44
45
46
47
//业务实现
class MessagerLite extends Messager {
@Override
public void login(String name){
msgImg.connect();
//.....
}

@Override
public void sendMessage(String msg){
msgImg.drawShape();
//...
}

@Override
public void sendPicture(Image image){
msgImg.drawShape();
//...
}
}

class MessagerPerfect extends Messager {
@Override
public void login(String name){
msgImg.playSound)();
//==================
msgImg.connect();
//.....
}

@Override
public void sendMessage(String msg){
msgImg.playSound)();
//==================
msgImg.drawShape();
//...
}

@Override
public void sendPicture(Image image){
msgImg.playSound)();
//==================
msgImg.drawShape();
//...
}
}