java 双适配器模式,初识Java设计模式适配器模式

news/2024/7/9 23:12:07 标签: java 双适配器模式

【正文】

我们知道,Android中最重要也是最难用的UI控件就是ListView列表控件,而要想灵活运用它,则必须要用到适配器adapter,所以,我觉得还是很有必要来学习一下Java当中的适配器模式(不管以后能不能用到),毕竟Java语言是Android开发很重要的一个基础。

完全了解适配器模式,有很多知识要学习,例如:适配器模式有类的适配器模式和对象的适配器模式两种不同的形式。但作为初学者,我就简单学习一下配器模式入门知识吧,以后会不断完善。希望奋斗在码农路上的童鞋们莫吐槽→_→

一、适配器介绍

•将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

•适配器模式在现代的Java框架中十分常用。这种模式适用于以下场景:想使用一个已存在的类,但是该类不符合接口需求;或者需要创建一个可重用的类,适配没有提供合适接口的其它类。

二、苹果和桔子的例子

适配器的思想可以通过下面这个简单的例子说明。这个示例要让一个桔子被“适配”成一个苹果。如下图所示:

13dd700b27c16c99b33148551af72e16.png

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

22ba5d23de2f28e91a035f3ad25dddc2.png

三、插座盒插头的例子

fe617737e1963aa067d7f8911d260a9a.png

上图中,我们可以通过中间的适配器让右边的插头成功连接上左边的插座。

四、插头适配器的代码实现

/**

适配器模式( 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("....一些重复的代码.....");

}

*/

}

//定义适配器类

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行代码。

运行效果如下:

73f19d31c397ecf007c4cd2b24ac562c.png

同理,如果我也想把PowerA作为PowerB去使用,可以再定义一个适配器PowerBAdapter,实现双向适配器。

五、小总结

上方第23、25行被注释掉的代码,表示是很多重复的代码,不符合面向对象的思维方式。我们现在设想这样一个例子:我们的项目已经上线并且客户正在使用,但是后来增加了一些新的需求。而面向对象有一条OO原则就是:对修改关闭(上线后,代码尽量不要修改,不然可能会发生连锁反应,导致其他调用此处方法的代码都可能出问题),对扩展开放(自己定义的新的方法,别人还没有调用,我们当然可以修改)。此时,我们可以通过适配器来减少这些重复的代码。

六、OO设计原则

•面向接口编程(面向抽象编程)

•封装变化

•多用组合,少用继承

•对修改关闭 对扩展开放

个人感觉,这些设计原则,需要在实践中不断加深理解,在这里就不过多描述了哦~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。


http://www.niftyadmin.cn/n/675099.html

相关文章

曾经的故乡

1998年的乌鲁木齐,现在已经变得俺都认不得啦。没有机会在她的金色季节回去,只能贴这些老照片,聊慰相思之意。一、妖魔山及乌鲁木齐火车站二、市政府(后面是乌鲁木齐电视台的发射塔)三、红山及乌鲁木齐——昌吉一级公路…

php 符号怎么用,PHP中基本符号及使用方法

5.批量输出HTML内容&#xff01;echo <<< EOTHTML输出内容。。。//这里注释照样输出&#xff01;EOT;Print <<HTML输出内容。。。//这里注释照样输出&#xff01;EOT;(注意&#xff1a;内部包含变量用“{变量}”)6.判断文件是否存在并且输出内容$FileName"…

权证是如何获利的?买权证用原来的深沪股东卡可以吗?

行权是怎么回事?怎么到期不行权就血本无归拉? 他跟股票在获利上有何不同?权证是如何获利的? ——和股票一样&#xff0c;高抛低吸&#xff1b; 买权证用原来的深沪股东卡可以吗? ——是的&#xff0c;但要到券商营业厅开通权证交易&#xff0c;在一份“权证交易风险揭示书…

人对阶级的演绎

2004.9.6 发表于加西 【光的演绎, 2004, 人物篇】转载于:https://www.cnblogs.com/chahua/archive/2009/07/29/1533623.html

一个投行顾问给创业者的五条建议

作为投资银行顾问&#xff0c;我负责的主要业务中有一块是投融资中介业务&#xff0c;也就是接受项目方的委托为其寻找投资者或资金&#xff0c;或者是接受资金方的委托为其物色适合投资的项目。4、创业者几乎没有自己的创业资金   创业者往往以为 <script type"text…

php 实例化 redis,tp5 实例化redis 出错,求解汗血宝马

框架内缓存驱动redis不能满足需要&#xff0c;想要自己连接redis,在助手函数中新增load_redis 函数代码如下/*** lubTicket redis 操作API* param string $apiport 要操作的接口* param string $key 键名* param string $value 键值* param string $time 有效时间…

QFII是什么意思?

QFII是英文Qualified Foreign Institutional Investors&#xff08;合格的境外机构投资者&#xff09;的简称。在QFII制度下&#xff0c;合格的境外机构投资者&#xff08;QFII&#xff09;将被允许把一定额度的外汇资金汇入并兑换为当地 货币&#xff0c;通过严格监督管理的专…

Lesson 5 Nice to meet you

英音版录音下载地址 http://bbs.enfamily.cn/upfile/nce/book1/NCE1005.mp3美音版录音 Listen to the tape then answer this question. Is Chang-woo Chinese?听录音&#xff0c;然后回答问题。 昌宇是中国人吗&#xff1f;MR. BLAKE: Good morning.STUDENTS: Good morning,…