Java设计模式----初识适配器模式
【声明】
欢迎转载,但请保留文章原始出处→_→
生命壹号:http://www.cnblogs.com/smyhvae/
文章来源:http://www.cnblogs.com/smyhvae/p/3930271.html
【正文】
我们知道,Android中最重要也是最难用的UI控件就是ListView列表控件,而要想灵活运用它,则必须要用到适配器adapter,所以,我觉得还是很有必要来学习一下Java当中的适配器模式(不管以后能不能用到),毕竟Java语言是Android开发很重要的一个基础。
完全了解适配器模式,有很多知识要学习,例如:适配器模式有类的适配器模式和对象的适配器模式两种不同的形式。但作为初学者,我就简单学习一下配器模式入门知识吧,以后会不断完善。希望奋斗在码农路上的童鞋们莫吐槽→_→
一、适配器介绍:
- 将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- 适配器模式在现代的Java框架中十分常用。这种模式适用于以下场景:想使用一个已存在的类,但是该类不符合接口需求;或者需要创建一个可重用的类,适配没有提供合适接口的其它类。
二、苹果和桔子的例子:
适配器的思想可以通过下面这个简单的例子说明。这个示例要让一个桔子被“适配”成一个苹果。如下图所示:

上图中的下半部分可以看到,适配器包含了一个桔子实例并且继承了苹果类。桔子对象放在了适配器中,于是桔子表现得就像苹果一样了。对应的逻辑图如下:

三、插座盒插头的例子:

上图中,我们可以通过中间的适配器让右边的插头成功连接上左边的插座。
四、插头适配器的代码实现:
/**
适配器模式( Adapter ):将一个类的接口转换成客户希望的另外一个接口。
适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
*/
class AdapterDemo{
public static void main(String[] args){
//电源A开始工作
PowerA powerA = new PowerAImpl();
start(powerA);
PowerB powerB = new PowerBImpl();
PowerAAdapter pa = new PowerAAdapter(powerB);
start(pa);
}
//定义方法:电源A工作
public static void start(PowerA powerA){
System.out.println("....一些重复的代码.....");
powerA.insert();
System.out.println("....一些重复的代码.....\n");
} /**
public static void start(PowerB powerB){
System.out.println("....一些重复的代码.....");
powerB.connect();
System.out.println("....一些重复的代码.....");
}
*/
}
29 //定义适配器类
class PowerAAdapter implements PowerA{
private PowerB powerB;//要进行适配的接口 public PowerAAdapter(PowerB powerB){
this.powerB = powerB;
}
//实现接口PowerA,则必然要实现PowerA里面的方法
public void insert(){
powerB.connect();
}
}
/**
电源A接口
*/
interface PowerA{
public void insert();
}
class PowerAImpl implements PowerA{
public void insert(){
System.out.println("电源A接口插入,开始工作");
}
}
/**
电源B接口
*/
interface PowerB{
public void connect();
}
class PowerBImpl implements PowerB{
public void connect(){
System.out.println("电源B接口已连接,开始工作");
}
}
在这个例子当中,我们想让PowerB调用PowerA中Start()方法里的代码;当然,我们也不想重复写被注释掉的23、25行代码。这个时候就可以用适配器模式。
上述代码解释:
第30行:开始定义适配器,也是核心代码的开始;
第33、34行:通过构造方法将PowerB传进来;
第37行代码:既然是实现接口PowerA,则必然要实现PowerA里面的方法insert();
第38行代码:我们在PowerA的insert()方法中,去调用PowerB的connect()方法;
紧接着,第10、11、12行代码的意思是:在new一个PowerB的时候,我们把它传到适配器PowerAAdapter里面去,启动适配器,然后PowerB就会去执行第16、24、18行的代码。
注:16、24、18这个顺序没有错,因为我们在适配器中相当于是已经将24行代码替换为了第17行代码。
运行效果如下:

