首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JADT 入門實作(二):字典驅動程式架構與服務實作完整指南

     編輯:Java 相關知識

承接第一部分從應用開發者角度介紹 JADT(Java Dictionary and Thesaurus API)基礎用法,本文將轉換視角至字典提供者/驅動程式開發者,深入剖析 JADT 架構細節、所有介面與類別的實作要點,並以範例驅動程式示範完整開發流程。

JADT 架構總覽

JADT 採驅動程式模式:字典提供者實作驅動程式端介面,提供資料存取點;應用程式透過統一的用戶端介面使用字典服務。此架構讓提供者不公開資料格式細節,開發者亦無須深入廠商專屬格式,雙方鬆耦合整合。

驅動程式獨立於 JADT 核心:提供者依據 JADT 規範實作所有介面與方法,打包為 JAR 部署。JADT 核心提供 JADTDriverFactoryManager 管理工廠註冊與驅動程式實例化。

JADT 類圖

核心介面與類別實作詳解

1. JADTDriverFactoryManager

用戶端與驅動程式工廠的橋樑。提供 registerJADTDriverFactory() 註冊工廠、getJADTDriverFactory(String factoryName) 取得工廠。驅動程式載入後由提供者負責註冊,用戶亦可透過 Class.forName(driverFactoryClass) 顯式載入。

2. JADTDriverFactory

建立驅動程式實例的工廠介面,必須實作 createJADTDriver()。建議於靜態區塊向 Manager 註冊:

public class JADTSampleDriverFactory implements JADTDriverFactory {
    private static JADTSampleDriverFactory factory;
    static {
        try {
            if (factory == null) factory = new JADTSampleDriverFactory();
            JADTDriverFactoryManager.registerJADTDriverFactory(factory);
        } catch (Exception ex) { /* handle */ }
    }
    public JADTDriver createJADTDriver() throws JADTException {
        // 依 loading_strategy 屬性決定單例或多例
        if ("multiple".equals(getProperty("loading_strategy"))) {
            return new JADTSampleDriver(getProperty("JADTSampleDriverDir"));
        }
        // singleton pattern
        if (driver == null) driver = new JADTSampleDriver(getProperty("JADTSampleDriverDir"));
        return driver;
    }
    // 其餘屬性存取方法...
}

所有驅動程式屬性須編寫文件隨驅動程式發布。

3. JADTDriver

主驅動程式介面,提供七大服務存取點:getDictionary()、getWordBook()、getSpellChecker()、getWordLister()、getTranslator()、getGrammarChecker()、getAnagrammizer()。建構子可接收資料路徑等初始化參數:

public class JADTSampleDriver implements JADTDriver {
    private Properties props;
    public JADTSampleDriver() { props = new Properties(); }
    public JADTSampleDriver(String dataPath) { 
        this(); setProperty("JADTSampleDriverDir", dataPath); 
    }
    public Dictionary getDictionary(String from, String to) throws JADTException {
        try {
            String dir = getProperty("JADTSampleDriverDir");
            return (dir != null) ? new SampleDictionary(from, to, dir) 
                                 : new SampleDictionary(from, to);
        } catch (JADTException e) {
            throw new JADTException("DictionaryFailure", "Could not create dictionary", e);
        }
    }
    // 其餘六大服務方法同樣模式實作...
}

資料結構介面實作

WordList(單詞列表)

單詞容器,不直接存取後端資源。支援迭代、前綴/後綴/子字串查找:

public class SampleWordList implements WordList {
    private Vector<Word> words = new Vector<>();
    private int currentPos = 0;
    public int size() { return words.size(); }
    public void addWord(Word w) { words.add(w); }
    public void addWords(Collection<Word> c) { words.addAll(c); }
    public Vector<Word> getAllWords() { return words; }
    public void start() { currentPos = 0; }
    public boolean hasMoreWords() { return currentPos < words.size(); }
    public Word getNext() { return words.get(currentPos++); }
    public WordList findWithPrefix(String prefix) { /* 實作 */ return null; }
    public WordList findWithSuffix(String suffix) { /* 實作 */ return null; }
    public WordList findWithSubstring(String sub) { /* 實作 */ return null; }
}

