`
Fis
  • 浏览: 86393 次
  • 性别: Icon_minigender_1
  • 来自: 龙城
社区版块
存档分类
最新评论

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


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


我的小结:使用原有的方法名包装新类中的方法,达到与原有代码无缝联合工作的目的。
  • 大小: 8.2 KB
  • 大小: 8.2 KB
分享到:
评论

相关推荐

    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章介绍...

    CoreJava-DesignPattern

    CoreJava-DesignPattern 创意设计模式 -- Abstract Factory - Done -- Builder - Done -- Factory Method -- Object Pool -- Prototype - Done -- Singleton - Done 结构设计模式 -- Adapter -- Bridge -- ...

    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;抽象工厂...

    Design Pattern(设计模式)讲义

    ### Design Pattern(设计模式)讲义 #### 一、引言 设计模式是软件工程领域的一个重要主题,它提供了一套解决常见问题的方案。侯捷老师的讲义为我们揭示了设计模式背后的原理与实践方法。这份讲义不仅包含了GoF...

    design pattern tutorial

    6. 适配器模式(Adapter Pattern):将一个类的接口转换为客户期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。适配器模式用于将一个类的接口转换成客户期望的另一个接口。 7. 桥接模式...

    Design Patterns in Modern C++--2018

    Reusable Approaches for Object-Oriented Software Design What You Will Learn Apply design patterns to modern C++ programming Use creational patterns of builder, factories, prototype and singleton ...

    DesignPattern4J:java设计模式练习

    "DesignPattern4J: java设计模式练习"项目可能包含了上述设计模式的实现和示例,通过阅读和实践这些代码,开发者可以更深入地理解设计模式的精髓,从而在实际项目中更好地运用这些模式,提升代码质量。项目的名称...

    Object-Oriented Analysis and Design 第六章

    - Adapter pattern allows objects with incompatible interfaces to work together by creating an adapter object that acts as a mediator. - Bridge pattern decouples an abstraction from its implementation,...

    C++设计模式的全实现

    根据所提供的内容,我们可以看到作者通过两个不同的方式实现了Adapter模式:一种是**类适配器**(Class Adapter),另一种是**对象适配器**(Object Adapter)。 #### 二、结构图 适配器模式的核心结构包括四个主要...

    liang-faan_JavaDesignPattern.pdf

    3.5 适配器模式(Adapter Pattern) 适配器模式允许将一个类的接口转换成客户期望的另一个接口。它使原本接口不兼容的类可以一起工作,常见的用途是在系统设计中用于连接不兼容的接口。 3.6 桥接模式(Bridge ...

    Design Pattern

    总之,《Design Patterns: Elements of Reusable Object-Oriented Software》不仅是一本关于设计模式的权威指南,更是面向对象编程不可或缺的经典之作。无论对于初学者还是有经验的开发者来说,它都提供了宝贵的知识...

    设计模式与重构(design pattern )

    2. 结构型模式:包括适配器模式(Adapter)、桥接模式(Bridge)、装饰器模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、组合模式(Composite)和代理模式(Proxy)。这些模式主要处理对象之间的...

    Head First Object-Oriented Design and Analysis

    3. **适配器模式**(Adapter Pattern):将一个类的接口转换成客户希望的另一个接口。 4. **装饰者模式**(Decorator Pattern):动态地给一个对象添加一些额外的责任,无需通过子类实现。 5. **策略模式**...

    scala design patterns源书代码

    2. 单例模式(Singleton Pattern):Scala中的`object`关键字天然支持单例模式,确保一个类只有一个实例,并提供全局访问点。 3. 抽象类和特质(Abstract Classes and Traits):Scala中的抽象类和特质可以用来实现...

    Design Pattern Quick Reference Card

    ### 设计模式快速参考卡片 #### 一、概述 设计模式是软件工程中解决常见问题的一种通用解决方案。这些模式提供了一种标准化的方式来处理常见的编程挑战,帮助开发人员编写出更易于理解、维护和扩展的代码。本文将...

    oh-my-design-patterns::artist_palette:记录我在学习设计模式时编写的文章和代码

    :grinning_face:点击查看电子书,体验更好 :backhand_index_pointing_right: 创建型 (Creational)Java Kotlin结构型(Structural)适配器模式(Adapter Class/Object Pattern) Java桥接模式(Bridge Pattern) ...

    设计模式:可复用面向对象软件的基础--详细书签版

    原书名: Design Patterns:Elements of Reusable Object-Oriented software 原出版社: Addison Wesley/Pearson 作者: (美)Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides [作译者介绍] 译者: 李...

Global site tag (gtag.js) - Google Analytics