使用装饰器模式记录数据库操作

时间:2015-01-28 05:30:35

标签: java

对于我的一个类中的实验室,我被赋予了使用装饰器模式向数据库添加日志记录功能的任务。我目前所处的位置是尝试为每个被调用的方法创建一个不同的日志。例如,有一个方法将连接数据库中的两个表,我希望日志说"加入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是由所有内容实现的接口。

1 个答案:

答案 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的好机会,可以自动为您进行日志记录。