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)
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式.首先,我们来看看类的适配器模 ...
随机推荐
- EF 一对一、一对多、多对多配置语句小记
数据库实体间的关系无非有这么几种:一对一.一对多.多对多,这些关系在EF框架中分别有不同的创建方式: 1.在"Database First"模式中,这些关系通过SQL语句的方式建立 ...
- 如何自学计算机科学与技术(Teach Yourself Computer Science)
如果你是一个自学成才的半吊子,或者是从培训班毕业的小菜鸟.那么,你欠自己一份计算机科学的专业知识.感谢上帝,如今你可以接受世界水平的计算机教育,但无需花费数年时间和一笔不小的金钱. 互联网上的学习资源 ...
- juqery dragsort使用遇到的问题
1.destroy时,没给容器加id,不能执行成功--->修改源码如下: if (options == "destroy") { $(this).trigger(" ...
- jqGrid随窗口大小变化自适应大小-转
第一种: jqGrid随窗口大小变化自适应宽度 $(function(){ $(window).resize(function(){ $("#listId").setGridWid ...
- DirectorySearcher.Filter 属性(转)
获取或设置一个值,该值的轻型目录访问协议 (LDAP) 格式筛选器字符串. 更多信息见:http://www.cnblogs.com/zhongweiv/archive/2013/01/05/ad_s ...
- js判断手机是否安装了某一款app,有则打开,没有去下载
function openApp(){ if(navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) { var loadDateTime = new ...
- ROR中h()方法和sanitize的区别及Html Filter
一般来说,通常使用input的field都会做一些filter的动作,避免被不怀好意之徒塞一些危险的HTML code(script等)进去搞破坏.在ROR中,我们在前面加一个h()(一般不用括号?不 ...
- HDU 5253 连接的管道(Kruskal算法求解MST)
题目: 老 Jack 有一片农田,以往几年都是靠天吃饭的.但是今年老天格外的不开眼,大旱.所以老 Jack 决定用管道将他的所有相邻的农田全部都串联起来,这样他就可以从远处引水过来进行灌溉了.当老 J ...
- 常用工具说明--node.js是什么
简介 如果您听说过 Node,或者阅读过一些文章,宣称 Node 是多么多么的棒,那么您可能会想:“Node 究竟是什么东西?” 即便是在参阅 Node 的主页之后,您甚至可能还是 不明白 Node ...
- Asp.net MVC中关于@Html标签Label、Editor使用
@Html帮助器简单说明,记录些基本的跟HTML中对应的@html帮助器,@Html基本包含了html中的表单控件和常用Html在@Html中,带有For的主要是针对强类型的Html类型.用于说明@H ...