如何在模板方法模式中通过两个名称调用模板方法

时间:2014-01-22 08:26:33

标签: java

我这样做有点倒退,因为我正在遵循一系列特定的项目指令。我有两个java类。其中一个模拟Linux中的grep函数,另一个模拟lineCount功能。我已经实现了它们,但是项目中的NEXT步骤是使用模板方法模式创建一个超类,该模式“将包含其他两个程序共有的所有字段和算法”。

两者之间有许多共同的功能,很明显哪些部分需要成为模板的一部分,哪些部分需要成为实现的一部分。例如,它们中的每一个都需要能够根据用于调用方法的路径字符串创建File对象,并使用用于调用方法的正则表达式搜索File的list方法。这是常见功能,绝对应该是模板/抽象类的一部分。

能够宣布这样的事情会很高兴:

public abstract class RegexCommands{
    protected Variables;
    public Map<things> myMethod(variables){
        //common functionality which includes storing and using the variables
        hookMethod(); //based on what you create in commonFunctionality
        return resultAfterHookMethod;
    }
}

public class Grep extends RegexCommands{
    public hookMethod(){
        class specific things;
    }
}

public class lineCount extends RegexCommands{
    public hookMethod(){
        class specific things;
    }
}

然后用

调用它
RegexCommands myObject = new Grep();
myObject.myMethod(variables);

让它返回我正在寻找的东西(Grep对象的grep命令,LineCount对象的lineCount)。但是,指令明确说明它将被调用如下:

RegexCommands myObject = new Grep();
myObject.grep(variables);

RegexCommands myObject = new LineCount();
myObject.lineCount(variables);

并且所使用的变量也存在细微差别。 (例如,lineCount不需要substringSelectionPattern)我现在设置它的方式是钩子方法调用super到它们的父级,模板调用myMethod。这显然不是它应该工作的方式。首先,我似乎不得不在我的模板中引入非常用方法,只调用主模板方法,这意味着理论上可以(虽然我没有测试过),做类似

RegexCommands myObject = new LineCount();
myObject.grep(variables);

这不是我想要允许的行为,似乎它违背了使用模板的目的。另一个问题(我实际上遇到过)是我的hookMethods似乎无法访问在commonFunctionality中创建的实例变量(即当我尝试访问在commonFunctionality中创建的匹配器时,即使我返回null也是如此将它声明为实例变量而不是方法级范围,就像我希望的那样。)

所以我有点卡住并寻求帮助。如何让这些对象在模板中使用myMethod模式,而不会破坏我的对象的单独性,以及如何使用非常用方法使用commonFunctionality中的ArrayLists和/或Maps而不将一切都作为参数传递(我被告知不要这样做,因为它破坏了使用模板的重点)?

2 个答案:

答案 0 :(得分:0)

RegexCommands myObject = new Grep();
myObject.grep(variables);

RegexCommands myObject = new LineCount();
myObject.lineCount(variables);

如果接口/抽象类RegexCommands定义了两种方法,则只能(在Java中)。因此,两个实现都需要实现它们。如果你想坚持这个要求,你可以这样做,让Grep.lineCount()抛出一些例外。

解决方法可能是使RegexCommands成为一个仅将代理方法调用从RegexCommands.grep()委托给new Grep().myObject()

的外观

但是,您应该联系请求者澄清它。

答案 1 :(得分:0)

  

首先,我似乎不得不在我的模板中引入非常用方法,只调用主模板方法,

是的,您需要根据您的要求引入此类方法。但正如您稍后所述,这可能是不正确的,因为LineCount对象可以调用grep方法,这可以通过对您将编写的非常用方法进行instance of检查来避免。如果它适合预期调用或退出,则完成工作。

对于您遇到的原始问题

  

我的hookMethods似乎无法访问在commonFunctionality中创建的实例变量(即当我尝试访问在commonFunctionality中创建的匹配器时,即使我将其声明为实例变量而不是方法,它也会返回null等级范围,就像我想的那样。)

您无法在java中定义抽象变量,java中变量的唯一合法修饰符是

public, protected, private, static, final, transient, volatile 

你需要有一个commonFunctionality的具体实现,你可以有一个getter方法。您可以在抽象类中为此定义抽象方法。有关详细信息Abstract variables in Java?

,请参阅此帖子的答案