Java 如果函数具有已定义的装饰器模式,则调用该函数
我不知道我是否使用了错误的模式。我有一个标准班和3个装饰师:Java 如果函数具有已定义的装饰器模式,则调用该函数,java,design-patterns,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()))); 然后我会调用speci
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()
//现在我会以某种方式调用specialFunction(现在只是幻想)
1) gui.specialFunction()
2) if(gui.hasdecontor(guiextendedsspecial)!=null)gui.hasdecontor(guiextendedsspecial).specialFunction()
3) if(gui instanceof GUIExtendedSpecial)gui.specialFunction()
我想你是在找那个。具体地说,您需要为该代码段提供一个钩子,以便具体的装饰器类可以在这段时间内执行它们想要的操作。因此,将
guiHook()
添加到decorator类层次结构的根中MyClass
,并在不使用钩子的类中保留空实现,但在使用钩子的类中添加实现(即将specialFunction()
添加到Dec2
的guiHook()
。请记住,您可能需要将一些变量传递到guiHook()
)。尽管设计模式是通用的,但最好在这里有一些上下文,以便我们知道您可能不需要decorator?或者你用错了?或者你可以更好地使用它?那么,你想解决哪一个问题呢?decorator模式与你想要完成的任务无关,因为Dec2
不修饰MyClassInterface
的功能,而是引入了与现有功能毫无共同之处的新功能。@SpaceTrucker我说,我不知道我是否使用了正确的模式,我乐于接受新的解决方案。我该怎么办?我相信你要找的模式是构图。@DmitryZaitsev我考虑过,但没有找到有效的解决方案,你能写一个例子吗?