【声明】

欢迎转载,但请保留文章原始出处→_→

生命壹号: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设计模式----初识适配器模式的更多相关文章

  1. java设计模式5——适配器模式

    java设计模式5--适配器模式 1.结构型模式介绍 1.1.作用 从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 分类: 适配器模式 代理模式 桥接模式 装饰模式 组合模式 ...

  2. Java设计模式之适配器模式(项目升级案例)

    今天是我学习Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一遍 ...

  3. Java设计模式应用——适配器模式

    性能监控系统中,存在告警模块和报表模块,告警结果和报表结果都需要导出. 由于告警开发进度较快,已经实现了excel导出.csv导出.zip导出功能,现在报表需要excel导出.csv导出.pdf导出功 ...

  4. Java设计模式之适配器模式(Adapter)

    转载:<JAVA与模式>之适配器模式 这个总结的挺好的,为了加深印象,我自己再尝试总结一下 1.定义: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法 ...

  5. Java设计模式中适配器模式的实现方法

    在Java开发中,我们常常需要用到Java接口型模式中的适配器模式,那适配器设计模式到底是什么模式呢? 适配器模式(Adapter)就是把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹 ...

  6. 夜话JAVA设计模式之适配器模式(adapter pattern)

    适配器模式:将一个类的接口,转换成客户期望的另一个接口,让不兼容的接口变成兼容. 1.类适配器模式:通过多重继承来实现适配器功能.多重继承就是先继承要转换的实现类,再实现被转换的接口. 2.对象适配器 ...

  7. java设计模式之适配器模式

    说到适配器,我们可能会想到电脑的适配器,没错,其实作用是一样的,电脑的适配器在中国可以使用,在美国也可以使用,它的主要作用是在新接口和老接口之间进行适配..这就是一个适配的过程,适配器模式的类图如下: ...

  8. java设计模式之——适配器模式

    适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的用途 用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极.阴极 ...

  9. java设计模式之六适配器模式(Adapter)

    适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式.首先,我们来看看类的适配器模 ...

随机推荐

  1. Linux文件目录管理

    Linux文件目录管理 文件的路径 路径: . 表示当此层目录 .. 表示上一层目录 - 代表前一个工作目录 ~ 代表"目前用户身份"所在的文件夹 ~account 代表accou ...

  2. Picasso加载网络图片失败,提示decodestream时返回null

    最近遇到一个问题,项目用的图片加载框架是Picasso,网络加载框架是okhttp,项目在加载轮播图时有时可以正常加载,有时,会加载失败,提示decodestream时返回null. 首先,需要确定是 ...

  3. Windows环境下执行hadoop命令出现Error: JAVA_HOME is incorrectly set Please update D:\SoftWare\hadoop-2.6.0\conf\hadoop-env.cmd错误的解决办法(图文详解)

    不多说,直接上干货! 导读   win下安装hadoop 大家,别小看win下的安装大数据组件和使用  玩过dubbo和disconf的朋友们,都知道,在win下安装zookeeper是经常的事   ...

  4. C/C++ -- Gui编程 -- Qt库的使用 -- 组件大杂烩

  5. 一步步用svg做一个声波扩散动画

    有个项目需要在某个坐标显示一个声波扩散(不知道这个表达对不对)的动画. 这种需求一般做法有几种,一种做成gif图片,然后贴上去,一种是用html+css3完成,要么就是画上去,这画又分两种,一种是Ca ...

  6. 如何自学计算机科学与技术(Teach Yourself Computer Science)

    如果你是一个自学成才的半吊子,或者是从培训班毕业的小菜鸟.那么,你欠自己一份计算机科学的专业知识.感谢上帝,如今你可以接受世界水平的计算机教育,但无需花费数年时间和一笔不小的金钱. 互联网上的学习资源 ...

  7. 数据库报错com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'ua' at row 1

    记一次报错记录,成长路上的点滴 明明使用浏览器或者微信开发工具调试接口没有问题,但是在真机测试时候就出问题了.(((¬_¬)) 500服务器内部错误,要死的节奏啊 登陆tomcat服务器 使用命令ta ...

  8. Go 程序执行顺序

    在一个 go 程序中通常包含:包.常量.变量.init().main()等元素,如果同时存在多个包,包之间存在依赖关系,每个包中存在多个 init 函数,每个文件中存在多个 init 函数,那么问题来 ...

  9. java中的复制数组arraycopy()

    System.arraycopy();//静态方法,在System类中定义,注意copy首字母是小写的 例子: int[] a = {1,2,3,4,5}; int[] b = {9,8,7,6}; ...

  10. T-SQL 片段收藏

    存储过程 CREATE PROCEDURE spInsertOrUpdateProduct --有则更新,否则插入 ) , ) , @StdCost MONEY AS IF EXISTS ( SELE ...