如何修复客户端代码以便通过合成获得代码重用?

时间:2013-03-11 16:03:17

标签: java design-patterns

这是问题所在。我有一个抽象基类Editor。我还有两个子类GraphEditor和一个TreeMapEditorTreeMapEditor的实现基本上包含GraphEditor,现在基本上将所有请求转发给基础GraphEditor

class TreeMapEditor extends Editor{
 private final Editor wrappedEditor = createWrappedEditor();

 private createWrappedEditor(){
   return new GraphEditor();
 }

 public void doA(){  //This is the abstract class defined in Editor.
   wrappedEditor.doA();
 }

 public void doB(){  //This is the abstract class defined in Editor.
   wrappedEditor.doB();
 }

 public Editor getWrappeEditor(){
  return this.wrappedEditor ;
 }

}

现在我的想法是重用GraphEditor的代码而不真正继承GraphEditor(因此组成)。但是客户端代码被写入GraphEditor的实现,而不仅仅是Editor。我怎么能在这里重构这段代码?我希望所有属于Editor的来电都通过TreeMapEditor,只有更具体的来电才能通过GraphEditor

客户端代码现在看起来像这样:

public clientCode(Editor editor){
  GraphEditor graphEditor = (GraphEditor)editor;

  graphEditor .doA(); //This method belongs to Editor()
  graphEditor .doB(); //This method belongs to Editor()


  graphEditor .doC(); //This method belongs to GraphEditor() only and not to TreeMapEditor
  graphEditor .doD();//This method belongs to GraphEditor() only and not to TreeMapEditor

} 

}

1 个答案:

答案 0 :(得分:1)

您可能希望在GraphEditor和其他两个之间寻找一个概念;你正在做什么的构造可以用扩展GraphEditor但不是全功能的GraphEditor或TreeMapEditor的类来表示?如果存在,公共代码可能会进入其中。

但是我会谨慎地继续在你的问题空间中实现某种东西的表示,而不是仅仅将方法放入继承层次结构中的类中,因为这就是你需要它们的地方。自下而上创建类的风格可能导致设计不佳,难以理解,直到有人说“哦,他只是想在这里使用这种方法。”。