扩展战略模式的功能

时间:2017-08-01 07:06:21

标签: java design-patterns strategy-pattern

我正在开发一个比较文件的应用程序。我决定使用策略设计模式来处理不同的格式,所以我有类似的东西:

userCredentials.save(function(error,result) {
            if(error == "error"){
              return res.status(500).json({status:"error"});
              res.end();
            }
            return res.status(200).json({status:"success"});
            res.end();
          })
        }

然后,我自然会为不同的文件格式实现比较方法。

现在假设我想添加另一个方法,它处理比较的某些限制(例如,在Excel或csv文件的情况下省略一行,或省略XML中的节点)。

是否会更好:

  1. 在界面和每个实现中添加另一个方法(暂时很少)
  2. 编写一个继承自CompareStrategy的新接口,然后实现它?
  3. 第二个问题是:由于差异可以是各种类型 - 可以制作标记界面差异以启用以下内容:

    public class Report {
       CompareStrategy strategy;
       ...
    }
    
    
    public interface CompareStrategy {
       int compare(InputStream A, InputStreamB);
    }
    

    然后继续定义特定文件格式的差异意味着什么?

3 个答案:

答案 0 :(得分:4)

  

现在假设我想添加另一个方法,它处理比较的某些限制(例如,如果是Excel或csv文件,则省略一行,或者省略XML中的节点)。

您似乎需要Template Pattern

您可以创建一些抽象类,如

public abstract class XMLCompareStrategy implements CompareStrategy {

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

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

}

通过这种方式,您可以创建多个具有主要或核心功能的类,并为每种情况提供自定义详细信息

答案 1 :(得分:2)

答案实际上取决于您的需求:

  • 如果方法始终实施 - 将其添加到现有界面。如果它只是可选 - 创建一个扩展当前接口的新接口,然后实现的类可以实现基本接口或子接口(如果它需要两种方法)。
  • 对于你的第二个问题 - 看起来有点像过度设计给我,但又取决于你的需求。

答案 2 :(得分:0)

我认为您应该编写另一个继承自CompareStrategy的界面。就像你需要compareWithDifferences()那样,但是你不必使用这个界面,你仍然可以使用更简单的界面。

正如乔纳森所说,如果你能预见到困难的准备。在那种情况下,我认为你应该做好准备。事实上,您不会花费太多时间来创建另一个界面,并且您不必在以后重构。