正好看到Android中使用ListAdapter往ListView中添加信息,想起来Adapter适配器设计模式,拿出来学习了下
适配器模式的定义
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。(GoF)
综合一些资料来看,适配器达到的目的基本就是我有一个接口,而如今我需要扩展这个接口来实现一些新的特定功能,而这些功能又已经包含在了其他类中。我们自然是希望可以直接去使用这些已经写好的方法,而不用自己再动手,这时就用到了适配器模式,即创建一个新的类作为2者之间的桥梁
适配器模式有2种形式:类适配器,对象适配器
首先是类适配器
盗用一下UML图,这次没有自己画
情景:我们需要实现Target,而我们需要的功能Request()又已经在一个已经存在的类Adatpee中实现了,也就是SpecificRequest(),这时我们创建一个Adapter类把2者连接起来
Target接口:
public interface Target {
public void Request();
}
已经实现了我们需要方法的Adaptee类
public class Adaptee {
public void SpecificRequest(){
System.out.print("I'm SpecialRequest");
}
}
创建一个Adapter将两者连接起来
public class Adapter extends Adaptee implements Target{
public void Request() {
super.SpecificRequest();
}
}
最终我们在Client中就可以直接使用该方法而不需要重复编码了
public class Client {
public static void main(String args[]){
Target target=new Adapter();
target.Request();
}
}
在这基础上,我们碰到了一个问题,如果我们的Target方法要实现多个Request,而这些Request又分别在不同的类中有实现,那怎么办,按照上面的办法,我们必须extends 1 2 3,但是Java是不允许多重继承的
这时,就出现了适配器类的第二种形式:对象适配器
同样盗用一张UML图
情景:仍然是我们有一个Target接口,其中包含了Request1(),Request2(),Request3()这3个我们需要的功能,而在不同的类Adaptee1,Adaptee2,Adaptee3中分别已经实现了我们需要的功能,现在需要创建一个适配器,将这些类与我们需要的Target连接起来
Target接口,包含3个需要实现的Request()方法
public interface Target {
public void Request1();
public void Request2();
public void Request3();
}
现有的Adaptee类1、2、3
public class Adaptee1 {
public void SpecificRequest1(){
System.out.println("I'm SpecialRequest1");
}
}
public class Adaptee2 {
public void SpecificRequest2(){
System.out.println("I'm SpecialRequest2");
}
}
public class Adaptee3 {
public void SpecificRequest3(){
System.out.println("I'm SpecialRequest3");
}
}
实现我们自己的适配器来连接2者
public class Adapter implements Target{
private Adaptee1 adaptee1;
private Adaptee2 adaptee2;
private Adaptee3 adaptee3;
public Adapter(Adaptee1 ad1,Adaptee2 ad2,Adaptee3 ad3){
this.adaptee1=ad1;
this.adaptee2=ad2;
this.adaptee3=ad3;
}
public void Request1(){
adaptee1.SpecificRequest1();
}
public void Request2(){
adaptee2.SpecificRequest2();
}
public void Request3(){
adaptee3.SpecificRequest3();
}
}
最终在Client中使用
public class Client {
public static void main(String args[]){
Adaptee1 ad1=new Adaptee1();
Adaptee2 ad2=new Adaptee2();
Adaptee3 ad3=new Adaptee3();
Target target=new Adapter(ad1,ad2,ad3);
target.Request1();
target.Request2();
target.Request3();
}
}
适配器并不是通过继承来获取适配类(原)的功能的,而是通过适配类的对象来获取的,这就解决了java不能多继承所带来的不便了。这也是java提倡的编程思想之一,即尽量使用聚合不要使用继承。
另外一种对象适配器使用的情况
当Target成为一个类的时候
Target类
public class Target {
public void Request(){
System.out.println("I'm Request");
}
}
Adaptee类
public class Adaptee {
public void SpecificRequest(){
System.out.print("I'm SpecialRequest");
}
}
实现的Adapter
public class Adapter extends Target{
private Adaptee ad;
public Adapter(Adaptee ad){
super();
this.ad=ad;
}
public void Request(){
ad.SpecificRequest();
}
}
Client中的使用
public class Client {
public static void main(String args[]){
Adaptee ad=new Adaptee();
Target target=new Adapter(ad);
target.Request();
}
}
即 将Adaptee聚合到Adapter中
最后是所谓的隐藏接口的抽象适配器,例子就是WindowAdapter,它实现了接口WindowsListener中的所有方法,但都是空实现,这样在使用的时候,就不必继承所有方法,而只需要实现我们需要的方法即可。
- 大小: 15.5 KB
- 大小: 15 KB
分享到:
相关推荐
这篇“Android Training学习笔记”主要围绕这两个组件展开,旨在帮助开发者提升他们的Android应用设计能力。 RecyclerView是Android SDK提供的一种列表视图控件,取代了早期的ListView。RecyclerView的优势在于它的...
在本笔记中,我们将探讨设计模式的核心概念,并通过具体的例子——`PizzaIngredientFactory`来实践这些模式。 首先,设计模式分为三大类:创建型、结构型和行为型模式。创建型模式关注对象的创建,如单例模式...
这份压缩包包含了博主在学习过程中记录的详细笔记,以及一份精心整理的设计模式表格,旨在帮助备考者系统、高效地掌握相关知识。 首先,我们来探讨一下“软考”——这是一项国家级的专业技术资格认证考试,旨在评测...
本课程笔记主要涵盖了软件架构的重要概念、设计模式、评估标准以及实际应用,旨在帮助学习者深入理解并掌握软件架构设计的核心知识。 一、软件体系结构基本概念 软件体系结构是软件系统的高级构造,它描述了系统的...
《Flyback反激设计总结——基于UC38423的开关电源12V2.5A原理图及PCB设计》 反激变换器在电子设备电源领域扮演着重要角色,尤其在中小功率应用中,如笔记本电脑适配器、手机适配器和工业电源等,其广泛应用得益于其...
描述中提到的"NDIS过滤驱动 小端口驱动 参考文章,DOC类型",暗示了我们有两个文档资料,分别是"NDISWDM驱动学习笔记.doc"和"NDIS驱动框架探究.doc",这两份文档可能是深入解析NDIS驱动技术,特别是小端口驱动和过滤...
1. **初始化**:设置蓝牙适配器,使其进入可发现模式,准备与其他设备配对。 2. **配对与连接**:用户在计算机上选择蓝牙鼠标并进行配对。过程中会涉及到安全认证,确保只有授权的设备能连接。 3. **HID报告描述符**...
《电子功用-基于原边反馈的反激式变换器的控制方法及控制电路》这篇行业资料主要探讨了电源转换领域中的一个重要技术——原边反馈...通过学习和理解其中的内容,读者能够提升在反激式变换器设计和优化方面的专业技能。
1. **MVC模式**:许多Java应用程序,尤其是用户界面(UI)相关的,通常遵循模型-视图-控制器(Model-View-Controller, MVC)设计模式。在笔记应用中,模型存储笔记数据,视图负责显示,控制器处理用户交互。 2. **...
这些资料对于理解USB3.0规范、学习如何使用CYUSB3014芯片进行USB设备设计以及进行实际项目开发都非常有价值。开发者可以通过阅读这些资料,深入了解USB3.0的工作原理,并掌握如何利用Cypress的USB3.0控制器来构建高...
### Mini PCI 1.0 规范解析 #### 一、引言 ...通过对这份规范的学习和理解,开发者能够更好地掌握Mini PCI的技术特点,并将其应用于实际产品中,从而满足市场对小型、高性能、低功耗扩展卡的需求。
《构建带搜索动画的笔记应用:使用Room数据库与Android AAC技术》 ...开发者可以通过研究该项目的源代码,学习到Android数据库操作、MVVM架构模式、动画设计等多个方面的知识,进一步提升自己的Android开发技能。