簡體   English   中英

擴展戰略模式的功能

[英]Extending functionality of Strategy pattern

我正在開發一個比較文件的應用程序。 我決定使用策略設計模式來處理不同的格式,所以我有這樣的事情:

public class Report {
   CompareStrategy strategy;
   ...
}


public interface CompareStrategy {
   int compare(InputStream A, InputStreamB);
}

然后,我自然地為不同的文件格式實現了比較方法。

現在假設我想添加另一個方法,它處理比較的某些限制(例如,在Excel或csv文件的情況下省略一行,或省略XML中的節點)。

是否會更好:

  1. 向接口和每個實現添加另一個方法(目前很少)
  2. 編寫一個繼承自CompareStrategy的新接口,然后實現它?

第二個問題是:因為差異可以是各種類型 - 是否可以制作標記界面差異以啟用以下內容:

int compareWithDifferences(..., Iterable<Difference> differences);

然后繼續定義特定文件格式的差異意味着什么?

現在假設我想添加另一個方法,它處理比較的某些限制(例如,在Excel或csv文件的情況下省略一行,或省略XML中的節點)。

看起來你需要模板模式

你可以創建一些抽象類

public abstract class XMLCompareStrategy implements CompareStrategy {

    public int compare(InputStream A, InputStreamB) {
        // several steps
        customMethod(...);
        // more steps
    }

    protected abstract ... customMethod(...);

}

這樣,您可以創建多個具有主要或核心功能的類,並為每種情況提供自定義詳細信息

答案真的取決於您的需求:

  • 如果始終實現該方法 - 將其添加到現有接口。 如果它只是可選的 - 創建一個擴展當前接口的新接口,然后實現的類可以實現基本接口或子接口(如果它需要兩種方法)。
  • 對於你的第二個問題 - 看起來有點像過度設計給我,但又取決於你的需求。

我想你應該編寫另一個繼承自CompareStrategy的接口。 就像那樣,如果你需要compareWithDifferences()你可以,但你不必使用這個接口,你仍然可以使用更簡單的沒有差異。

正如喬納森所說,如果你能預見到困難的准備。 在那種情況下,我認為你應該做好准備。 實際上,這不會花費你太多時間來創建另一個界面,你不必在以后重構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM