我不知道我使用的是错误的模式还是什么。我有一个标准的课程和3个装饰器:
MyClass, Dec1, Dec2, Dec3.
每个人都实现
MyClassInterface { getDescription(), addDescription(String t) }
。但是Dec2也具有功能
{ specialFunction() }
。我创建一个实例:
MyClassInterface instance = new Dec1(new Dec2(new Dec3(new MyClass())));
那么我会调用specialFunction,但是我不能!如果我可以使用扩展Dec12的Dec1,扩展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()
最佳答案
//现在,我将以某种方式调用specialFunction(现在只是幻想)
1)gui.specialFunction()
2)if(gui.hasDecorator(GUIExtendedSpecial)!= null)gui.hasDecorator(GUIExtendedSpecial).specialFunction()
3)if(GUIExtendedSpecial的gui实例)gui.specialFunction()
我认为您正在寻找template pattern。具体来说,您需要为该段代码提供一个钩子,以便具体的装饰器类可以在这段时间内完成所需的工作。因此,将guiHook()
添加到装饰器类层次结构MyClass
的根中,并在不使用该钩子的类中保留空的实现,但是在使用它的类中添加实现(即,将specialFunction()
添加到的Dec2
。请记住,您可能需要将一些变量传递给guiHook()
。