对于我的一个类中的实验室,我被赋予了使用装饰器模式向数据库添加日志记录功能的任务。我目前所处的位置是尝试为每个被调用的方法创建一个不同的日志。例如,有一个方法将连接数据库中的两个表,我希望日志说"加入Table1和Table2"以及能够用来自不同记录器的时间戳包裹的能力。我想知道如何编写具体的装饰器,因此不会为数据库使用的每个方法提供单独的日志记录方法。
这就是我现在对普通记录器所拥有的。
public abstract class Logger extends DB implements DataBase {
DataBase db;
ArrayList<String> log = new ArrayList<String>();
public Logger(DataBase db){
this.db = db;
}
public DBTable getTable(String name){
logAction("Get Table ");
return db.getTable(name);
}
public void createTable(String name, int columns){
logAction("Create Table "+name+" ");
db.createTable(name, columns);
}
public void insert(String tableName, String[] row){
logAction("Insert "+tableName+" ");
db.insert(tableName, row);
}
public DBTable select(String tabName, int col, String selector){
logAction("Select "+tabName+" ");
return db.select(tabName, col, selector);
}
public DBTable join(String tab1Name, String tab2Name, int tab1Col, int tab2Col){
logAction("Join "+tab1Name+" and "+tab2Name+" ");
return db.join(tab1Name, tab2Name, tab1Col, tab2Col);
}
public void logAction(String logInfo){
log.add(logInfo);
}
}
DB是实际的数据库,而DataBase是由所有内容实现的接口。
答案 0 :(得分:1)
您的目标是为每个日志条目提供特定消息以及默认数据。由于每条消息都可以表示为一系列可打印字符,因此我们可以将其作为log()
函数的参数,如下所示:
public void log(String msg) {
String timestamp = getTimestamp(); //Or however you get the time
String logThis = timestamp + " " + msg + "\n";
//Log logThis...
}
这样您就可以使用特定消息调用日志(例如&#34;加入表1和2&#34;),每次都会添加默认参数。如果您对反射感到满意,那么这也是练习编写Annotations的好机会,可以自动为您进行日志记录。