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、提升的扩展能力。
桥接模式的缺点:
会使系统看起复杂,对新手不友好,没有一定的抽象进行设计能力难以理解。
使用场景:
一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
接下来下一篇将会讲解外观模式和装饰器模式,有不好的地方请留言评论,相互学习,谢谢!
Java设计模式之四 ----- 适配器模式和桥接模式的更多相关文章
- Java进阶篇设计模式之四 -----适配器模式和桥接模式
		前言 在上一篇中我们学习了创建型模式的建造者模式和原型模式.本篇则来学习下结构型模式的适配器模式和桥接模式. 适配器模式 简介 适配器模式是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型 ... 
- Java设计模式菜鸟系列(十七)桥接模式建模与实现
		转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40008711 桥接模式(Bridge): 把事物和其详细实现分开(抽象化与实现化解耦),使 ... 
- Java设计模式之《职责链模式》及应用场景
		原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6530089.html 职责链模式(称责任链模式)将请求的处理对象像一条长链一般组合起来,形 ... 
- Java设计模式之《享元模式》及应用场景
		原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6542449.html 享元模式:"享"就是分享之意,指一物被众人共享, ... 
- Java设计模式之《调停者模式》及应用场景
		原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6518603.html 调停者模式. 我们想象一下这样的场景:一个系统内部通过许多的类互相之 ... 
- Java设计模式之《构建者模式》及应用场景
		原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6553374.html 构建者模式,又称建造者模式,将一部负责对象的构建分为许多小对象的构建 ... 
- java设计模式5——适配器模式
		java设计模式5--适配器模式 1.结构型模式介绍 1.1.作用 从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 分类: 适配器模式 代理模式 桥接模式 装饰模式 组合模式 ... 
- 重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」
		作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 程序员的上下文是什么? 很多时候一大部分编程开发的人员都只是关注于功能的实现,只 ... 
- Java设计模式(22)命令模式(Command模式)
		Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ... 
随机推荐
- Spring的Java配置方式—@Configuration和@Bean实现Java配置
			Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.@Configuration 和 @BeanSpring的Java配置方式是通过 @Configuration 和 @Be ... 
- git在工作中的用法总结-环境安装篇
			使用git有很长一段时间了 ,平时用到的时候都是直接google,经常用到的一些也记录在笔记中,但有时候笔记太多,实在是太乱了(其实是我太懒~ 哈?),找都要半天的时候还不如直接google,今天有空 ... 
- shiro教程2(自定义Realm)
			通过shiro教程1我们发现仅仅将数据源信息定义在ini文件中与我们实际开发环境有很大不兼容,所以我们希望能够自定义Realm. 自定义Realm的实现 创建自定义Realmjava类 创建一个jav ... 
- CentOS安装Subversion 1.9.*版本客户端
			安装yum仓库 以下以CentOS6为例,其他类似 # vim /etc/yum.repos.d/wandisco-svn.rep [WandiscoSVN] name=Wandisco SVN Re ... 
- Linux中rm命令详解
			linux下rm命令使用详解---linux删除文件或目录命令 用户可以用rm命令删除不需要的文件.该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除 ... 
- 【Java】用注解实现分发器
			在C/S中,客户端会向服务器发出各种请求,而服务器就要根据请求做出对应的响应.实际上就是客户机上执行某一个方法,将方法返回值,通过字节流的方式传输给服务器,服务器找到该请求对应的响应方法,并执行,将结 ... 
- 本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动
			重新安装MySQL数据库,由于安装的时候马虎,一路next(事实上,某些地方需要严格的配置,我忘记注意了),导致现在出了很多麻烦. 错误信息: 本地计算机上的MySQL服务启动后停止.某些服务在未由其 ... 
- 数组式访问-ArrayAccess
			以前对ArrayAccess不是很熟悉,现在整理下下有关ArrayAccess相关的知识,ArrayAccess接口就是提供像访问数组一样访问对象的能力的接口. 接口内容如下: ArrayAccess ... 
- Ajax实现的城市二级联动三
			把之前2篇整合在一起 1.html <select id="province"> <option>请选择</option> </selec ... 
- Nodejs 和 Electron ubuntu下快速安装
			查找时间管理软件的时候发现了superProductivity这个程序,使用electron进行开发,于是看了一下介绍,手痒了,尝试进行环境搭建,下一步慢慢补齐前端知识吧 nodejs安装 nodej ... 
