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

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

我不知道我是否使用了错误的模式。我有一个标准班和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()
//现在我会以某种方式调用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我考虑过,但没有找到有效的解决方案,你能写一个例子吗?