当前位置:首页>编程知识库>后端开发知识>设计模式是什么鬼(桥接)
设计模式是什么鬼(桥接)
阅读 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交流群
↓↓↓
看完本文有收获?请转发分享给更多人
以上数据来源于网络,如有侵权,请联系删除。
评论 (0)