2014-03-30 60 views
0

我正試圖讓一個面向對象的例子脫離「union find」。在實現相同接口的所有類中重複使用哪種設計模式用於方法實現?

所以我有一個叫UF

public interface UF { 
    boolean connected(int p,int q); 
    void printArray(); 
    void union(int p,int q); 
} 

接口,下面的類實現它quickFindUF,quickUnionUF,quickWeightedUnionUF 但他們都共享一個功能,該功能在實現相同的,(功能printArray() )

什麼是避免printArray()代碼重複使用的最佳模式?創建類調用ArrayPrinter並將數組傳遞給printArray()中所有實現UF的類?

是否有任何模式,我可以做到這一點沒有做抽象繼承只是使用接口。因爲繼承限制了我的設計,如果我繼承了一個類,我不會繼承其他任何東西,我不會僅僅爲printArray()方法進行限制......

回答

1

您所想的delegation。我個人不會把它稱爲設計模式,因爲它只是一種構圖技術,但無論如何有一篇維基百科文章稱它爲一。

在此示例中,UnionFind extends ArrayPrinter因此ArrayPrinter接口在整個組合中傳播。委託實現了一塊層次:

interface ArrayPrinter { 
    void printArray(); 
} 

interface UnionFind extends ArrayPrinter { 
    boolean isConnected(int p, int q); 
    void makeUnion(int p, int q); 
} 

class DefaultPrinter implements ArrayPrinter { 
    @Override 
    public void printArray() { 
     /** 
     * do actual print 
     */ 
    } 
} 

class QuickFind implements UnionFind { 
    private final ArrayPrinter printDelegate = new DefaultPrinter(); 

    @Override 
    public void printArray() { 
     printDelegate.printArray(); 
    } 

    /** 
    * the rest 
    */ 
} 
+0

謝謝你的回答我的問題,很漂亮! –

2

你可以有一個抽象類AbstractUF這樣:

public abstract class AbstractUF implements UF{ 
    public abstract boolean connected(int p,int q); 
    public void printArray() { 
     //implementation 
    } 
    public abstract void union(int p,int q); 
} 

和繼承你的類從AbstractUF,所以只(倍率和)實現其他兩個功能

+0

謝謝這是什麼設計模式的名稱? –

+0

@MedyaGh這是一個抽象類。並非所有的東西都需要設計模式 – Radiodef

+0

有沒有任何模式,我可以做到這一點,而不做繼承,只使用接口。因爲繼承限制了我的設計,如果我繼承了一個類,我不會繼承其他任何東西,我不會僅僅爲printArray()方法做這個限制... –

1

在Java 8中,您可以用做Default method

接口方法

接口中的默認方法和抽象方法與實例方法一樣被繼承。但是,當類或接口的超類型提供具有相同簽名的多個缺省方法時,Java編譯器會遵循繼承規則來解決名稱衝突。這些規則由以下兩個原則驅動:

  • 實例方法優於接口默認方法。

  • 已被其他候選人覆蓋的方法將被忽略。當超類型共享一個共同的祖先時,可能會出現這種情況。

所以,你的代碼將

public interface UF { 
     default public void printArray() {// Provide default implementation } 
} 
1

有沒有我可以做這個而不做抽象繼承,只需使用接口的任何圖案。

在Java 8中,您可以在接口中聲明default methods。限制是默認方法不能依賴實現類聲明的實例變量。他們必須完全依賴類public API來訪問或更新對象狀態。

對於缺省方法適用的情況,它們避免了擴展公共基類的需要,同時也避免了繁瑣的委派。

0

接口分離原理建議將不同的功能分解爲單獨的接口。在這種情況下,您的printArray()方法是可以與UF界面分離的責任。

你實現了一個ArrayPrinter接口,並且你通過了數組。這也符合單一職責原則以及設施解耦架構。你是用友界面不知道打印的任何內容,這是一個單獨的責任,所以它是由不同的對象處理。

相關問題