我不知道我是否使用了错误的模式或什么。我有一个标准类和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()
答案 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()
)。