基础编程学习快乐每一天
首页
留言
Siddim.com
当前位置:
首页
>
编程知识库
>
后端开发知识
>
设计模式是什么鬼(桥接)
设计模式是什么鬼(桥接)
阅读
1
2018-12-10
//本文作者:凸凹里歐
//本文收录菜单栏:《设计模式是什么鬼》专栏中
要致富先修路,一说到路啊桥啊我们就想到它的重要性,它可以把本是相对孤立的经济体连接起来,使得双边贸易往来更加便利,经济合作更加高效。桥接,用桥梁连接,英文叫
Bridge
,其实就是桥梁之意。
现在假设我们要作一幅抽象画,用各种形状的色块来表达世界文化的多样性,起名《形形色色》。
需要什么工具来作画呢?一堆彩笔和一堆尺子。嗯,据我所知,这两种工具分别产于两个孤岛,北岛有很多颜料,擅长制造画笔,南岛则擅长生产尺子,各种形状的尺子,这是劳动分工的最佳典范,下来我们就要去促进南北文具经济合作了,先来看看南岛生产的尺子产品。
这些尺子不管是什么形状,其实都是对绘画线条提供一种规范,那我们就先定义一个尺子的接口,用于规则化笔触的走向。
1public
%
20interface
%
20Ruler
%
20
%
7B
//%
20
%
E5
%
B0
%
BA
%
E5
%
AD
%
90
%
0A2
%
20
%
20
%
20
%
20
//%
20
%
E8
%
A7
%
84
%
E5
%
88
%
99
%
E5
%
8C
%
96
%
E7
%
AC
%
94
%
E8
%
A7
%
A6
%
E8
%
B5
%
B0
%
E5
%
90
%
91
%
0A3
%
20
%
20
%
20
%
20public
%
20void
%
20regularize
();%
0A4
%
7D
%
0A
对于具体的尺子类,我们暂且忽略其大小,一种形状就对应一个类,分别是方形、三角形、还有圆形,它们统统实现尺子的规则接口。
1public
%
20class
%
20SquareRuler
%
20implements
%
20Ruler
%
20
%
7B
%
0A2
%
0A3
%
20
%
20
@
Override
%
0A4
%
20
%
20public
%
20void
%
20regularize
()%
20
%
7B
//%
E5
%
B0
%
BA
%
E5
%
AD
%
90
%
E6
%
A8
%
A1
%
E6
%
9D
%
BF
%
E7
%
94
%
BB
%
E5
%
87
%
BA
%
E6
%
AD
%
A3
%
E6
%
96
%
B9
%
E5
%
BD
%
A2
%
0A5
%
20
%
20
%
20
%
20System
.
out
.
println
(%
22
%
E2
%
96
%
A1
%
22
);%
0A6
%
20
%
20
%
7D
%
0A7
%
0A8
%
7D
%
0A
1public
%
20class
%
20TriangleRuler
%
20implements
%
20Ruler
%
20
%
7B
%
0A2
%
0A3
%
20
%
20
@
Override
%
0A4
%
20
%
20public
%
20void
%
20regularize
()%
20
%
7B
//%
E5
%
B0
%
BA
%
E5
%
AD
%
90
%
E6
%
A8
%
A1
%
E6
%
9D
%
BF
%
E7
%
94
%
BB
%
E5
%
87
%
BA
%
E4
%
B8
%
89
%
E8
%
A7
%
92
%
E5
%
BD
%
A2
%
0A5
%
20
%
20
%
20
%
20System
.
out
.
println
(%
22
%
E2
%
96
%
B3
%
22
);%
0A6
%
20
%
20
%
7D
%
0A7
%
0A8
%
7D
%
0A
1public
%
20class
%
20CircleRuler
%
20implements
%
20Ruler
%
20
%
7B
%
0A2
%
0A3
%
20
%
20
@
Override
%
0A4
%
20
%
20public
%
20void
%
20regularize
()%
20
%
7B
//%
E5
%
B0
%
BA
%
E5
%
AD
%
90
%
E6
%
A8
%
A1
%
E6
%
9D
%
BF
%
E7
%
94
%
BB
%
E5
%
87
%
BA
%
E5
%
9C
%
86
%
E5
%
BD
%
A2
%
0A5
%
20
%
20
%
20
%
20System
.
out
.
println
(%
22
%
E2
%
97
%
8B
%
22
);%
0A6
%
20
%
20
%
7D
%
0A7
%
0A8
%
7D
%
0A
南岛经济很简单,下来看北岛产品,他们生产的是五颜六色的彩色画笔。
我们对画笔进行抽象,此处我们用抽象类。
%
201public
%
20abstract
%
20class
%
20Pen
%
20
%
7B
//%
E7
%
94
%
BB
%
E7
%
AC
%
94
%
0A
%
202
%
0A
%
203
%
20
%
20protected
%
20Ruler
%
20ruler
;//%
E5
%
B0
%
BA
%
E5
%
AD
%
90
%
E7
%
9A
%
84
%
E5
%
BC
%
95
%
E7
%
94
%
A8
%
0A
%
204
%
0A
%
205
%
20
%
20public
%
20Pen
(
Ruler
%
20ruler
)%
20
%
7B
%
0A
%
206
%
20
%
20
%
20
%
20this
.
ruler
%
20
=%
20ruler
;%
0A
%
207
%
20
%
20
%
7D
%
0A
%
208
%
0A
%
209
%
20
%
20public
%
20abstract
%
20void
%
20draw
();//%
E6
%
8A
%
BD
%
E8
%
B1
%
A1
%
E6
%
96
%
B9
%
E6
%
B3
%
95
%
0A10
%
7D
%
0A
注意这里的抽象画笔(第
3
行)引用了尺子接口,并且声明为
protected
,得以让彩笔子类进行继承,并由第
5
行构造子注入尺子,此处便是桥梁对接的重点。最后就是第
9
行的
draw
方法了,这个需要具体的彩笔子类进行实现。
接下来看彩笔类,我们依旧保持简约,只实现黑色和白色两种画笔。
%
201public
%
20class
%
20BlackPen
%
20extends
%
20Pen
%
20
%
7B
%
0A
%
202
%
0A
%
203
%
20
%
20public
%
20BlackPen
(
Ruler
%
20ruler
)%
20
%
7B
%
0A
%
204
%
20
%
20
%
20
%
20super
(
ruler
);%
0A
%
205
%
20
%
20
%
7D
%
0A
%
206
%
0A
%
207
%
20
%
20
@
Override
%
0A
%
208
%
20
%
20public
%
20void
%
20draw
()%
20
%
7B
%
0A
%
209
%
20
%
20
%
20
%
20
%
20
%
20System
.
out
.
print
(%
22
%
E9
%
BB
%
91
%
22
);%
0A10
%
20
%
20
%
20
%
20
%
20
%
20ruler
.
regularize
();%
0A11
%
20
%
20
%
7D
%
0A12
%
0A13
%
7D
%
0A
%
201public
%
20class
%
20WhitePen
%
20extends
%
20Pen
%
20
%
7B
%
0A
%
202
%
0A
%
203
%
20
%
20public
%
20WhitePen
(
Ruler
%
20ruler
)%
20
%
7B
%
0A
%
204
%
20
%
20
%
20
%
20super
(
ruler
);%
0A
%
205
%
20
%
20
%
7D
%
0A
%
206
%
0A
%
207
%
20
%
20
@
Override
%
0A
%
208
%
20
%
20public
%
20void
%
20draw
()%
20
%
7B
%
0A
%
209
%
20
%
20
%
20
%
20
%
20
%
20System
.
out
.
print
(%
22
%
E7
%
99
%
BD
%
22
);%
0A10
%
20
%
20
%
20
%
20
%
20
%
20ruler
.
regularize
();%
0A11
%
20
%
20
%
7D
%
0A12
%
0A13
%
7D
%
0A
我们在第
4
行的构造子中调用了抽象画笔的构造子注入传入的尺子,建立桥梁的连接,在第
9
行选用自己的颜色进行绘画并于第
10
行调用尺子进行笔触规范。一切就绪,我们开始绘制史诗巨著。
%
201public
%
20class
%
20Client
%
20
%
7B
%
0A
%
202
%
0A
%
203
%
20
%
20
%
20
%
20public
%
20static
%
20void
%
20main
(
String
%
20args
%
5B
%
5D
)%
20
%
7B
%
0A
%
204
%
0A
%
205
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
//%
E7
%
99
%
BD
%
E8
%
89
%
B2
%
E7
%
94
%
BB
%
E7
%
AC
%
94
%
E5
%
AF
%
B9
%
E5
%
BA
%
94
%
E7
%
9A
%
84
%
E6
%
89
%
80
%
E6
%
9C
%
89
%
E5
%
BD
%
A2
%
E7
%
8A
%
B6
%
0A
%
206
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20new
%
20WhitePen
(
new
%
20CircleRuler
()).
draw
();%
0A
%
207
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20new
%
20WhitePen
(
new
%
20SquareRuler
()).
draw
();%
0A
%
208
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20new
%
20WhitePen
(
new
%
20TriangleRuler
()).
draw
();%
0A
%
209
%
0A10
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
//%
E9
%
BB
%
91
%
E8
%
89
%
B2
%
E7
%
94
%
BB
%
E7
%
AC
%
94
%
E5
%
AF
%
B9
%
E5
%
BA
%
94
%
E7
%
9A
%
84
%
E6
%
89
%
80
%
E6
%
9C
%
89
%
E5
%
BD
%
A2
%
E7
%
8A
%
B6
%
0A11
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20new
%
20BlackPen
(
new
%
20CircleRuler
()).
draw
();%
0A12
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20new
%
20BlackPen
(
new
%
20SquareRuler
()).
draw
();%
0A13
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20new
%
20BlackPen
(
new
%
20TriangleRuler
()).
draw
();%
0A14
%
0A15
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
/*%
E8
%
BF
%
90
%
E8
%
A1
%
8C
%
E7
%
BB
%
93
%
E6
%
9E
%
9C
%
EF
%
BC
%
9A
%
0A16
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E7
%
99
%
BD
%
E2
%
97
%
8B
%
0A17
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E7
%
99
%
BD
%
E2
%
96
%
A1
%
0A18
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E7
%
99
%
BD
%
E2
%
96
%
B3
%
0A19
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E9
%
BB
%
91
%
E2
%
97
%
8B
%
0A20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E9
%
BB
%
91
%
E2
%
96
%
A1
%
0A21
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E9
%
BB
%
91
%
E2
%
96
%
B3
%
0A22
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
*/%
0A23
%
20
%
20
%
20
%
20
%
7D
%
0A24
%
0A25
%
7D
%
0A
注意看我们是怎样进行实例化的,初始化彩笔确定其颜色并注入并确定其形状,紧接着画出来的就是相应的形色组合了。简单吧?接下来就交给南北岛的工人们去做各种形状的尺子和颜色的画笔了,画家会利用这些工具随意组合创作出自己想要的画作。
注意,上图只画出了红色和形状的组合,其他颜色亦是如此,其中
7
种颜色以及
5
种形状的组合就达到了
35
种,而此处我们只需要
7
5
个类便可以实现。试想如果有更多的颜色和形状,且没有这种松散分离的结构要多少个类来实现?那将会是一场噩梦。有没有发现这就是笛卡儿积的组合,来看我们的代码中的两个集合:
颜色集合={黑,白}
形状集合={圆形,方形,三角}
那么这两个集合的笛卡尔积为
(黑,圆形), (黑,方形), (黑,三角),
(白,圆形), (白,方形), (白,三角)
我们发现这个结构是不是有点像策略模式?其实策略更强调的是行为的替换,就像是之前例子中我们可以随意替换
USB
接口上接入的各种设备而改变输入输出行为,那对于宿主(电脑主机)本身是耦合了
USB
接口的,我们无法进行替换,只能重新写个全新的宿主并重新焊接
USB
接口了。但对于桥接模式而言,它巧妙运用了抽象类(抽象画笔类)植入接口(尺子接口),这样我们不但能替换各种形状的尺子实现类,还能替换各种颜色的画笔子类,这就是对抽象、实现的双边解耦、分离、脱钩。
劳动分工实现了工种的无限的扩展,经济合作则促进了双边组合的无限可能,桥梁作为经济合作发展的纽带不可或缺,一带一路的大战略,扩展靠经济带,连接靠路桥。
点击图片加入
Spring
交流群
↓↓↓
看完本文有收获?请转发分享给更多人
以上数据来源于网络,如有侵权,请联系删除。
上一篇:
19张图带你梳理SpringCloud体系中的重要知识点!
下一篇:
敲黑板,也来谈如何设计一个秒杀系统(重点)
评论
(0)
提交
类别
基础编程学习
HTML
PHP
Python
编程知识库
后端开发知识
热门文章
Java并发中的同步容器与并发容器,你了解多少?
Innodb中的事务隔离级别和锁的关系,难倒一半面试者!
SpringBoot + minio实现分片上传、秒传、续传
面试官:你知道消息队列如何保证数据不丢失吗?
JAVA知识 Java8新特性
面试官:谈谈为什么要限流,有哪些限流方案?
说说动态代理与静态代理区别
面试官:思考Tomcat 类加载器为什么要违背双亲委派模型?
boot-admin 基于SpringBoot的后台权限管理系统,可作为脚手架,用于快速搭建项目
SpringBoot+Vue+App+硬件实现智能家居系统项目