`

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
分享到:
评论

相关推荐

    36种最新设计模式整理

    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代码-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 ...

    CoreJava-DesignPattern

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

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

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

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

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

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

    python实现Adapter模式实例代码

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

    Android代码-PowerAdapter

    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:面向对象设计

    java一个对象笔试题 Object oriented design —————————————————————— 1. Object oriented programming (oop) concepts Encapsulation inheritance ...Adapter Bridge Composite

    Data Structures And Algorithms With Object-Oriented Design Patterns In C Sharp.pdf

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

    Object-Oriented-Analysis-Design:面向对象的分析和设计(JAVA语言)设计模式,Java GUI

    家庭作业的主题: HW01: PART1-&gt;策略设计模式PART2-&gt;观察者设计模式PART3-&gt;装饰器设计模式HW02: PART1-&gt;单例设计模式PART2-&gt;迭代器设计模式PART3-&gt;状态和观察者模式PART4-&gt;代理设计模式中期: PART1-&gt;抽象工厂...

    用Java实现23种设计模式

    适配器模式(Adapter Pattern) 桥接模式(Bridge Pattern) 过滤器模式(Filter、Criteria Pattern) 组合模式(Composite Pattern) 装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式...

    CommonAdapter-通过封装BaseAdapter和RecyclerView.Adapter得到的通用的,简易的Adapter.zip

    提供了getConvertedData(data, type)方法来对item传入的数据做转换,方便拆包和提升item的复用性 支持viewpager的正常加载模式和懒加载 支持快速将listview的适配器切换为recyclerView的适配器 viewpager的...

    33种JAVA设计模式DEMO

    适配器模式(Adapter Pattern) 桥接模式(Bridge Pattern) 过滤器模式(Filter、Criteria Pattern) 组合模式(Composite Pattern) 装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式...

    YODA is Y Object Database Adapter-开源

    YODA(Y对象数据库适配器)是Python的OO对象库。 实际上,这不仅是另一个Python对象库。 YODA是完整的运行时环境,您可以在其中创建持久性对象,运行使用这些对象的可移植应用程序

    listviewAdapter

    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工程

    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    “总的来讲,这本书表达了一种极有价值的东西。对软件设计领域有着独特的贡献...

Global site tag (gtag.js) - Google Analytics