博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Design Pattern: Adapter 模式 - Object Adapter
阅读量:6481 次
发布时间:2019-06-23

本文共 2356 字,大约阅读时间需要 7 分钟。

您的电脑是个旧电脑,新的滑鼠都在使用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();    }}

转载地址:http://kczuo.baihongyu.com/

你可能感兴趣的文章
linux shell 正则表达式(BREs,EREs,PREs)差异比较(转,当作资料查)
查看>>
MongoDB--CSharp Driver Quickstart .
查看>>
二分法求平方根(Python实现)
查看>>
使用startActivityForResult方法(转)
查看>>
so在genymotation中错误问题
查看>>
Visual Studio 原生开发的10个调试技巧(二)
查看>>
Windows内核再次出现0Day漏洞 影响win2000到win10所有版本 反病毒软件恐成瞎子
查看>>
H3C品牌刀片系统强势首发
查看>>
【CSS系列】图像映射
查看>>
First blood
查看>>
java 冒泡排序和快速排序 实现
查看>>
SQL存储过程中的几个常见设定SET QUOTED_IDENTIFIER/NOCOUNT/XACT_ABORT ON/OFF
查看>>
Silverlight与Flash区别之一
查看>>
删除恢复Hadoop集群中的DataNode
查看>>
Silverlight 2动态创建矩形对象(附完整源代码)
查看>>
PowerShell中对属性设置别名
查看>>
从京东技术演进看互联网企业的成长历程
查看>>
MFC ado+mysql+odbc技术分享
查看>>
js中让字符串中特定字符红色显示
查看>>
HttpClient4.5教程-第二章-连接管理
查看>>