設計模式——適配器模式
1- 適配器模式的定義
適配器模式的定義:將一個類的接口轉換成客戶需要的另外一個接口。適配器模式使得原本由於接口不兼容而不能一起工作的那些類可以在一起工作,它結合了兩個獨立接口的功能。
No BB,Show Code!
2- 適配器模式具體實現代碼
2-1定義需要適配的接口及實現
適配器模式的出現都是因爲接口或者類與現在的實際系統不匹配造成的!
定義一個老接口,即需要適配的接口
package designPattern.test.adapter.interf;
/**
* 老接口,需要適配的接口
*/
public interface OldInterface {
void oldMethod();
}
實現類
package designPattern.test.adapter.impl;
import designPattern.test.adapter.interf.OldInterface;
/**
* 老接口的實現,被適配的類
*/
public class OldImpl implements OldInterface {
@Override
public void oldMethod() {
System.out.println("This is a OldInterface,old method!");
}
}
2-2定義新的接口及實現
定義一個現在系統使用的接口及實現
package designPattern.test.adapter.interf;
/**
* 新接口
*/
public interface NewInterface{
void newMethod();
}
實現類
package designPattern.test.adapter.impl;
import designPattern.test.adapter.interf.NewInterface;
/**
* 新接口
*/
public class NewImpl implements NewInterface {
@Override
public void newMethod() {
System.out.println("This is a NewImpl newMethod");
}
}
2-3定義適配器
假設現在其他系統只能使用NewInterface的實現,這就需要使用適配器模式構造一個適配器對象。
package designPattern.test.adapter;
import designPattern.test.adapter.impl.NewImpl;
import designPattern.test.adapter.interf.OldInterface;
/**
* 適配器,將需要適配的接口或類作爲構造器參數傳入
*/
public class OldNewAdapter extends NewImpl {
private OldInterface oldInterface;
public OldNewAdapter(OldInterface oldInterface) {
this.oldInterface = oldInterface;
}
@Override
public void newMethod() {
super.newMethod();
}
@Override
public void oldMethod() {
oldInterface.oldMethod();
}
}
3- 測試
測試代碼如下
package designPattern.test.adapter;
import designPattern.test.adapter.impl.OldImpl;
import org.junit.Test;
/**
* 測試類
*/
public class TestAdapter {
@Test
public void testAdapter(){
OldNewAdapter adapter = new OldNewAdapter(new OldImpl());
adapter.oldMethod();
adapter.newMethod();
}
}
打印結果:
This is a OldInterface,old method!
This is a NewImpl newMethod
總結:適配器模式結合兩個獨立接口的功能!在使用時確定需要適配的類,適配的方法,這樣就可以重用之前的接口和具體的實現!
4- 適配器模式典型應用
JDK中java.io包下的InputStreamReader就是適配器模式的典型應用,將一個InputStream對象作爲傳參傳入InputStreamReader的構造器中,返回一個Reader的具體實現類,實現了從字節流到字符流的適配,具體代碼如下:
package designPattern.test.adapter.file;
import org.junit.Test;
import java.io.*;
/**
* InputStreamReader測試
*/
public class FileAdapterTest {
/**
* 適配器模式將一個InputStream接口適配成Reader接口
*/
@Test
public void testFileAdapter() throws Exception {
long start = System.currentTimeMillis();
Reader reader = new InputStreamReader(new FileInputStream(new File("D:/trace.log")));
printLog(reader);
System.out.println("============================Time:" + (System.currentTimeMillis() - start));
}
private void printLog(Reader reader) throws Exception {
int i = 0;
char[] chars = new char[1024];
while ((i = reader.read(chars)) != -1) {
String s = new String(chars);
System.out.println(s);
}
}
}
對於文本文件,使用字符流可以獲得更高的IO性能,但是在只有文本字節流的對象的情況下就可以使用InputStreamReader實現從InputStream到Reader的適配。