您的位置:首页 > 编程语言 > Java开发

Java设计模式之适配器模式

2018-02-02 09:37 375 查看

1、适配器模式

1.1原理

适配器模式中的角色

目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

需要适配的类(Adaptee):需要适配的类或适配者类。

适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。

现方式主要有两种:

类的适配器模式(采用继承实现)

对象适配器(采用对象组合方式实现)

1.2 类的适配器(类的继承)

(1)目标接口

/**
* 目标接口,也就是我们期望的接口
* @author hadron
*
*/
public interface Target {
//普通功能
public void request();
}


(2)已有功能类

/**
* 已存在的、具有特殊功能、但不符合我们的要求
* @author hadron
*
*/
public class Adaptee {
public void specificRequest() {
System.out.println("三孔插座");
}
}


(3)适配器类

/**
* 适配器类,继承了被适配类Adaptee,同时实现标准接口Target
* @author hadron
*/
public class Adapter extends Adaptee implements Target{
@Override
public void request() {
System.out.println("适配器类:转换为双孔插座");
this.specificRequest();
}
}


(4)Client

public class AdapterDemo {
public static void main(String[] args) {
Target adapter = new Adapter();
//通过适配器调用特殊功能
adapter.request();
}
}


(5)运行结果

适配器类:转换为双孔插座
三孔插座


1.3 对象适配器(对象组合)

(1)适配器类

/**
* 适配器类,直接关联被适配类,同时实现标准接口
* 采用对象组合方式实现
* @author hadron
*
*/
public class AdapterObject implements Target{
// 直接关联被适配类
private Adaptee adaptee;
// 可以通过构造函数传入具体需要适配的被适配类对象
public AdapterObject(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
// 这里是使用委托的方式完成特殊功能
System.out.println("适配器类:转换为双孔插座");
this.adaptee.specificRequest();
}
}


(2)Client

public class AdapterObjectDemo {
public static void main(String[] args) {
Target adapter = new AdapterObject(new Adaptee());
adapter.request();
}
}


(3)运行结果

适配器类:转换为双孔插座
三孔插座


2、Java IO中的适配器模式

(1)Java IO

适配器作用就是讲一个接口适配到另一个接口,在Java 的I/O类库中有很多这样的需求,如将字符串数据转变成字节数据保存到文件中,将字节数据转变成流数据等。

以InputStreamReader和OutputStreamWriter类为例。

InputStreamReader和OutputStreamWriter类分别继承了Reader和writer接口,但是要创建他们的对象必须在构造函数中传入一个InputStream和OutputStream的实例,InputStreamReader和OutputStreamWriter类的作用也就是将InputStream和OutputStream适配到Reader和Writer。适配器是InputStreamReader,源角色是InputStream代表的实例对象,目标接口就是Reader类。

(2)样例演示

package adapter;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

public class AdapterIO {
public static void main(String[] args) throws Exception{
File f = new File("c:\\words.txt") ;
//字节输入流
InputStream in=new FileInputStream(f);
//将字节输入流转换为字符输入流(适配器模式)
Reader reader = new InputStreamReader(in) ;
//从Reader中最多读取1024个字符
char buffer[] = new char[1024] ;
int len = reader.read(buffer) ;
reader.close() ;    // 关闭
System.out.println(new String(buffer,0,len)) ;
}
}


输出结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: