• 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

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

    Adapter

  • 相关阅读:
    服务端实现url网页截屏、HTML保存为高质量PDF[puppeteer]
    网页保存为图片[rasterizeHTML]
    SortedList<T,K>,SortedDictionary<T,K>,Dictionay<T,K>用法区别
    svn实现类似git stash及git stash pop的功能
    MSBuild报错及找不到AxImp.exe或LC.exe问题
    记一个ios下text-overflow: ellipsis 与 text-align: justify 冲突的问题
    Chrome devtools inspect后打开空白解决办法
    Oracle长时间使用导致连接变慢且频繁报无法找到监听程序的错误
    vscode+vue不得不用的插件和不得不添加的配置
    初识vscode+vue
  • 原文地址:https://www.cnblogs.com/rollenholt/p/2467025.html
Copyright © 2020-2023  润新知