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模式,其抽象结构如下:
相关推荐
Design Pattern: Adapter 模式 - Object Adapter 32 Design Pattern: Adapter 模式 - Class Adapter 36 Design Pattern: Bridge 模式 38 Design Pattern: Composite 模式 40 Design Pattern: Decorator 模式 41 ...
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 -- Bridge -- Composite -- Decorator - Done -- Facade -- Flyweight -- Private Class Data -- Proxy 行为设计模式 -- Chain of Responsibility -- Command -- Interpreter -- Iterator -- Mediator ...
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 ...
6. Adapter Class/Object(适配器) 7. Bridge(桥接) 8. Composite(组合) 9. Decorator(装饰) 10. Facade(外观) 11. Flyweight(享元) 12. Proxy(代理) 行为型 13. Interpreter(解释器) 14. ...
为此,链中的每个链接都必须是ObjectAdapter的实例或可访问的属性。用法假设您有一个带有某些属性的对象,即我们的目标对象。 $ targetObject = new \stdClass();$ targetObject -> foo = 'bar' ; 我们从Object...
本文研究的主要是python实现Adapter模式的相关内容,具体实现代码如下。 Adapter模式有两种实现方式一种是类方式。 #理解 #就是电源适配器的原理吧,将本来不兼容的接口类能够工作 #这个是类实现方式 #例子 #假如一...
public AnalogAdapter(@Nullable Object listener) { super(listener); } @Override public boolean isSelectable(@IntRange(from = 0) int position) { return true; } @Override public ...
各种工厂模式 242 第21章 Singleton模式和Double-Checked Locking模式 249 第22章 Object Pool模式 257 第23章 Factory Method模式 267 第24章 工厂模式的总结 272 第八部分 终点与起点 第25章 设计模式回顾:总结与...
java一个对象笔试题 Object oriented design —————————————————————— 1. Object oriented programming (oop) concepts Encapsulation inheritance ...Adapter Bridge Composite
used throughout the text: singleton, container, enumeration, adapter and visitor. Virtually all of the data structures are presented in the context of a single, unified, polymorphic class hierarchy. ...
家庭作业的主题: HW01: PART1->策略设计模式PART2->观察者设计模式PART3->装饰器设计模式HW02: PART1->单例设计模式PART2->迭代器设计模式PART3->状态和观察者模式PART4->代理设计模式中期: PART1->抽象工厂...
适配器模式(Adapter Pattern) 桥接模式(Bridge Pattern) 过滤器模式(Filter、Criteria Pattern) 组合模式(Composite Pattern) 装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式...
提供了getConvertedData(data, type)方法来对item传入的数据做转换,方便拆包和提升item的复用性 支持viewpager的正常加载模式和懒加载 支持快速将listview的适配器切换为recyclerView的适配器 viewpager的...
适配器模式(Adapter Pattern) 桥接模式(Bridge Pattern) 过滤器模式(Filter、Criteria Pattern) 组合模式(Composite Pattern) 装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式...
YODA(Y对象数据库适配器)是Python的OO对象库。 实际上,这不仅是另一个Python对象库。 YODA是完整的运行时环境,您可以在其中创建持久性对象,运行使用这些对象的可移植应用程序
Adapter的一种写法 package com.xxkjx.jiusanqi; import java.util.List; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; ...
C++设计模式代码: (VC工程) Creational Patterns Abstract Factory Creates an instance of several families of classes Builder Separates object construction from its representation Factory Method ...
如果要知道怎样恰当定义和描述设计模式,我们应该可以从他们那儿获得启发”--steve billow, journal of object-oriented programming “总的来讲,这本书表达了一种极有价值的东西。对软件设计领域有着独特的贡献...