鍍金池/ 問(wèn)答/Java  HTML/ 在Java中模擬Python的裝飾器

在Java中模擬Python的裝飾器

業(yè)務(wù):
給表中的數(shù)據(jù)打不同的標(biāo)簽 如品牌標(biāo)簽 產(chǎn)品標(biāo)簽 情感標(biāo)簽等

打標(biāo)簽的邏輯

log.info("{} Start tagging {}",table,label)
// 具體打標(biāo)簽的邏輯
log.info("{} End tagging {}",table,label)

除了具體的打標(biāo)簽的邏輯外 日志信息是可以共用的

如果用Python來(lái)操作就很簡(jiǎn)單 定義一個(gè)裝飾器即可 如下所示

def log(func):
    def wrapper(*args):
        print('{} -- Start tagging {}'.format(*args))
        result = func(*args)
        print('{} -- End tagging {}'.format(*args))
        return result

    return wrapper

@log
def tagging_A(table,lable):
  # 不關(guān)心日志 只有具體的業(yè)務(wù)邏輯
  print("do something here")
@log
def tagging_B(table,lable):
  print("do something here")

當(dāng)調(diào)用tagging_A或tagging_B的時(shí)候 會(huì)自動(dòng)加上日志

但是Java沒(méi)有像Python這么好用的裝飾器 所以決定采用模板模式 如下所示

    // 模板
    private void taggingTemplate(String table,String label,Runnable action){
        log.info("{} -- Start tagging {}",table,label);
        action.run(); // 具體的打標(biāo)簽邏輯
        log.info("{} -- End tagging {}",table,label);
    }
    
    public void taggingA(){
        taggingTemplate("table_a","label_A",()->{
            // 具體的打標(biāo)簽邏輯放在這里
            System.out.println("do something here");
        });
    }
    

除了模板模式外 不知道還有沒(méi)其他輕量級(jí)的方式可以在Java中模擬Python的裝飾器?

回答
編輯回答
半心人

AOP了解下

2018年2月17日 23:59