Design Pattern: Adapter 模式 - Object Adapter

简介:

  学习是分享和合作式的!

转载请注明出处:http://blog.csdn.net/wdzxl198/article/details/9344903

文章摘自: http://www.riabook.cn/doc/designpattern/

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

上面的作法,是将要引进的新类别当作Adapter类别的一个物件成员,这是IbObject Adapter模式,其抽象结构如下:

Adapter

Edit by Atlas,

Time:15:34

目录
相关文章
|
设计模式 Java 测试技术
软件测试/测试开发/全日制|Page Object模式:为什么它是Web自动化测试的必备工具
软件测试/测试开发/全日制|Page Object模式:为什么它是Web自动化测试的必备工具
|
7月前
|
设计模式 安全 Java
并发设计模式实战系列(12):不变模式(Immutable Object)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第十二章,废话不多说直接开始~
187 0
|
5月前
|
测试技术 API C++
Playwright 自动化测试系列(7)| 第三阶段:测试框架集成​​Page Object 模式
本课程详解Playwright测试框架中的Page Object模式,通过电商登录-下单实战演示PO架构设计与高级技巧,结合Pytest实现多用户测试。重点解析PO模式提升代码复用性、降低维护成本的核心价值,并提供常见问题解决方案,助力构建高可维护性的自动化测试体系。
|
Java 流计算
在Flink实时任务中,POJO(Plain Old Java Object)对象的模式演进可能会引起不兼容的问题
【2月更文挑战第6天】在Flink实时任务中,POJO(Plain Old Java Object)对象的模式演进可能会引起不兼容的问题
208 3
理论+实践:从原型链到继承模式,掌握 Object 的精髓(二)(下)
理论+实践:从原型链到继承模式,掌握 Object 的精髓(二)(下)
148 0
|
存储 JavaScript 前端开发
理论+实践:从原型链到继承模式,掌握 Object 的精髓(二)(上)
理论+实践:从原型链到继承模式,掌握 Object 的精髓(二)
181 0
|
存储 JavaScript 前端开发
理论+实践:从原型链到继承模式,掌握 Object 的精髓(一)
理论+实践:从原型链到继承模式,掌握 Object 的精髓(一)
180 0
|
设计模式 uml
空对象模式(Null Object Pattern)
空对象模式(Null Object Pattern)不属于GoF设计模式,但是它作为一种经常出现的模式足以被视为设计模式了。其具体定义为设计一个空对象取代NULL对象实例的检查。NULL对象不是检查控制,而是反映一个不做任何动作的关系。这样的NULL对象也可以在数据不可用的时候提供默认的行为,属于行为型设计模式。
275 0
|
设计模式 Java 数据库
对象池模式(Object Pool Pattern)
对象池模式(Object Pool Pattern),是创建型设计模式的一种,将对象预先创建并初始化后放入对象池中,对象提供者就能利用已有的对象来处理请求,减少频繁创建对象所占用的内存空间和初始化时间。
224 0
|
9月前
|
安全 IDE Java
重学Java基础篇—Java Object类常用方法深度解析
Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
280 1

热门文章

最新文章