在上一篇中咱们学习了建立型模式的建造者模式和原型模式。本篇则来学习下结构型模式的适配器模式和桥接模式。html
简介设计模式
适配器模式是做为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。ide
简单的来讲就是经过某个接口将不兼容的两个类进行兼容,俗称转换器。
生活比较典型的例子是电器的电压,美国的电压是110V左右, 而中国的电压普片是220V,若是咱们想用美国或日本的电器,则须要一个转换器,将110V转换成220V。还有一个很典型例子就是曾经的万能充,基本能够充各类手机的电池。学习
这里咱们用一个简单的示例来进行说明。
某个视频播放器,只能播放MP4格式的视频,可是主流的视频格式除了MP4,还有AVI、RVMB等,这时就有个软件,格式工厂用于对视频格式的转换(适配器),从而进行播放视频。这时咱们就可使用适配器模式来进行完成该代码的编写。this
适配器模式主要有两种类型,一种是类适配器模式,主要经过继承来实现适配器功能;一种是对象适配器模式,经过组合来实现适配器功能。.net
首先是类适配器模式,它须要完成一下步骤:设计
那么代码以下:code
代码示例:orm
interface Mp4{ void playMp4(); } interface Avi{ void playAvi(); } interface Rvmb{ void playRvmb(); } class VideoPlayer implements Mp4{ @Override public void playMp4() { System.out.println("播放Mp4格式的视频文件."); } } class FormatFactory extends VideoPlayer implements Avi{ @Override public 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; } @Override public 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软件便可。
好了,废话不在多说,依旧用一个示例来进行说明。
市面上有不少种笔,好比铅笔、黑色的圆珠笔和红色的圆珠笔等等, 也有不少种类型的纸,好比考试的卷子用的纸,报纸用的纸等等。通常来讲,报纸上的字颜色是黑色的,这里咱们就用黑色的圆珠笔来进行书写,考试卷子上的打分字颜色是红色的,这里咱们就用红色的圆珠笔来进行书写。笔类和纸类相互独立,可是在纸上写字又将它们关联起来,这里咱们就可使用桥接模式。
实现步骤以下:
代码示例
interface Pen{ void write(); } class RedPen implements Pen{ @Override public void write() { System.out.println("红色的字"); } } class BlackPen implements Pen{ @Override public 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{ @Override void writing() { pen.write(); } } class NewsPaper extends Paper{ @Override void 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(); }
运行结果
红色的字 黑色的字
从上述结果中咱们能够得出咱们想要的结果。若是新增一个笔类或者一个纸类,那么只需新增相应的接口和实现便可,并不会由于结构化改变而相互直接影响。
桥接模式的优势:
一、抽象和实现的分离,实现了解耦;
二、提高的扩展能力。
桥接模式的缺点:
会使系统看起复杂,对新手不友好,没有必定的抽象进行设计能力难以理解。
使用场景:
一个类存在两个独立变化的维度,且这两个维度都须要进行扩展。
网易云网友评价(ps:原版没法生成外链,建议听原版):
扶桑画师浅溪,居泰安,喜绘鲤。院前一方荷塘,锦鲤游曳,溪常与嬉戏。 其时正武德之乱,藩镇割据,战事频仍,魑魅魍魉,肆逆于道。兵戈逼泰安,街邻皆逃亡,独溪不舍锦鲤,未去。 是夜,院室倏火。有人入火护溪,言其本鲤中妖,欲取溪命,却生情愫,遂不忍为之。翌日天明,火势渐歇,人已不见。
原创不易,若是感受不错,但愿给个推荐!您的支持是我写做的最大动力! 版权声明: 做者:虚无境 博客园出处:http://www.cnblogs.com/xuwujing CSDN出处:http://blog.csdn.net/qazwsxpcm 我的博客出处:http://www.panchengming.com