如果函数具有已定义的装饰器模式,则调用该函数

时间:2015-02-24 13:51:07

标签: java design-patterns

我不知道我是否使用了错误的模式或什么。我有一个标准类和3个装饰器:

MyClass, Dec1, Dec2, Dec3.

每个人都实施MyClassInterface { getDescription(), addDescription(String t) }。 但是Dec2还有函数{ specialFunction() }

我创建了一个实例:

MyClassInterface instance = new Dec1(new Dec2(new Dec3(new MyClass())));

然后我会打电话给specialFunction,但我不能!如果我用Dec1扩展Dec2,那么延伸到Dec3,那就扩展了MyClass,就可能了。

拥有像

这样的功能会很不错
decoratorInstance = instance.hasDecorator(Dec2)
decoratorInstance.specialFunction()

但我不知道是否有可能不会造成巨大的模式错误。

示例用例: 您有一个带有2个面板的主GUI。有一天我会添加另一个小组

class GUI {
   GUI(){
     addPanel(pane1);
     addPanel(pane2);
   }

}

class GUIExtendedSpecial extends GUIDecorator{
   GUIExtended(GUIInterface g){
     super(g);
     addPanel(awesomePanel);
   }

   specialFunction(){}
}

class GUIExtendedWrapper extends GUIDecorator{
   GUIExtended(GUIInterface g){
     super(g);
     addPanel(addAnotherPanel);
   }

}

GUIInterface gui = new GUIExtendedWrapper(new GUIExtendedSpecial(new GUI()));

// and now I would call the specialFunction in some way (right now are just fantasy)
1) gui.specialFunction()
2) if(gui.hasDecorator(GUIExtendedSpecial)!=null) gui.hasDecorator(GUIExtendedSpecial).specialFunction()
3) if(gui instanceof GUIExtendedSpecial) gui.specialFunction()

1 个答案:

答案 0 :(得分:0)

  

//现在我会以某种方式调用specialFunction(现在只是幻想)   1)gui.specialFunction()   2)if(gui.hasDecorator(GUIExtendedSpecial)!= null)gui.hasDecorator(GUIExtendedSpecial).specialFunction()   3)if(gui instanceof GUIExtendedSpecial)gui.specialFunction()

我认为您正在寻找template pattern。具体来说,您需要为该段代码提供一个钩子,以便具体的装饰器类可以在此期间执行他们想要的操作。因此,将guiHook()添加到装饰器类层次结构MyClass的根目录中,并将空实现留在不使用该挂钩的类中,但在使用它的类中添加实现(即添加specialFunction()Dec2' guiHook()。请记住,您可能需要将一些变量传递到guiHook())。