面试题答案
一键面试- 定义日志输出格式接口
- 定义一个
LogFormat
接口,该接口包含一个方法用于将日志信息转换为特定格式。
public interface LogFormat { String format(String message); }
- 实现具体的日志输出格式类,如文本格式和JSON格式。
- 文本格式:
public class TextLogFormat implements LogFormat { @Override public String format(String message) { return message; } }
- JSON格式:
import com.google.gson.Gson; public class JsonLogFormat implements LogFormat { private Gson gson = new Gson(); @Override public String format(String message) { return gson.toJson(new {message = message}); } }
- 定义一个
- 定义日志存储方式接口
- 定义一个
LogStorage
接口,该接口包含一个方法用于存储日志信息。
public interface LogStorage { void store(String formattedMessage); }
- 实现具体的日志存储方式类,如文件存储和数据库存储。
- 文件存储:
import java.io.FileWriter; import java.io.IOException; public class FileLogStorage implements LogStorage { private String filePath; public FileLogStorage(String filePath) { this.filePath = filePath; } @Override public void store(String formattedMessage) { try (FileWriter writer = new FileWriter(filePath, true)) { writer.write(formattedMessage + "\n"); } catch (IOException e) { e.printStackTrace(); } } }
- 数据库存储:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class DatabaseLogStorage implements LogStorage { private String jdbcUrl; private String username; private String password; public DatabaseLogStorage(String jdbcUrl, String username, String password) { this.jdbcUrl = jdbcUrl; this.username = username; this.password = password; } @Override public void store(String formattedMessage) { String insertQuery = "INSERT INTO logs (message) VALUES (?)"; try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password); PreparedStatement statement = connection.prepareStatement(insertQuery)) { statement.setString(1, formattedMessage); statement.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } }
- 定义一个
- 定义抽象日志记录器类
- 创建一个抽象类
AbstractLogger
,它依赖于LogFormat
和LogStorage
接口。
public abstract class AbstractLogger { protected LogFormat logFormat; protected LogStorage logStorage; public AbstractLogger(LogFormat logFormat, LogStorage logStorage) { this.logFormat = logFormat; this.logStorage = logStorage; } public void log(String message) { String formattedMessage = logFormat.format(message); logStorage.store(formattedMessage); } }
- 创建一个抽象类
- 可维护性
- 通过接口和抽象类的使用,将日志框架的不同功能模块进行解耦。例如,添加新的日志输出格式或存储方式时,只需实现相应的接口,而不需要修改其他模块的代码。
- 代码结构清晰,每个接口和类都有明确的职责,便于理解和维护。
- 可测试性
- 对于具体的日志输出格式类和存储方式类,可以编写单元测试来验证其功能。例如,对于
TextLogFormat
类,可以测试format
方法是否返回正确的文本格式。 - 对于
AbstractLogger
类,可以通过依赖注入不同的LogFormat
和LogStorage
实现类,来测试日志记录的功能。例如,使用Mockito等测试框架来模拟LogFormat
和LogStorage
的行为,从而测试AbstractLogger
的log
方法。
- 对于具体的日志输出格式类和存储方式类,可以编写单元测试来验证其功能。例如,对于