2010-09-29 93 views
1

不確定如何描述這個肯定,但我想我已經搞清楚了我想在標題中做什麼。詳細說明一下,我正在尋找一種設計模式,它可以讓我實現一種服務,在一種情況下可以同步返回調用的結果,但在另一種情況下,會返回有關如何異步完成調用的詳細信息(例如作業ID)。設計一個服務接口,以允許同步和異步實現

也許只是通過定義這樣的問題,很明顯,我試圖做的事情打破了設計接口契約的想法。完全可能朝着錯誤的方向前進。

我在想的是可能是這樣的:

public class Data { 
    private int id; 
    /* getter/setter */ 
} 

public class QueuedData extends Data { 
    private int jobId; 
    /* getter/setter */ 
} 

public interface MyService { 
    public Data fetchData(int id); 
} 

public class SyncedMyService implements MyService { 
    private SyncDao syncDao; 
    public Data fetchData(int id) { 
    return syncDao.getData(id); 
    } 
} 

public class QueuedMyService implements MyService { 
    private JobQueue queue; 
    public QueuedData fetchData(int id) { 
    int jobId = queue.startGetData(id); 
    QueuedData queuedData = createQueuedDate(jobId); 
    return queuedData; 
    } 
} 
 

這是一個明智的方式去了解這項任務?感謝您的任何建議。 (這可能是我應該閱讀的設計模式書)

回答

1

這與java.util.concurrent軟件包中使用的Future模式非常相似。 A Future表示在單獨的線程中完成計算後將來可用的結果。如果在需要結果之前計算已經完成,則返回計算值。否則調用獲得結果塊直到計算結束。

所以我認爲這種模式是同步和異步服務的正確方法。

這是如何實現使用Future解決方案:

public class Data { 
    private int id; 
    private final String name; 

    Data(String name) { this.name = name; } 
    public String getName() { return name; } 
} 

public class FutureData extends Data { 
    private int id; 
    private final Future<String> nameFuture; 

    FutureData(Future<String> nameFuture) { this.nameFuture = nameFuture; } 
    @Override public String getName() { return nameFuture.get(); } 
} 

public interface MyService { 
    public Data fetchData(int id); 
} 

public class SyncMyService implements MyService { 
    private SyncDao syncDao; 
    public Data fetchData(int id) { 
    return syncDao.getData(id); 
    } 
} 

public class AsyncMyService implements MyService { 
    private static final ExecutorService executor = 
    Executors.newFixedThreadPool(10); 

    public FutureData fetchData(final int id) { 
    Future<String> future = executor.submit(new Callable<String>() { 
     public String call() { 
     String name; 
     //some long computation that computes the name using the id given 
     return name; 
     } 
    }); 
    FutureData futureData = new FutureData(future); 
    return futureData; 
    } 
} 

石英剛剛與JobQueue更換ExecutorService和使用Quartz中的等價物Future

+0

整潔,沒有聽說過那個包,我得看看它。我不確定它在我的場景中會有用,因爲我可能會使用Quartz進行「背景」任務。 – 2010-09-29 18:37:22

1

這是繼承的良好用法。您的SynchedMyService和QueuedMyService遵循由MyService指定的合同/規則。

而且由具有fetchData()方法返回一個類型的數據,你讓自己建立在數據對象上,並返回更復雜的對象(如QueuedData)

如果你不想能力有每個類實例化的邏輯。看看Factory design pattern來幫助你,因爲你繼續增長你的應用程序