Java进阶篇设计模式之四 -----适配器模式和桥接模式
前言
在上一篇中我们学习了创建型模式的建造者模式和原型模式。本篇则来学习下结构型模式的适配器模式和桥接模式。
适配器模式
简介
适配器模式是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
简单的来说就是通过某个接口将不兼容的两个类进行兼容,俗称转换器。
生活比较典型的例子是电器的电压,美国的电压是110V左右, 而中国的电压普片是220V,如果我们想用美国或日本的电器,则需要一个转换器,将110V转换成220V。还有一个很典型例子就是曾经的万能充,基本可以充各种手机的电池。
这里我们用一个简单的示例来进行说明。
某个视频播放器,只能播放MP4格式的视频,但是主流的视频格式除了MP4,还有AVI、RVMB等,这时就有个软件,格式工厂用于对视频格式的转换(适配器),从而进行播放视频。这时我们就可以使用适配器模式来进行完成该代码的编写。
适配器模式主要有两种类型,一种是类适配器模式,主要通过继承来实现适配器功能;一种是对象适配器模式,通过组合来实现适配器功能。
首先是类适配器模式,它需要完成一下步骤:
- 建立MP4、AVI、RVMB视频格式的接口;
- 建立一个视频播放器的类实现MP4视频格式的类;
- 编写一个格式工厂类,将AVI、RVMB等格式的视频文件转换成MP4格式的文件。
- 播放这些视频。
那么代码如下:
代码示例:
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();
}
运行结果
红色的字
黑色的字
从上述结果中我们可以得出我们想要的结果。如果新增一个笔类或者一个纸类,那么只需新增相应的接口和实现即可,并不会因为结构化改变而相互直接影响。
桥接模式的优点:
1、抽象和实现的分离,实现了解耦;
2、提升的扩展能力。
桥接模式的缺点:
会使系统看起复杂,对新手不友好,没有一定的抽象进行设计能力难以理解。
使用场景:
一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
其它
音乐推荐
网易云网友评价(ps:原版无法生成外链,建议听原版):
扶桑画师浅溪,居泰安,喜绘鲤。院前一方荷塘,锦鲤游曳,溪常与嬉戏。 其时正武德之乱,藩镇割据,战事频仍,魑魅魍魉,肆逆于道。兵戈逼泰安,街邻皆逃亡,独溪不舍锦鲤,未去。 是夜,院室倏火。有人入火护溪,言其本鲤中妖,欲取溪命,却生情愫,遂不忍为之。翌日天明,火势渐歇,人已不见。
原创不易,如果感觉不错,希望给个推荐!您的支持是我写作的最大动力!
版权声明:
作者:虚无境
博客园出处:http://www.cnblogs.com/xuwujing
CSDN出处:http://blog.csdn.net/qazwsxpcm
个人博客出处:http://www.panchengming.com
Java进阶篇设计模式之四 -----适配器模式和桥接模式的更多相关文章
- Java设计模式之四 ----- 适配器模式和桥接模式
前言 在上一篇中我们学习了创建型模式的建造者模式和原型模式.本篇则来学习下结构型模式的适配器模式和桥接模式. 适配器模式 简介 适配器模式是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型 ...
- Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式
前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...
- Java进阶篇 设计模式之十四 ----- 总结篇
前言 本篇是讲述之前学习设计模式的一个总结篇,其目的是为了对这些设计模式的进行一个提炼总结,能够通过查看看此篇就可以理解一些设计模式的核心思想. 设计模式简介 什么是设计模式 设计模式是一套被反复使用 ...
- Java进阶篇设计模式之五-----外观模式和装饰器模式
前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这 ...
- Java进阶篇设计模式之七 ----- 享元模式和代理模式
前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...
- Java进阶篇设计模式之一 ----- 单例模式
前言 在刚学编程没多久就听说过设计模式的大名,不过由于当时还是个彻彻底底的菜鸟,并没有去触碰.直到在开始工作中对简单的业务代码较为熟悉之后,才正式的接触设计模式.当时最早接触的设计模式是工厂模式,不过 ...
- Java进阶篇设计模式之九----- 解释器模式和迭代器模式
前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...
- Java进阶篇设计模式之八 ----- 责任链模式和命令模式
前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...
- Java进阶篇设计模式之三 ----- 建造者模式和原型模式
前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...
随机推荐
- 无service.bat的tomcat服务怎么设置自启动
在正式环境中,经常需要设置tomcat自启动,这样在重启系统服务器后就不需要再手动去开启tomcat服务器了.通过设置tomcat下的service.bat可以实现自启动的目的,但有时候会发现自己的t ...
- bzoj 2510 弱题 矩阵乘
看题就像矩阵乘 但是1000的数据无从下手 打表发现每一行的数都是一样的,只不过是错位的,好像叫什么循环矩阵 于是都可以转化为一行的,O(n3)->O(n2)*logk #include< ...
- 肝 hibernate 配置and增删改查 and 测试
已经通宵三天撸代码了,现在的我已经养成晚上修仙写代码的节奏了.....最近 刚刚复习到了 hibernate 谈谈 这篇文章就谈谈我对这货的理解吧. 在看这篇文章之前希望你 知道sessionfact ...
- TIMO后台管理系统-基于SpringBoot开发
项目介绍 TIMO后台管理系统,基于SpringBoot2.0 + Spring Data Jpa + Thymeleaf + Shiro 开发的后台管理系统,采用分模块的方式便于开发和维护,支持前后 ...
- java 理解如何实现图片验证码 傻瓜都能看懂。
先代码后解释: 只要把代码复制到你的项目中就可以了. 代码: 验证码工具类: package cn.happy.util.imagesVerTion; /** * Author: SamGroves ...
- Spring Boot 入门教程 | 图文讲解
目录 一.Spring Boot 是什么 二.为什么要使用 Spring Boot 三.快速入门 3.1 创建 Spring Boot 项目 3.2 项目结构 3.3 引入 Web 依赖 3.4 编写 ...
- Fastjson 1.2.22-24 反序列化漏洞分析
目录 0x00 废话 0x01 简单介绍 FastJson的简单使用 0x02 原理分析 分析POC 调试分析 0x03 复现过程 0x04 参考文章 0x00 废话 balabala 开始 0x01 ...
- 马蜂窝搜索基于 Golang 并发代理的一次架构升级
搜索业务是马蜂窝流量分发的重要入口.很多用户在使用马蜂窝时,都会有目的性地主动搜索与自己旅行需求相关的各种信息,衣食住行,事无巨细,从而做出最符合需求的旅行决策. 因此在马蜂窝,搜索业务交互的下游模块 ...
- Netty源码—六、tiny、small内存分配
tiny内存分配 tiny内存分配流程: 如果申请的是tiny类型,会先从tiny缓存中尝试分配,如果缓存分配成功则返回 否则从tinySubpagePools中尝试分配 如果上面没有分配成功则使用a ...
- 补习系列(19)-springboot JPA + PostGreSQL
目录 SpringBoot 整合 PostGreSQL 一.PostGreSQL简介 二.关于 SpringDataJPA 三.整合 PostGreSQL A. 依赖包 B. 配置文件 C. 模型定义 ...