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



对于我的一个类中的实验室,我的任务是使用装饰器模式向数据库添加日志记录功能。我目前卡在的地方是尝试为调用的每个方法创建一个不同的日志。例如,有一个方法将连接数据库中的两个表,我希望日志显示"连接 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);
}

}

数据库

是实际的数据库,而数据库是由一切实现的接口。

您的目标是为每个日志条目提供特定消息以及默认数据。由于每条消息都可以表示为一系列可打印字符,因此我们可以将其作为log()函数的参数,如下所示:

public void log(String msg) {
    String timestamp = getTimestamp(); //Or however you get the time
    String logThis = timestamp + " " + msg + "n";
    //Log logThis...
}

这样,您只需使用特定消息(例如"连接表 1 和 2")调用日志,并且每次都会添加默认参数。如果您对反思感到满意,这也是练习编写可以自动为您执行日志记录的注释的好机会。

最新更新