同理,如果我也想把PowerA作为PowerB去使用,可以再定义一个适配器PowerBAdapter,实现双向适配器。
五、小总结:
上方第23、25行被注释掉的代码,表示是很多重复的代码,不符合面向对象的思维方式。我们现在设想这样一个例子:我们的项目已经上线并且客户正在使用,但是后来增加了一些新的需求。而面向对象有一条OO原则就是:对修改关闭(上线后,代码尽量不要修改,不然可能会发生连锁反应,导致其他调用此处方法的代码都可能出问题),对扩展开放(自己定义的新的方法,别人还没有调用,我们当然可以修改)。此时,我们可以通过适配器来减少这些重复的代码。
六:OO设计原则:
- 面向接口编程(面向抽象编程)
- 封装变化
- 多用组合,少用继承
- 对修改关闭 对扩展开放
个人感觉,这些设计原则,需要在实践中不断加深理解,在这里就不过多描述了哦~
参考博客:
http://www.cnblogs.com/java-my-life/archive/2012/04/13/2442795.html
http://www.importnew.com/6923.html
Java设计模式----初识适配器模式的更多相关文章
- java设计模式5——适配器模式
java设计模式5--适配器模式 1.结构型模式介绍 1.1.作用 从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 分类: 适配器模式 代理模式 桥接模式 装饰模式 组合模式 ...
- Java设计模式之适配器模式(项目升级案例)
今天是我学习Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一遍 ...
- Java设计模式应用——适配器模式
性能监控系统中,存在告警模块和报表模块,告警结果和报表结果都需要导出. 由于告警开发进度较快,已经实现了excel导出.csv导出.zip导出功能,现在报表需要excel导出.csv导出.pdf导出功 ...
- Java设计模式之适配器模式(Adapter)
转载:<JAVA与模式>之适配器模式 这个总结的挺好的,为了加深印象,我自己再尝试总结一下 1.定义: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法 ...
- Java设计模式中适配器模式的实现方法
在Java开发中,我们常常需要用到Java接口型模式中的适配器模式,那适配器设计模式到底是什么模式呢? 适配器模式(Adapter)就是把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹 ...
- 夜话JAVA设计模式之适配器模式(adapter pattern)
适配器模式:将一个类的接口,转换成客户期望的另一个接口,让不兼容的接口变成兼容. 1.类适配器模式:通过多重继承来实现适配器功能.多重继承就是先继承要转换的实现类,再实现被转换的接口. 2.对象适配器 ...
- java设计模式之适配器模式
说到适配器,我们可能会想到电脑的适配器,没错,其实作用是一样的,电脑的适配器在中国可以使用,在美国也可以使用,它的主要作用是在新接口和老接口之间进行适配..这就是一个适配的过程,适配器模式的类图如下: ...
- java设计模式之——适配器模式
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的用途 用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极.阴极 ...
- java设计模式之六适配器模式(Adapter)
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式.首先,我们来看看类的适配器模 ...
随机推荐
- 漫谈NIO(3)之Netty实现
1.前言 上一章结合Java的NIO例子,讲解了多路IO复用的一个基本使用方法,通过实际编码加深对其理解.本章开始进入Netty的环节,前面两章都是为了Netty进行铺垫说明.此节将对比Java的NI ...
- Java之IO(十一)BufferedReader和BufferedWriter
转载请注明源出处:http://www.cnblogs.com/lighten/p/7074488.html 1.前言 按照字节流的顺序一样,字符流也提供了缓冲字符流,与字节流不同,Java虽然提供了 ...
- win7、8上走网络打印机(需找驱动包,不能自动)
不多说,直接上干货! 简而言之,就是, 第一步是,将电脑与打印机联上网,进行匹配,即连上网可以查找到打印机的型号. 第二步是,安装驱动. D:\Driver\HP LJP2015 PCL6(注意,这个 ...
- 机器学习入门学习笔记:(一)BP神经网络原理推导及程序实现
机器学习中,神经网络算法可以说是当下使用的最广泛的算法.神经网络的结构模仿自生物神经网络,生物神经网络中的每个神经元与其他神经元相连,当它“兴奋”时,想下一级相连的神经元发送化学物质,改变这些神经元的 ...
- springMVC中ModelAndView学写笔记
api介绍: 构造函数摘要 ModelAndView() bean样式用法的默认构造函数:填充bean属性,而不是传递构造函数参数. ModelAndView(Object vie ...
- H5开发中遇到的问题及解决办法
记不得什么时候进行H5开发的学习了,只知道是从2016年8月1日开始修复Bug,计划每天把学到的东西以及遇到问题时候的解决方案都记录下来,希望自己能够坚持下去,每天积累一点,希望有所进步吧. 1.Th ...
- rsyslog 配置 二
转自:https://www.cnblogs.com/cherishry/p/6775163.html rsyslog 配置 二 # rsyslog configuration file # For ...
- ABP学习入门系列(一)(第一个ABP项目)
ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称.ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它 ...
- SpringBoot访问NoSQL和简单的Thymeleaf-Spring-Spring-boot整合
SpringBoot访问NoSQL SpringBoot访问Redis 在pom.xml添加boot-data-redis定义 <parent> <groupId>org.sp ...
- Java基于ssm框架的restful应用开发
Java基于ssm框架的restful应用开发 好几年都没写过java的应用了,这里记录下使用java ssm框架.jwt如何进行rest应用开发,文中会涉及到全局异常拦截处理.jwt校验.token ...