Word(單詞)

封裝單詞拼寫、類型、來源、發音、記錄(釋義/同義/反義等):

public class SampleWord implements Word {
    private String word, type, source, pronunciation;
    private DictionaryRecord meaning, synonym, antonym;
    // 對應 getter/setter...
    public static final int MEANINGS = 1, SYNONYMS = 2, ANTONYMS = 3;
}

DictionaryRecord(字典記錄)

鏈式物件,保存單詞描述、類型、用法、地區、發音等,支援 getNextRecord() 串聯多筆結果。

七大服務介面實作要點

Dictionary(字典)

按字母序儲存單詞條目(釋義、類型、發音、來源、用法)。建構子依載入策略(lazy、single-shot、multiple-load)從資料庫/檔案讀取資料至記憶體結構(如 Hashtable)。核心方法 getMeaning(Word) 從儲存庫提取記錄。

public DictionaryRecord getMeaning(Word word) {
    String key = word.toString().toLowerCase();
    if (words.containsKey(key)) 
        return ((Word)words.get(key)).getRecord(Word.MEANINGS);
    return null;
}

WordBook(辭典/同反義詞庫)

提供同義詞、反義詞、上位詞、下位詞、整體名詞、部分名詞六大關係查詢。實作需建立各關係的資料儲存庫(如 Hashtable<String, WordList>),方法回傳 DictionaryRecord 鏈。範例:

public DictionaryRecord getSynonyms(Word word) throws JADTException {
    WordList syn = wordsSyn.get(word.toString());
    if (syn == null || syn.size() == 0) return null;
    DictionaryRecord first = null, curr = null;
    for (Word w : syn.getAllWords()) {
        if (first == null) { first = curr = new DictionaryRecord(); }
        else { curr.setNextRecord(new DictionaryRecord()); curr = curr.getNextRecord(); }
        curr.setWordName(w.toString());
    }
    return first;
}
// 其餘 getAntonyms、getHypernyms、getHyponyms、getHolonyms、getMeronyms 同理
// 另提供 isSynonyms、isAntonyms 等布林判斷方法

其他服務

  • SpellChecker:私有雜湊表儲存詞彙,實作 check()、correct()、suggestSimilar()。
  • WordLister:支援前綴/後綴/子字串查找,回傳 WordList。
  • Anagrammizer:實作變位詞演算法,提供 Anagrammise()、isAnagram()。
  • GrammarChecker:實作語法檢查演算法,提供 check()、correct()、suggestSimilar()。
  • Translator:實作翻譯演算法,提供 translate()(單詞)、translateSentence()(句子),支援本地化/國際化。

打包與部署

將所有實作類別組織為套件結構,打包成 JAR:

com/ibm/jadt/                 // JADT 核心介面與基礎類
com/ibm/jadtdrivers/SampleDriver/
    JADTSampleDriver.class
    JADTSampleDriverFactory.class
    SampleWord.class
    dictionary/SampleDictionary.class
    spellchecker/SampleSpellChecker.class
    wordbook/SampleWordBook.class
    wordlist/SampleWordList.class
    wordlister/SampleWordLister.class
    anagrammizer/SampleAnagrammizer.class
    grammarchecker/SampleGrammarChecker.class
    translator/SampleTranslator.class

部署該 JAR 至應用程式類別路徑即可使用。

結語

本文完整說明了 JADT 驅動程式開發的架構細節、介面實作範例與打包部署流程。透過本系列兩篇文章,您已從使用者與提供者雙重視角全面掌握 JADT 技術,可據此建構整合字典、辭典、拼寫檢查、翻譯等語言服務的 Java 應用程式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved