`

06 Adapter 模式 - Object Adapter

 
阅读更多

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模式,其抽象结构如下:



 转自:http://www.riabook.cn/doc/designpattern

  • 大小: 8.2 KB
  • 大小: 8.2 KB
分享到:
评论

相关推荐

    Android代码-android-object-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 ...

    Fudan Univ-Object Oriented Design Lecture Notes

    Adapter模式与Decorator模式 - **Adapter模式**:允许不兼容的接口协同工作。 - **Decorator模式**:动态地给一个对象添加一些额外的职责,提供了比继承更有弹性的替代方案。 ##### 9. Abstract Factory模式与...

    CoreJava-DesignPattern

    -- Adapter -- Bridge -- Composite -- Decorator - Done -- Facade -- Flyweight -- Private Class Data -- Proxy 行为设计模式 -- Chain of Responsibility -- Command -- Interpreter -- Iterator -- Mediator ...

    5-ListView-SimpleAdapter及自定义Adapter-进阶2.rar

    5. **数据结构与适配器绑定**: 在使用SimpleAdapter时,数据通常以List, Object&gt;&gt;的形式存在,其中Map的键对应于布局文件中控件的ID,值则是要显示的数据。自定义Adapter则需要继承BaseAdapter类,重写其中的方法,...

    C++设计模式代码资源16_Adapter.zip

    适配器可以作为类结构(Class Adapter)或对象结构(Object Adapter)实现。 1. 类结构适配器:适配器作为一个基类,继承自原始接口,并实现目标接口。这种情况下,适配器类和适配对象之间存在继承关系。 2. 对象...

    设计模式-可复用面向对象软件的基础.rar

    2. 结构型模式(Structural Patterns):关注类和对象的组合,如适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)和享元模式...

    Android代码-android-Stupid-Adapter

    android-Stupid-Adapter 一个比较蠢的adapter,一切只是为了少写两行代码, 支持listview,gridView, recyclerview, 的... 1.1.1 解释 XAdapter2 adapter //存放在adapter里的数据格式,也可以指定object 例子 XAdapter

    ASP.NET设计模式-杨明军译(源码)

    2.4.2 根据Adapter模式进行重构 2.4.3 利用企业模式 2.5 小结 第Ⅱ部分 剖析ASP.NET应用程序:学习并应用模式 第3章 应用程序分层与关注点分离 3.1 应用程序体系结构与设计 3.1.1 反模式:智能UI 3.1.2 ...

    设计模式-Java语言中的应用(pdf)

    例如,EJB(Enterprise JavaBeans)中的会话bean和实体bean体现了工厂模式和单例模式,而Hibernate作为流行的ORM(Object-Relational Mapping)框架,其核心机制就是数据访问对象(DAO)模式。 总之,设计模式是...

    esper_adapter_reference

    - **Data Formats**:支持Object和String CSV两种数据格式,便于解析和传输不同类型的数据。 #### 6. The Relational Database Adapter Relational Database Adapter使得Esper能够与关系型数据库进行交互。 - **...

    android开发Adapter详解

    4. **软件开发中的Adapter模式**:在软件设计中,适配器模式是一种常用的设计模式,用于将已有类的接口转换成客户端期望的另一种接口。这有助于解决因接口不兼容而带来的问题,特别是在现有代码基础上进行扩展时非常...

    23种设计模式 - 各种模式的学习

    6. Adapter Class/Object(适配器) 7. Bridge(桥接) 8. Composite(组合) 9. Decorator(装饰) 10. Facade(外观) 11. Flyweight(享元) 12. Proxy(代理) 行为型 13. Interpreter(解释器) 14. ...

    Laravel开发-aliyun-oss-adapter

    在本文中,我们将深入探讨如何在 Laravel 开发中利用阿里云OSS(Object Storage Service)作为存储解决方案。阿里云OSS是一种高度可扩展、安全可靠的云存储服务,它允许开发者和企业存储和管理大量数据。Laravel 5.0...

    axios-mp-adapter:允许在微信小程序中发出请求的Axios适配器

    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 : ...

    object-adapter:提供目标对象的适配器,可通过魔术获取器和设置器轻松访问属性

    为此,链中的每个链接都必须是ObjectAdapter的实例或可访问的属性。用法假设您有一个带有某些属性的对象,即我们的目标对象。 $ targetObject = new \stdClass();$ targetObject -&gt; foo = 'bar' ; 我们从Object...

    design patterns elements of reusable object-oriented software

    ★第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开发-laravel-cos-v4-adapter`这个项目,它是一个专门为Laravel框架设计的腾讯云COS (Cloud Object Storage) v4适配器。腾讯COS是一款高效、安全、易用的云存储服务,而`laravel-...

    python实现Adapter模式实例代码

    本文研究的主要是python实现Adapter模式的相关内容,具体实现代码如下。 Adapter模式有两种实现方式一种是类方式。 #理解 #就是电源适配器的原理吧,将本来不兼容的接口类能够工作 #这个是类实现方式 #例子 #假如一...

Global site tag (gtag.js) - Google Analytics