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

转载 2013年12月06日 12:29:31

9.3 完整解决方案

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

9-4  算法库重用结构图

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

[java] view plaincopy
  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<r) {  
  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 t = 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类的代码如下所示:

[java] view plaincopy
  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("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中存储了适配器类的类名,代码如下所示:

[html] view plaincopy
  1. <?xml version="1.0"?>  
  2. <config>  
  3.     <className>OperationAdapter</className>  
  4. </config>  

       编写如下客户端测试代码:

[java] view plaincopy
  1. class Client {  
  2.     public static void main(String args[]) {  
  3.         ScoreOperation operation;  //针对抽象目标接口编程  
  4.         operation = (ScoreOperation)XMLUtil.getBean(); //读取配置文件,反射生成对象  
  5.         int scores[] = {84,76,50,69,90,91,88,96}; //定义成绩数组  
  6.         int result[];  
  7.         int score;  
  8.           
  9.         System.out.println("成绩排序结果:");  
  10.         result = operation.sort(scores);  
  11.   
  12.         //遍历输出成绩  
  13.         for(int i : scores) {  
  14.             System.out.print(i + ",");  
  15.         }  
  16.         System.out.println();  
  17.           
  18.         System.out.println("查找成绩90:");  
  19.         score = operation.search(result,90);  
  20.         if (score != -1) {  
  21.             System.out.println("找到成绩90。");  
  22.         }  
  23.         else {  
  24.             System.out.println("没有找到成绩90。");  
  25.         }  
  26.           
  27.         System.out.println("查找成绩92:");  
  28.         score = operation.search(result,92);  
  29.         if (score != -1) {  
  30.             System.out.println("找到成绩92。");  
  31.         }  
  32.         else {  
  33.             System.out.println("没有找到成绩92。");  
  34.         }  
  35.     }  
  36. }  

        编译并运行程序,输出结果如下:

成绩排序结果:

50,69,76,84,88,90,91,96,

查找成绩90

找到成绩90

查找成绩92

没有找到成绩92

       在本实例中使用了对象适配器模式,同时引入了配置文件,将适配器类的类名存储在配置文件中。如果需要使用其他排序算法类和查找算法类,可以增加一个新的适配器类,使用新的适配器来适配新的算法,原有代码无须修改。通过引入配置文件和反射机制,可以在不修改客户端代码的情况下使用新的适配器,无须修改源代码,符合“开闭原则”。

【作者:刘伟  http://blog.csdn.net/lovelion

相关文章推荐

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

9.3 完整解决方案      Sunny软件公司开发人员决定使用适配器模式来重用算法库中的算法,其基本结构如图9-4所示:图9-4  算法库重用结构图       在图9-4中,ScoreOpera...
  • LoveLion
  • LoveLion
  • 2013年03月01日 00:31
  • 13164

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

4 类适配器        除了对象适配器模式之外,适配器模式还有一种形式,那就是类适配器模式,类适配器模式和对象适配器模式最大的区别在于适配器和适配者之间的关系不同,对象适配器模式中适配器和适配者...
  • Mark_LQ
  • Mark_LQ
  • 2015年07月10日 20:14
  • 294

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

9.6 缺省适配器              缺省适配器模式是适配器模式的一种变体,其应用也较为广泛。缺省适配器模式的定义如下:缺省适配器模式(Default Adapter Pattern):当不需...
  • LoveLion
  • LoveLion
  • 2013年03月01日 09:23
  • 11501

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

我的笔记本电脑的工作电压是20V,而我国的家庭用电是220V,如何让20V的笔记本电脑能够在220V的电压下工作?答案是引入一个电源适配器(AC Adapter),俗称充电器或变压器,有了这个电源...
  • Mark_LQ
  • Mark_LQ
  • 2015年07月10日 19:38
  • 528

不兼容结构的协调——适配器模式

什么是适配器模式在适配器模式中引入了一个被称为适配器(Adapter)的包装类,而它所包装的对象称为适配者(Adaptee),即被适配的类。适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用...
  • Todo_
  • Todo_
  • 2016年03月01日 14:40
  • 489

不兼容结构的协调——适配器模式(二):算法库适配器模式解决方案

9.3 完整解决方案Sunny软件公司开发人员决定使用适配器模式来重用算法库中的算法,其基本结构如图9-4所示:在图9-4中,ScoreOperation接口充当抽象目标,QuickSort和Bina...
  • will130
  • will130
  • 2016年01月14日 17:19
  • 128

不兼容结构的协调——适配器模式(一):适配器模式概述

我的笔记本电脑的工作电压是20V,而我国的家庭用电是220V,如何让20V的笔记本电脑能够在220V的电压下工作?答案是引入一个电源适配器(AC Adapter),俗称充电器或变压器,有了这个电源适配...
  • will130
  • will130
  • 2016年01月14日 16:24
  • 180

设计模式之七:适配器模式—不兼容结构的协调

通过增加新的适配器类来解决接口不兼容的问题 一、适配器模式概述: 讲一个借口转换成客户希望的另一个接口,使借口不兼容的那些类可以一起工作,其别名为包...

不兼容结构的协调——适配器模式(四):缺省适配器,适配器模式总结

9.6 缺省适配器缺省适配器模式是适配器模式的一种变体,其应用也较为广泛。缺省适配器模式的定义如下:缺省适配器模式(Default Adapter Pattern):当不需要实现一个接口所提供的所有方...
  • will130
  • will130
  • 2016年01月15日 10:54
  • 404

不兼容模式的协调--适配器模式(Adapter)

适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。比如你手机只有2.5mm接口...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不兼容结构的协调——适配器模式(二)
举报原因:
原因补充:

(最多只允许输入30个字)