适配器模式是开发中常常会用到的模式,Android开发中常常常使用到的各种adapter就属于适配器模式,连接各种数据库时也要用到适配器模式。

适配器模式在生活中的实例也随处可见,你托人在日本买了个电饭煲。日本的市电电压是110v,而国内的市电电压是220v,这时你若想安全的使用电饭煲就必须装一个220-110的变压器,这个变压器就能够理解成本模式中的适配器。

 适配器模式有类的适配器模式对象的适配器模式两种不同的形式。首先看一下类的适配器模式UML类图:

类的适配器模式

能够看到。目标接口中有方法1和方法2,而我们仅仅有方法1,若想得到方法2。能够生成一个Adapter类。

我们以上面讲到的生活中的样例为例,实现下面代码:

1.我们有的220v。也就是上图中相应的Adaptee:

package com.adapter.demo;

public class Apply220V {

	public int get220V(){
return 220;
} }

2.想要110v。这里有个110v的接口:

package com.adapter.demo;

public interface Apply110V {

	int get110v();
}

3.我们想要110v电压就要实现这个接口:

package com.adapter.demo;

public class From220vTo110v extends Apply220V implements Apply110V {
/**
* 适配器
*/ @Override
public int get110v() {
return 110;
} }

设计模式的思想,添加这个中间的适配器能够使你的程序更灵活,更能多变。

假设每次改需求你都有想杀人的冲动,说明你的程序没有好的设计,也就是没实用好设计模式,说明你要重构了。

这时编写一个測试类:

package com.adapter.demo;

public class TestClass {

	public static void main(String[] args) {

		From220vTo110v from220vTo110v=new From220vTo110v();
System.out.println("输出电压:"+from220vTo110v.get110v());
} }

执行例如以下:

对象的适配器模式

对象适配器模式不是使用继承关系连接到Adaptee。而是使用代理模式连接到Adaptee类。

UML类图例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

这里须要改动的是适配器类:

package com.adapter.demo;

public class From220vTo110v  implements Apply110V {
/**
* 适配器
*/ Apply220V apply220v;
public From220vTo110v(Apply220V apply220v) {
this.apply220v=apply220v;
}
public int getApply220v() {
return apply220v.get220V();
}
@Override
public int get110v() {
return 110;
} }

測试类:

package com.adapter.demo;

public class TestClass {

	public static void main(String[] args) {

		From220vTo110v from220vTo110v=new From220vTo110v(new Apply220V());
System.out.println("输出电压:"+from220vTo110v.get110v());
} }

执行例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

我们能够看出:类适配器使用对象继承的方式,是静态的定义方式。而对象适配器使用对象组合的方式,是动态组合的方式。对象适配器更为灵活。

对于类适配器,适配器能够重定义Adaptee的部分行为,相当于子类覆盖父类的部分实现方法。

     对于对象适配器。要重定义Adaptee的行为比較困难,这样的情况下,须要定义Adaptee的子类来实现重定义,然后让适配器组合子类。尽管重定义Adaptee的行为比較困难。可是想要添加一些新的行为则方便的非常,并且新添加的行为可同一时候适用于全部的源。

最后:

设计模式是手段,不是目的,设计模式能够帮我们更好地理解他人的代码。同一时候也能够添加系统的可维护性、可扩展性、稳定性和灵活性。好的系统是须要设计的,设计模式就好像一个高手的内功一样,是须要修炼。须要融会贯通的。

学习设计模式的道路注定是抽象的、枯燥的。量变产生质变。或许坚持一下走过这个山口,下一个山口就是目的地了。

喜欢的朋友关注我和我的公众号。

Java与设计模式-适配器模式的更多相关文章

  1. Java设计模式——适配器模式

    JAVA 设计模式 适配器模式 用途 适配器模式 (Adapter) 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器 ...

  2. Java IO设计模式(装饰模式与适配器模式)

    01. 装饰模式 1. 定义 Decorator装饰器,就是动态地给一个对象添加一些额外的职责,动态扩展,和下面继承(静态扩展)的比较.因此,装饰器模式具有如下的特征: 它必须持有一个被装饰的对象(作 ...

  3. Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)

    Java EE设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 ...

  4. 【设计模式】Java设计模式 - 适配器模式

    [设计模式]Java设计模式 - 适配器模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一 ...

  5. linkin大话设计模式--适配器模式

    linkin大话设计模式--适配器模式 大家知道,在java中只允许单继承,但是在实际问题中往往都需要多继承,java引入了接口这一概念.(一个类可以实现多个接口) 由于接口中都是抽象方法,那么我们在 ...

  6. Java经典设计模式之七大结构型模式(附实例和详解)

    博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以上的猿友阅读起来才会理解的比较深刻.当然,你没 ...

  7. Java的设计模式

    一.什么是设计模式: 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...

  8. java常用设计模式总览

    一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...

  9. 转 分享我在阿里工作十年接触过Java框架设计模式

    转 原文: 分享我在阿里工作十年接触过Java框架设计模式 一.前言 说起来设计模式,大家应该都耳熟能详,设计模式代表了软件设计的最佳实践,是经过不断总结提炼出来的代码设计经验的分类总结,这些模式或者 ...

随机推荐

  1. 生产环境4.3.5jboss内存调优

    1.查看jboss的监控工具 http://XXX/jmx-console/htmladaptor 2.查看jvm的监控工具 jdk\bin jvisualvm.exe jmc.exe 3.查看jbo ...

  2. Xcode相关概念:Target、Project、Scheme、Workspace

    创建并编译Xcode工程时,有几个常用概念想在这里记一下. Xcode Target: 定义:A target defines a single product; .... 理解:输出文件,等同于VS ...

  3. dubbo之服务容器

    服务容器是一个standalone的启动程序,因为后台服务不需要Tomcat或JBoss等Web容器的功能,如果硬要用Web容器去加载服务提供方,增加复杂性,也浪费资源. 服务容器只是一个简单的Mai ...

  4. StyleAI厚积薄发: Android网络图片数据传输

    在StyleAI上厚积了这么长时间,憋了这么久,本来想憋个更大的,不过还是薄发一次的好. 三.直接使用别人的工程 文章:Android学习之客户端上传图片到服务器 下载地址:https://downl ...

  5. 创建一个 Vue 的实例

    每个 Vue 应用都是通过 Vue 函数创建一个新的 Vue 实例开始的: var vm = new Vue({         // 选项 }) 选项:el.data.methods el: 类型: ...

  6. 【转载】tomcat部署web项目的3中方法

    转载自:http://blog.csdn.net/wjx85840948/article/details/6749964/ 1.直接把项目复制到Tomcat安装目录的webapps目录中,这是最简单的 ...

  7. P1048 采药(洛谷,动态规划递推,01背包原题)

    题目直接放链接 P1048 采药 这题只是01背包+背景故事而已 原题来的 PS:我写了一篇很详细的01背包说明,如果下面ac代码有看不懂的地方可以去看看 对01背包的分析与理解(图文) 下面上ac代 ...

  8. 关于C++中字符串输入get与getline的区别

    最近使用C++中自己老是忘记的一个点,get与getline的区别. 1.get与getline get和getline所属iostream类,作用是读取一整行,通过换行符确定读取结束,他们都可以读取 ...

  9. python爬虫22 | 以后我再讲python「模拟登录」我就是狗

    接下来就是 学习python的正确姿势 做爬虫 绕不开模拟登录 为此小帅b给大家支了几招 python爬虫19 | 遇到需要的登录的网站怎么办?用这3招轻松搞定! 有些网站的登录很弱鸡 传个用户名和密 ...

  10. 利用python去调用shell命令时候的踩到的坑

    shell中 True的返回值是0 False的返回值是1 Python中 True的返回值是1 False的返回值是0