• 不兼容结构的协调—适配器模式(二)


    9.3 完整解决方案

          Sunny软件公司开发人员决定使用适配器模式来重用算法库中的算法,其基本结构如图9-4所示:

    9-4  算法库重用结构图

           在图9-4中,ScoreOperation接口充当抽象目标,QuickSortBinarySearch类充当适配者,OperationAdapter充当适配器。完整代码如下所示:

    1. //抽象成绩操作类:目标接口  
    2. interface ScoreOperation  
    3.     public int[] sort(int array[]); //成绩排序  
    4.     public int search(int array[],int key); //成绩查找  
    5.  
    6.   
    7. //快速排序类:适配者  
    8. class QuickSort  
    9.     public int[] quickSort(int array[])  
    10.         sort(array,0,array.length-1);  
    11.         return array;  
    12.      
    13.   
    14.     public void sort(int array[],int p, int r)  
    15.         int q=0 
    16.         if(p
    17.             q=partition(array,p,r);  
    18.             sort(array,p,q-1);  
    19.             sort(array,q+1,r);  
    20.          
    21.      
    22.   
    23.     public int partition(int[] a, int p, int r)  
    24.         int x=a[r];  
    25.         int j=p-1 
    26.         for (int i=p;i<=r-1;i++)  
    27.             if (a[i]<=x)  
    28.                 j++;  
    29.                 swap(a,j,i);  
    30.              
    31.          
    32.         swap(a,j+1,r);  
    33.         return j+1  
    34.      
    35.   
    36.     public void swap(int[] a, int i, int j)     
    37.         int a[i];     
    38.         a[i] a[j];     
    39.         a[j] t;     
    40.      
    41.  
    42.   
    43. //二分查找类:适配者  
    44. class BinarySearch  
    45.     public int binarySearch(int array[],int key)  
    46.         int low 0 
    47.         int high array.length -1 
    48.         while(low <= high)  
    49.             int mid (low high) 2 
    50.             int midVal array[mid];  
    51.             if(midVal key)    
    52. low mid +1   
    53.  
    54.             else if (midVal key)    
    55. high mid -1   
    56.  
    57.             else    
    58. return 1//找到元素返回1    
    59.  
    60.          
    61.         return -1 //未找到元素返回-1  
    62.      
    63.  
    64.   
    65. //操作适配器:适配器  
    66. class OperationAdapter implements ScoreOperation  
    67.     private QuickSort sortObj; //定义适配者QuickSort对象  
    68.     private BinarySearch searchObj; //定义适配者BinarySearch对象  
    69.   
    70.     public OperationAdapter()  
    71.         sortObj new QuickSort();  
    72.         searchObj new BinarySearch();  
    73.      
    74.   
    75.     public int[] sort(int array[])    
    76. return sortObj.quickSort(array); //调用适配者类QuickSort的排序方法  
    77.  
    78.   
    79.     public int search(int array[],int key)    
    80. return searchObj.binarySearch(array,key); //调用适配者类BinarySearch的查找方法  
    81.  
    82.  

           为了让系统具备良好的灵活性和可扩展性,我们引入了工具类XMLUtil和配置文件,其中,XMLUtil类的代码如下所示:

    1. import javax.xml.parsers.*;  
    2. import org.w3c.dom.*;  
    3. import org.xml.sax.SAXException;  
    4. import java.io.*;  
    5. class XMLUtil  
    6. //该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象  
    7.     public static Object getBean()  
    8.         try  
    9.             //创建文档对象  
    10.             DocumentBuilderFactory dFactory DocumentBuilderFactory.newInstance();  
    11.             DocumentBuilder builder dFactory.newDocumentBuilder();  
    12.             Document doc;                             
    13.             doc builder.parse(new File("config.xml"));   
    14.           
    15.             //获取包含类名的文本节点  
    16.             NodeList nl doc.getElementsByTagName_r("className");  
    17.             Node classNode=nl.item(0).getFirstChild();  
    18.             String cName=classNode.getNodeValue();  
    19.               
    20.             //通过类名生成实例对象并将其返回  
    21.             Class c=Class.forName(cName);  
    22.             Object obj=c.newInstance();  
    23.             return obj;  
    24.             
    25.         catch(Exception e)  
    26.             e.printStackTrace();  
    27.             return null 
    28.          
    29.      
    30.  

           配置文件config.xml中存储了适配器类的类名,代码如下所示:

  • 相关阅读:
    如何在自定义端口上运行 Spring Boot 应用程序
    如何重新加载Spring Boot 上的更改,而无需重新启动服务器
    JavaConfig
    常用的linux指令
    接口绑定有几种实现方式,分别是怎么实现的?
    JDK,JRE,JVM三者关系
    final finally finalize区别
    execute,executeQuery,executeUpdate的区别是什么?
    相对于Statement,PreparedStatement的优点是什么?
    JDBC访问数据的基本步骤是什么
  • 原文地址:https://www.cnblogs.com/luckForever/p/7254873.html
Copyright © 2020-2023  润新知