应用场景
大家可能用过耳机转换接口,他就相当于一个适配器。为了让不搭配的耳机可以使用,可以使用耳机插头转换器。
代码实例
下面这个例子演示了如何通过文件管理日志
//定义日志模型类,为了能存储日志对象,所以对象需要序列化
public class LogModel implements Serializable{
// 日志编号
private String logId;
// 操作人员
private String operatorUser;
// 操作时间、
private String opearateTime;
// 日志内容
private String logContent;
public String getLogId() {
return logId;
}
public void setLogId(String logId) {
this.logId = logId;
}
public String getOperatorUser() {
return operatorUser;
}
public void setOperatorUser(String operatorUser) {
this.operatorUser = operatorUser;
}
public String getOpearateTime() {
return opearateTime;
}
public void setOpearateTime(String opearateTime) {
this.opearateTime = opearateTime;
}
public String getLogContent() {
return logContent;
}
public void setLogContent(String logContent) {
this.logContent = logContent;
}
//重写toString()方法
public String toString() {
return "logId = " + logId +
",operateUser = " + operatorUser +
",operateTime = " + opearateTime +
",logCotent = " + logContent;
}
}
//日志文件管理接口
public interface LogFileOperateApi {
//从文件读取日志,返回日志对象
public List<LogModel> readLogFile();
//将日志对象写入日志文件
public void writeLogFile(List<LogModel> list);
}
//日志文件操作接口实现类
public class LogFileOperate implements LogFileOperateApi{
//日志存储路径
private String logFilePathName = "AdapterLog.log";
//构造函数,传入日志路径参数
public LogFileOperate(String logFilePathName) {
if(logFilePathName != null && logFilePathName.trim().length() > 0) {
this.logFilePathName = logFilePathName;
}
}
//读取日志
@SuppressWarnings({ "resource", "unchecked" })
@Override
public List<LogModel> readLogFile() {
List<LogModel> list = new ArrayList<LogModel>();
ObjectInputStream oin = null;
File file = new File(logFilePathName);
if(file.exists()) {
try {
oin = new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)));
list = (List<LogModel>) oin.readObject();
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
} finally {
try {
oin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return list;
}
//写日志
@Override
public void writeLogFile(List<LogModel> list) {
File file = new File(logFilePathName);
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
oos.writeObject(list);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//客户端
public class Client {
public static void main(String[] args) {
String logFilePath = "AdapterLog.log";
LogModel log = new LogModel();
log.setLogContent("这是一个日志测试");
log.setLogId("1");
log.setOpearateTime("2012-02-04 10:25:15");
log.setOperatorUser("admin");
List<LogModel> list = new ArrayList<LogModel>();
list.add(log);
//调用存储接口
LogFileOperateApi api = new LogFileOperate(logFilePath);
api.writeLogFile(list);
System.out.println("存储成功");
//调用读取接口
List<LogModel> readList = api.readLogFile();
System.out.println("readLog = " + readList);
}
}
但现实是残酷的,刁钻的用户是不可能轻易放开你的。有的用户可能会提出用数据库和文件两种方式存储日志信息。
这时候你可能会选择重新实现文件接口,但是最好不要重新做已经完成的功能,这样可能会导致依赖与他的应用不能够正常运行,再说可能两种代码就是两个公司实现的,不可能修改第一种,所以应该想办法复用。这是就要用到适配器了。
修改方案如下:
public interface LogDbOPerateApi {
public void addLog(LogModel log);
public void updateLog(LogModel log);
public void deletelog(LogModel log);
public List<LogModel> getLog();
}
/**
* 此类的作用:数据库操作日志是后来加进来的功能,用适配器可以是文件接口和数据库接口兼容;
* 部分功能涉及到数据库,就不在实现了。
*
*/
public class Adapter implements LogDbOPerateApi{
LogFileOperateApi fileApi = null;
public Adapter(LogFileOperateApi fileApi) {
this.fileApi = fileApi;
}
@Override
public void addLog(LogModel log) {
List<LogModel> list = fileApi.readLogFile();
list.add(log);
fileApi.writeLogFile(list);
}
@Override
public void updateLog(LogModel log) {
}
@Override
public void deletelog(LogModel log) {
List<LogModel> list = fileApi.readLogFile();
list.remove(log);
fileApi.writeLogFile(list);
}
@Override
public List<LogModel> getLog() {
return fileApi.readLogFile();
}
}
//客户端更改如下
public class Client {
public static void main(String[] args) {
String logFilePath = "AdapterLog.log";
LogModel log = new LogModel();
log.setLogContent("这是一个日志测试");
log.setLogId("1");
log.setOpearateTime("2012-02-04 10:25:15");
log.setOperatorUser("admin");
List<LogModel> list = new ArrayList<LogModel>();
list.add(log);
LogFileOperateApi fileApi = new LogFileOperate(logFilePath);
LogDbOPerateApi api = new Adapter(fileApi);
api.deletelog(log);
api.addLog(log);
System.out.println("log = " + api.getLog());
}
}