2013-03-19 42 views
1

我正在執行一個有兩個面孔的服務嗎?該服務提供了各種方法供用戶應用程序使用。該服務可以是公共/私人服務。它可能是OS服務或Web服務或內存。我想爲一般類型的用戶應用程序提供一張臉,爲特殊類型的用戶應用程序提供另一張臉。一般用戶應用程序將無法查看爲特殊應用程序提供的方法。兩種方法都有一些常用的方法。相同服務的兩個面孔..如何設計它?

例如,如果有一個數據庫,我設計了一個CRUD方法的服務。但是我想要兩張不同面孔的服務,一張臉上隱藏着'D'。

我做到這一點的方式是我創建了兩個單獨的接口,其中不同的方法名稱是常見的,其中一個接口沒有一些方法。所以'兩面'......

但是,這是正確的方式來做到這一點,它是真實的,可以接受的設計嗎?或者有另一種方式來做到這一點。

+0

爲什麼不與特權去? – Thihara 2013-03-19 10:12:24

回答

0

你說的是代理模式,是的,它是處理這種情況的可接受的方式。想想Collections.unmodifiableList(List)。此方法爲List創建代理,併爲更新方法(如boolean add(T)等)拋出UnsupportedOpperationException。現在,問題是您是否想公開這些方法,但在調用時拋出未經檢查的異常,並保持合同相同或刪除這些方法都在一起?我傾向於贊成後者,否則最終會遇到一系列不兼容的接口,因爲您可以對哪些方法調用允許進行更多的排列組合,但這取決於您的需求。根據定義,代理具有與其控制訪問的對象相同的接口。

現在,如果你想建立不支持的操作,只是窩您代理:

DAO crateReadOnlyProxy(DAO dao) { 
    return new NoInsertProxy(new NoDeleteProxy(new NoUpdateProxy(dao))); 
} 

你只有1個接口(DAO)有4個實現(在這個例子中),真正的實現,然後這3個代理實現只是將其方法調用委託給底層的DAO(或DAO代理)。當然,爲了讓生活更輕鬆,你可以創建一個DAOProxyAdapter類,所以您不必重新編寫所有的委託方法:

public class DAOProxyAdapter implements DAO { 
    private DAO target; 
    public DAOProxyAdapter(DAO target) { this.target = target; } 
    public void insert(Object o) {target.insert(o); } 
    public void delete(Object o) {target.delete(o); } 
    public void update(Object o) {target.update(o); } 
    public Object find(Object key) { return target.find(key); } 
} 
public class NoDeleteProxy extends DAOProxyAdapter { 
    public NoDeleteProxy(DAO target) {super(target);} 
    public void delete(Object o) { throw new UnsupportedOperationException(); } 
} 
相關問題