前言

在上一篇中我们学习了创建型模式的建造者模式和原型模式。本篇则来学习下结构型模式的适配器模式和桥接模式。

适配器模式

简介

适配器模式是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

简单的来说就是通过某个接口将不兼容的两个类进行兼容,俗称转换器。
生活比较典型的例子是电器的电压,美国的电压是110V左右, 而中国的电压普片是220V,如果我们想用美国或日本的电器,则需要一个转换器,将110V转换成220V。还有一个很典型例子就是曾经的万能充,基本可以充各种手机的电池。

这里我们用一个简单的示例来进行说明。
某个视频播放器,只能播放MP4格式的视频,但是主流的视频格式除了MP4,还有AVI、RVMB等,这时就有个软件,格式工厂用于对视频格式的转换(适配器),从而进行播放视频。这时我们就可以使用适配器模式来进行完成该代码的编写。

适配器模式主要有两种类型,一种是类适配器模式,主要通过继承来实现适配器功能;一种是对象适配器模式,通过组合来实现适配器功能。

首先是类适配器模式,它需要完成一下步骤:

  1. 建立MP4、AVI、RVMB视频格式的接口;
  2. 建立一个视频播放器的类实现MP4视频格式的类;
  3. 编写一个格式工厂类,将AVI、RVMB等格式的视频文件转换成MP4格式的文件。
  4. 播放这些视频。

那么代码如下:

代码示例:

interface Mp4{void playMp4();}interface Avi{void playAvi();}interface Rvmb{void playRvmb();}class VideoPlayer implements Mp4{@Overridepublic void playMp4() {System.out.println("播放Mp4格式的视频文件.");}}class FormatFactory extends VideoPlayer  implements Avi{    @Overridepublic void playAvi() {//转换成MP4格式的视频playMp4();}}public static void main(String[] args) {        Mp4 mp4=new VideoPlayer();mp4.playMp4();Avi avi=new FormatFactory();avi.playAvi();}

运行结果:

    播放Mp4格式的视频文件.播放Mp4格式的视频文件.

通过上述代码以及运行结果,我们可以得到想要的结果了,如果还有新增的视频格式,也需要使用该视频播放器播放的话,只需在增加一个接口以及格式工厂类就可以了。

对象适配器模式
通过组合来实现适配器功能。
所以这里我们只需将格式工厂中继承改为创建对象即可。
更改之后的代码如下:
代码示例


class FormatFactory2  implements Rvmb{private Mp4 mp4;public FormatFactory2(Mp4 mp4) {this.mp4=mp4;}@Overridepublic void playRvmb() {mp4.playMp4();}   }public static void main(String[] args) {Rvmb rvmb=new FormatFactory2(new VideoPlayer());rvmb.playRvmb();}

运行结果:

    播放Mp4格式的视频文件.

这两种适配器模式中,都实现了该功能,不过在这里推荐使用对象适配器模式,相比类适配器模式,它更加灵活,也符合设计原则中的合成复用原则:

尽量使用合成/聚合的方式,而不是使用继承。

适配器模式的优点:

提升了类的复用和灵活度。

适配器模式的缺点:

使用过多,系统会比较杂乱,难以把握。

注意事项:

适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。

桥接模式

简介

桥接是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

字面的意思解读就是通过一个中间的桥梁对两边的东西进行关联起来,但是关联的两者之间又不相互影响。对这个印象比较深的是<大话设计模式>中的手机品牌和手机软件,手机有很多品牌,市场有很多软件,每个手机装的软件又各不相同,手机品牌包含包含软件,但是软件并不是手机的一部分,它们是聚合关系。如果A品牌手机装了a,b软件,B品牌手机装了b,c软件,如果A品牌手机需要新安装一个c软件,那么它只需添加该软件即可,无需知道该软件是如何生产的。相同的,如果新增了一个C品牌手机,那么它也只需安装所需的a、b或c软件即可。

好了,废话不在多说,依旧用一个示例来进行说明。
市面上有很多种笔,比如铅笔、黑色的圆珠笔和红色的圆珠笔等等, 也有很多种类型的纸,比如考试的卷子用的纸,报纸用的纸等等。一般来说,报纸上的字颜色是黑色的,这里我们就用黑色的圆珠笔来进行书写,考试卷子上的打分字颜色是红色的,这里我们就用红色的圆珠笔来进行书写。笔类和纸类相互独立,但是在纸上写字又将它们关联起来,这里我们就可以使用桥接模式。

实现步骤如下:

  1. 定义一个笔类的接口,有写的这个方法;
  2. 定义红笔和黑笔的类,实现笔类的接口;
  3. 定义一个纸类的抽象类,设置笔的种类,并需要实现被写的方法;
  4. 定义卷子纸和新闻纸类,继承纸类并实现该方法;
  5. 进行书写。

代码示例


interface Pen{void write();
}class RedPen implements Pen{@Overridepublic void write() {System.out.println("红色的字");}
}class BlackPen implements Pen{@Overridepublic void write() {System.out.println("黑色的字");}
}abstract class  Paper{protected  Pen pen;void setPen(Pen pen){this.pen=pen;}   abstract void writing();
}class ExaminationPaper extends Paper{@Overridevoid writing() {pen.write();}
}class NewsPaper extends Paper{@Overridevoid writing() {pen.write();}
}public static void main(String[] args) {Paper paper=new ExaminationPaper();paper.setPen(new RedPen());paper.writing();Paper paper2=new NewsPaper();paper2.setPen(new BlackPen());paper2.writing();}

运行结果

红色的字
黑色的字

从上述结果中我们可以得出我们想要的结果。如果新增一个笔类或者一个纸类,那么只需新增相应的接口和实现即可,并不会因为结构化改变而相互直接影响。

桥接模式的优点:

1、抽象和实现的分离,实现了解耦;
2、提升的扩展能力。

桥接模式的缺点:

会使系统看起复杂,对新手不友好,没有一定的抽象进行设计能力难以理解。

使用场景:

一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

其它

音乐推荐

border="0" width="330" height="86" src="//music.163.com/outchain/player?type=2&id=32648074&auto=0&height=66">

网易云网友评价(ps:原版无法生成外链,建议听原版):

扶桑画师浅溪,居泰安,喜绘鲤。院前一方荷塘,锦鲤游曳,溪常与嬉戏。 其时正武德之乱,藩镇割据,战事频仍,魑魅魍魉,肆逆于道。兵戈逼泰安,街邻皆逃亡,独溪不舍锦鲤,未去。 是夜,院室倏火。有人入火护溪,言其本鲤中妖,欲取溪命,却生情愫,遂不忍为之。翌日天明,火势渐歇,人已不见。

原创不易,如果感觉不错,希望给个推荐!您的支持是我写作的最大动力!
版权声明:
作者:虚无境
博客园出处:http://www.cnblogs.com/xuwujing
CSDN出处:http://blog.csdn.net/qazwsxpcm    
个人博客出处:http://www.panchengming.com

Java进阶篇设计模式之四 -----适配器模式和桥接模式相关推荐

  1. Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式

    前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...

  2. Java进阶篇设计模式之一 ----- 单例模式

    前言 在刚学编程没多久就听说过设计模式的大名,不过由于当时还是个彻彻底底的菜鸟,并没有去触碰.直到在开始工作中对简单的业务代码较为熟悉之后,才正式的接触设计模式.当时最早接触的设计模式是工厂模式,不过 ...

  3. Java进阶篇设计模式之九----- 解释器模式和迭代器模式

    前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...

  4. Java进阶篇设计模式之十三——观察者模式和空对象模式

    简介 观察者模式又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式. ...

  5. Java进阶篇设计模式之十三 ---- 观察者模式和空对象模式

    前言 在上一篇中我们学习了行为型模式的备忘录模式(Memento Pattern)和状态模式(Memento Pattern).本篇则来学习下行为型模式的最后两个模式,观察者模式(Observer P ...

  6. Java进阶篇设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

  7. Java进阶之设计模式正则表达式

    Java进阶之设计模式&正则表达式 一.设计模式 1.1 设计模式概述 1.2 单例模式 1.2.1 单例模式衍生--多例模式 1.2.2 单例模式衍生--枚举 1.3 工厂模式 二.正则表达 ...

  8. 设计模式之适配器模式、委派模式、访问者模式、工厂模式、桥接模式(双维度扩展)

    设计模式之适配器模式.委派模式.访问者模式.工厂模式.观察者-发布订阅模式 设计模式分类: 适配器模式(Adapter Pattern) 定义 使用场景 代码实现 写法一:类适配器 写法二:对象适配器 ...

  9. 设计模式(9)[JS版]-JavaScript设计模式之如何实现桥接模式???

    目录 1 什么是桥接模式 2 参与者 3 实例讲解 4 总结 1 什么是桥接模式 Bridge模式允许两个组件,即客户端和服务一起工作,每个组件都有自己的接口.Bridge是一种高级架构模式,它的主要 ...

  10. php设计模式课程---9、桥接模式是什么

    php设计模式课程---9.桥接模式是什么 一.总结 一句话总结: 一个类没干完,另外一个类接着给它干完 实质是类的拼接,也就是用类的组合代替了类的继承,因为类的组合可以有很多种方式,所以桥接就是类的 ...

最新文章

  1. 企业网络安全之安全维度
  2. Istio 从懵圈到熟练:二分之一活的微服务
  3. win7 php redis 扩展,Windows中安装Redis及php redis扩展
  4. Linux下开发常用的CVS使用手册
  5. LeetCode 166. 分数到小数(小数除法)
  6. 一个websocket 可以多个页面创建吗_实战分享|给我一个Puppeteer,没有爬不了的网站
  7. 【LeetCode】剑指 Offer 57 - II. 和为s的连续正数序列
  8. python实现logistic_用python实现Logistic
  9. php方法 隐藏手机号中间四位
  10. R语言之——字符串处理函数
  11. 【重点!记忆化递归+DP】LeetCode 72. Edit Distance
  12. 树莓派4B安装ffmpeg的方法
  13. python用蓝牙发文件_用pybluez进行python蓝牙发现
  14. ENSP端口角色和状态
  15. 陀螺仪传感器和加速度传感器的区别与联系
  16. 互联网巨头介入P2P网贷的潜在风险
  17. 小米手机手机远行linux,Ubuntu的Android Studio调试小米手机的方法
  18. 建议各位站长网站404页面换成腾讯宝贝回家公益页面,为社会公益出一份力
  19. 阿里达摩院获KDD 2022最佳论文,国内企业首次获奖
  20. EventBus:基本使用详解

热门文章

  1. 封装jquery的方法
  2. Hyper-V的使用技巧及管理方法
  3. pdf转换成word转换器免费版哪里下载
  4. mysql MMM方案
  5. 【面经】京东搜索广告算法一面
  6. 6.5 发散思维能力
  7. 计算机图片处理是什么应用,计算机图像处理技术及其应用领域
  8. 页面html背景图片居中显示文字,DIV+CSS中让布局、背景图片、文字内容居中的方法...
  9. 设计模式(创建型模式)-抽象工厂模式
  10. 【文献笔记】【精读】Metamorph: Injecting Inaudible Commands into Over-the-air V oice Controlled Systems