JAVA设计模式什么鬼(桥接)——作者:凸凹里歐
要致富先修路,一说到路啊桥啊我们就想到它的重要性,它可以把本是相对孤立的经济体连接起来,使得双边贸易往来更加便利,经济合作更加高效。桥接,用桥梁连接,英文叫Bridge,其实就是桥梁之意。
现在假设我们要作一幅抽象画,用各种形状的色块来表达世界文化的多样性,起名《形形色色》。
需要什么工具来作画呢?一堆彩笔和一堆尺子。嗯,据我所知,这两种工具分别产于两个孤岛,北岛有很多颜料,擅长制造画笔,南岛则擅长生产尺子,各种形状的尺子,这是劳动分工的最佳典范,下来我们就要去促进南北文具经济合作了,先来看看南岛生产的尺子产品。
这些尺子不管是什么形状,其实都是对绘画线条提供一种规范,那我们就先定义一个尺子的接口,用于规则化笔触的走向。
1 public interface Ruler {// 尺子
2 // 规则化笔触走向
3 public void regularize();
4 }
对于具体的尺子类,我们暂且忽略其大小,一种形状就对应一个类,分别是方形、三角形、还有圆形,它们统统实现尺子的规则接口。
1 public class SquareRuler implements Ruler {
2
3 @Override
4 public void regularize() {//尺子模板画出正方形
5 System.out.println("□");
6 }
7
8 }
1 public class TriangleRuler implements Ruler {
2
3 @Override
4 public void regularize() {//尺子模板画出三角形
5 System.out.println("△");
6 }
7
8 }
1 public class CircleRuler implements Ruler {
2
3 @Override
4 public void regularize() {//尺子模板画出圆形
5 System.out.println("○");
6 }
7
8 }
南岛经济很简单,下来看北岛产品,他们生产的是五颜六色的彩色画笔。
我们对画笔进行抽象,此处我们用抽象类。
1 public abstract class Pen {//画笔23 protected Ruler ruler;//尺子的引用45 public Pen(Ruler ruler) {6 this.ruler = ruler;7 }89 public abstract void draw();//抽象方法
10 }
注意这里的抽象画笔(第3行)引用了尺子接口,并且声明为protected,得以让彩笔子类进行继承,并由第5行构造子注入尺子,此处便是桥梁对接的重点。最后就是第9行的draw方法了,这个需要具体的彩笔子类进行实现。
接下来看彩笔类,我们依旧保持简约,只实现黑色和白色两种画笔。
1 public class BlackPen extends Pen {23 public BlackPen(Ruler ruler) {4 super(ruler);5 }67 @Override8 public void draw() {9 System.out.print("黑");
10 ruler.regularize();
11 }
12
13 }
1 public class WhitePen extends Pen {23 public WhitePen(Ruler ruler) {4 super(ruler);5 }67 @Override8 public void draw() {9 System.out.print("白");
10 ruler.regularize();
11 }
12
13 }
我们在第4行的构造子中调用了抽象画笔的构造子注入传入的尺子,建立桥梁的连接,在第9行选用自己的颜色进行绘画并于第10行调用尺子进行笔触规范。一切就绪,我们开始绘制史诗巨著。
1 public class Client {23 public static void main(String args[]) {45 //白色画笔对应的所有形状6 new WhitePen(new CircleRuler()).draw();7 new WhitePen(new SquareRuler()).draw();8 new WhitePen(new TriangleRuler()).draw();9
10 //黑色画笔对应的所有形状
11 new BlackPen(new CircleRuler()).draw();
12 new BlackPen(new SquareRuler()).draw();
13 new BlackPen(new TriangleRuler()).draw();
14
15 /*运行结果:
16 白○
17 白□
18 白△
19 黑○
20 黑□
21 黑△
22 */
23 }
24
25 }
注意看我们是怎样进行实例化的,初始化彩笔确定其颜色并注入并确定其形状,紧接着画出来的就是相应的形色组合了。简单吧?接下来就交给南北岛的工人们去做各种形状的尺子和颜色的画笔了,画家会利用这些工具随意组合创作出自己想要的画作。
注意,上图只画出了红色和形状的组合,其他颜色亦是如此,其中7种颜色以及5种形状的组合就达到了35种,而此处我们只需要7+5个类便可以实现。试想如果有更多的颜色和形状,且没有这种松散分离的结构要多少个类来实现?那将会是一场噩梦。有没有发现这就是笛卡儿积的组合,来看我们的代码中的两个集合:
颜色集合={黑,白}
形状集合={圆形,方形,三角}
那么这两个集合的笛卡尔积为
{
(黑,圆形), (黑,方形), (黑,三角),
(白,圆形), (白,方形), (白,三角)
}
我们发现这个结构是不是有点像策略模式?其实策略更强调的是行为的替换,就像是之前例子中我们可以随意替换USB接口上接入的各种设备而改变输入输出行为,那对于宿主(电脑主机)本身是耦合了USB接口的,我们无法进行替换,只能重新写个全新的宿主并重新焊接USB接口了。但对于桥接模式而言,它巧妙运用了抽象类(抽象画笔类)植入接口(尺子接口),这样我们不但能替换各种形状的尺子实现类,还能替换各种颜色的画笔子类,这就是对抽象、实现的双边解耦、分离、脱钩。
劳动分工实现了工种的无限的扩展,经济合作则促进了双边组合的无限可能,桥梁作为经济合作发展的纽带不可或缺,一带一路的大战略,扩展靠经济带,连接靠路桥。
JAVA设计模式什么鬼(桥接)——作者:凸凹里歐相关推荐
- JAVA设计模式什么鬼(备忘录)——作者:凸凹里歐
备忘录,备份曾经发生过的历史记录,以防忘记,之后便可以轻松回溯过往.想必我们曾经都干过很多蠢事导致糟糕的结果,当后悔莫及的时候已经是覆水难收了,只可惜这世界上没有后悔药,事后我们能做的只能去弥补过失, ...
- JAVA设计模式什么鬼(策略)——作者:凸凹里歐
策略,Strategy,古时也称"计",为了达成某个目标的方案,目标不同,方案也随之更改.例如特工执行任务时总要准备好几套方案以应对突如其来的变化,A计划实施过程中情况突变导致预案 ...
- JAVA设计模式什么鬼(状态)——作者:凸凹里歐
状态State,指某事物所处的状况或形态,比如水的三态,零下会变成固态冰,常温会是液态水,100℃会蒸发成气态的水蒸气. 在这个地球生态系统中,水的总量并不会增加,也不会减少,只是随着温度的变化其分子 ...
- JAVA设计模式什么鬼(代理)——作者:凸凹里歐
代理,代表打理,以他人的名义代表委托人打理其本职工作之外或不所能及的事务,达成合作关系并更高效地促成事务完成的目的.例如明星经纪人,他们并没有像明星一样会唱歌.跳舞或演戏,而是替明星打理一些无暇顾及的 ...
- JAVA设计模式什么鬼(初探)——作者:凸凹里歐
有物混成,先天地生.寂兮寥兮,独立而不改,周行而不殆,可以为天地母.吾不知其名,字之曰道,强为之名曰大.大曰逝,逝曰远,远曰反. 道是什么?道可道,非常道.道不明,说不尽的才算是道,它是自然法则的终极 ...
- JAVA设计模式什么鬼(适配器)——作者:凸凹里歐
我们这个世界,充满着千奇百怪的对象,更有趣的是对象与对象间是存在着互动,沟通,这样世界才变得美妙.那到底是怎样互动呢?靠什么才能互动呢?是的,接口.比如你和朋友一起喝茶聊天,我们暂且不管声带,耳膜这些 ...
- JAVA设计模式什么鬼(装饰)——作者:凸凹里歐
装饰,在某物件基础上加以修饰,装点,使得原本的朴素变得华丽,达到化腐朽为神奇的效果.比如我们从开发商买来的毛坯房,必然要进行室内装潢这么一项工程,什么简约风啊,北欧风啊,地中海,美式中式等等,当然萝卜 ...
- JAVA设计模式什么鬼(模板方法)——作者:凸凹里歐
面向对象,是对事物属性与行为的封装,方法,指的就是行为.模板方法,显而易见是说某个方法充当了模板的作用,其充分利用了抽象类虚实结合的特性,虚部抽象预留,实部固定延续,以达到将某种固有行为延续至子类的目 ...
- JAVA设计模式什么鬼(门面)——作者:凸凹里歐
开门见山,门,建筑物的入口,面,脸也.门面(Facade),通常指店铺的门头外表部分,当然一定要临街才是好的商铺,在人流量大的地方营造更好的视觉冲击,这样会有更多等等机会暴露给潜在顾客,否则只能是靠& ...
最新文章
- xdg-open 打开“irc:*”链接
- kmalloc、vmalloc、malloc的区别
- Linux free -m命令查看内存使用情况
- mysql课程设计案例_JAVA中MySQL建立连接
- 厉害了!VMware ESXi安装记录,附下载
- MySQL实现远程备份的原理_mysql实现自动远程备份一办法
- Socket 核心原理分享
- SAP License:SAP合同类型的使用
- 解除ASP.net上传文件大小的限制
- 如何防止盗号 使用windows自带的 屏幕键盘 OSK
- [转载] python中@property装饰器
- CentOS7下Tomcat启动慢的原因及解决方案
- nginx 分别对各个域名跳转
- python抽取html中的链接
- linux删除所有python进程,linux 下python进程查看及关闭
- 《Spring揭秘》学习部分总结
- cad文字宽度因子_为什么CAD中无法修改文字的宽度比例?
- 饿了么客户端透明代理 Samaritan详细介绍
- C语言中结构体直接赋值
- 遗传算法求解无人机路径多目标规划问题(python实现)