2012-10-18 30 views
1

在運行期間,可能會創建TableA或TableB或TableC。哪種設計模式用於我的場景?

public class TableA { 
    public void methodA() { 
     doSomethingA(); 
    } 

    public void methodB() { 
     doSomethingB(); 
    } 
} 

public class TableB extends TableA { 
    @Override 
    public void methodA() {    
    } 

    protected void methodC() { 
    } 
} 

public class TableC extends TableA { 
    @Override 
    public void methodB() {    
    } 

    public void methodD() { 
    } 
} 

我有另一個名爲TableX的表。

public class TableX extends TableA { 

    public void methodX() {  
    } 

    public void methodY() { 
    } 
} 

現在我想的TableX functionality- methodX(),methodY()申請表B,表C

我不能拿出methodX(),methodY()並投入TableA的,因爲這些都是TableX的特定模塊特徵。因此現在在運行期間可以創建表A,表B,表C,表X(表A),表X(表B),表X(表C)。我可以應用任何設計模式,以便無論Table創建了什麼,只要它從TableA擴展而來,TableX也可以支持它。

回答

3

我認爲你正在討論在頂部TableA對象上添加功能。 Decorator模式也許你在找什麼。

class TableX extends TableA { 
    private TableA innerObject; 
    public TableX(TableA inner) { innerObject = inner; } 

    public methodA() { 
     innerObject.methodA(); 
     .... 
    } 

    ... 
} 

TableB bObject = new TableB(); 
TableX decoratedBObject = new TableX(bObject); 
decoratedBObject.methodA(); 
+0

在這種情況下,Decorator和Adapter是否有區別?我似乎沒有區別,雖然我覺得這兩種模式的意圖是不同的...... – ppeterka

+1

你說得對,有一條細線。我認爲limckmy正在尋找'Decorator'的原因是這行'public class TableX extends TableA {'所以他/她正在尋找包裝對象並保持相同的接口。在適配器的情況下,您將爲包裝對象提供一個新界面。 – Sameer

+0

不錯,趕上Sameer!我確信Adaptor也是答案,直到你指出這一點。 –