Design Pattern: Adapter 模式 - Object Adapter
您的电脑是个旧电脑,新的滑鼠都在使用USB接口了,而您的电脑上并没有USB,而只有一个PS2接口,这时您可以使用一个USB转PS2的接头作为转换,这样您的电脑就可以使用新滑鼠了(当然您也可以使用USB扩充卡,意思是相同的)。
类似的概念,有时候您想在原来的程式中加入一个外部元件,例如一个类别,但是这个类别与您目前所设计的程式在介面上并不一致,为了让这个外部类与原程式的介面一致,您必须使用一个类别作为中介来配接它们,这时您可以采用Adapter模式。
举个例子来说,在Java 1.0中有个Enumeration,您在这个版本发行之后,使用它来设计了一个MessageApplication,例如:
MessageApplication.java
import java.util.*; public class MessageApplication { public void showAllMessage(Enumeration enum) { Object msg; while(enum.hasMoreElements()) { msg = enum.nextElement(); System.out.println(msg); } } }
您的客户端程式是这么使用MessageApplication的:
MessageClient.java
import java.util.*; public class MessageClient { private MessageApplication msgApp; public void run() { Vector vector = new Vector(); for(int i = 0; i < 10; i++) vector.addElement("物件 " + i); msgApp = new MessageApplication(); msgApp.showAllMessage(vector.elements()); } public static void main(String[] args) { MessageClient msgClient = new MessageClient(); msgClient.run(); } }
现在Java 1.2中新增了Iterator,您想要使用它的功能,但基本上您不想更动原来程式中已设计好的MessageApplication类别,这时候您可以 使用Adapter模式,将Iterator的介面转换为Enumeration相容,例如:
IteratorAdapter.java
import java.util.*; public class IteratorAdapter implements Enumeration { private Iterator iterator; IteratorAdapter(Iterator iterator) { this.iterator = iterator; } // 转接介面 public boolean hasMoreElements() { return iterator.hasNext(); } public Object nextElement() throws NoSuchElementException { return iterator.next(); } }
您可以在客户端程式中照样使用MessageApplication类别,而不用作任何的变动:
MessageClient.java
import java.util.*; public class MessageClient { // We could still use MessageApplication private Enumeration iteratorAdapter; public void run() { List arrayList = new ArrayList(); for(int i = 0; i < 10; i++) arrayList.add("物件 " + i); iteratorAdapter = new IteratorAdapter(arrayList.iterator()); // We could still use MessageApplication MessageApplication msgApp = new MessageApplication(); msgApp.showAllMessage(iteratorAdapter); } public static void main(String[] args) { MessageClient msgClient = new MessageClient(); msgClient.run(); } }
如程式所示的,透过Adapter模式,您原有程式中已设计好的类别不用更动,就可以引进新类别的功能,将上面的程式UML类别结构画出如下:
上面的作法,是将要引进的新类别当作Adapter类别的一个物件成员,这是IbObject Adapter模式,其抽象结构如下:
相关推荐
Android ObjectAdapter Version: Java Kotlin Adapter that is similar to the ObjectAdapter (ArrayObjectAdapter) from the Leanback support library. ChangeLog 1.4 migrate to androidx Gradle Java ...
Adapter模式与Decorator模式 - **Adapter模式**:允许不兼容的接口协同工作。 - **Decorator模式**:动态地给一个对象添加一些额外的职责,提供了比继承更有弹性的替代方案。 ##### 9. Abstract Factory模式与...
-- Adapter -- Bridge -- Composite -- Decorator - Done -- Facade -- Flyweight -- Private Class Data -- Proxy 行为设计模式 -- Chain of Responsibility -- Command -- Interpreter -- Iterator -- Mediator ...
5. **数据结构与适配器绑定**: 在使用SimpleAdapter时,数据通常以List, Object>>的形式存在,其中Map的键对应于布局文件中控件的ID,值则是要显示的数据。自定义Adapter则需要继承BaseAdapter类,重写其中的方法,...
适配器可以作为类结构(Class Adapter)或对象结构(Object Adapter)实现。 1. 类结构适配器:适配器作为一个基类,继承自原始接口,并实现目标接口。这种情况下,适配器类和适配对象之间存在继承关系。 2. 对象...
2. 结构型模式(Structural Patterns):关注类和对象的组合,如适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)和享元模式...
android-Stupid-Adapter 一个比较蠢的adapter,一切只是为了少写两行代码, 支持listview,gridView, recyclerview, 的... 1.1.1 解释 XAdapter2 adapter //存放在adapter里的数据格式,也可以指定object 例子 XAdapter
2.4.2 根据Adapter模式进行重构 2.4.3 利用企业模式 2.5 小结 第Ⅱ部分 剖析ASP.NET应用程序:学习并应用模式 第3章 应用程序分层与关注点分离 3.1 应用程序体系结构与设计 3.1.1 反模式:智能UI 3.1.2 ...
例如,EJB(Enterprise JavaBeans)中的会话bean和实体bean体现了工厂模式和单例模式,而Hibernate作为流行的ORM(Object-Relational Mapping)框架,其核心机制就是数据访问对象(DAO)模式。 总之,设计模式是...
- **Data Formats**:支持Object和String CSV两种数据格式,便于解析和传输不同类型的数据。 #### 6. The Relational Database Adapter Relational Database Adapter使得Esper能够与关系型数据库进行交互。 - **...
4. **软件开发中的Adapter模式**:在软件设计中,适配器模式是一种常用的设计模式,用于将已有类的接口转换成客户端期望的另一种接口。这有助于解决因接口不兼容而带来的问题,特别是在现有代码基础上进行扩展时非常...
6. Adapter Class/Object(适配器) 7. Bridge(桥接) 8. Composite(组合) 9. Decorator(装饰) 10. Facade(外观) 11. Flyweight(享元) 12. Proxy(代理) 行为型 13. Interpreter(解释器) 14. ...
在本文中,我们将深入探讨如何在 Laravel 开发中利用阿里云OSS(Object Storage Service)作为存储解决方案。阿里云OSS是一种高度可扩展、安全可靠的云存储服务,它允许开发者和企业存储和管理大量数据。Laravel 5.0...
axios-mp-适配器安装使用npm: npm i axios-mp-adapter --save-dev例子var axios = require ( 'axios' ) ;var mpAdapter = require ( 'axios-mp-adapter' ) ;axios ( { url : 'https://foo.bar' , adapter : ...
为此,链中的每个链接都必须是ObjectAdapter的实例或可访问的属性。用法假设您有一个带有某些属性的对象,即我们的目标对象。 $ targetObject = new \stdClass();$ targetObject -> foo = 'bar' ; 我们从Object...
★第1章至第11章陆续介绍了设计模式:Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton、Command、Adapter、Facade、TemplatMethod、Iterator、Composite、State、Proxy。 ★第12章介绍...
在本文中,我们将深入探讨`Laravel开发-laravel-cos-v4-adapter`这个项目,它是一个专门为Laravel框架设计的腾讯云COS (Cloud Object Storage) v4适配器。腾讯COS是一款高效、安全、易用的云存储服务,而`laravel-...
本文研究的主要是python实现Adapter模式的相关内容,具体实现代码如下。 Adapter模式有两种实现方式一种是类方式。 #理解 #就是电源适配器的原理吧,将本来不兼容的接口类能够工作 #这个是类实现方式 #例子 #假如一...