Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修复客户端代码,以便通过组合实现代码重用?_Java_Design Patterns - Fatal编程技术网

Java 如何修复客户端代码,以便通过组合实现代码重用?

Java 如何修复客户端代码,以便通过组合实现代码重用?,java,design-patterns,Java,Design Patterns,问题出在这里。我有一个抽象基类Editor。我还有两个子类GraphEditor和TreeMapEditor。TreeMapEditor的实现基本上包装了一个GraphEditor,目前基本上将所有请求转发给底层的GraphEditor class TreeMapEditor extends Editor{ private final Editor wrappedEditor = createWrappedEditor(); private createWrappedEditor(){

问题出在这里。我有一个抽象基类
Editor
。我还有两个子类
GraphEditor
TreeMapEditor
TreeMapEditor
的实现基本上包装了一个
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
的所有调用都通过
TreeMapEditor
执行,而只有更具体的调用通过
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 ;
 }

}
客户端代码现在如下所示:

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

} 

}

您可能需要在GraphEditor和其他两个编辑器之间寻找一个概念;在您所做的工作中,是否存在一个可以由扩展GraphEditor的类表示的构造,但它不是一个功能完整的GraphEditor或TreeMapEditor?如果有,公共代码可能会在其中


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

为什么客户机的代码只接受
grapherditor
s?是否有一些特定于
GraphEditor
s的功能不是所有
Editor
s都有(但
TreeMapEditor
s也有)?如果是这样,请继续定义一个新接口,使两个编辑器都实现该接口,并鼓励客户机重构代码以接受新接口类型的任何参数,而不是仅接受
graphieditor
s。我想知道这里建模的是什么。我们可以对类进行各种扩展和实现等等,但是每个类都应该在您的编程环境中表示一个“事物”(或“事物类型”)。如果TreeMapEditor确实是GrapherEditor的特例,那么继承是合适的,我们可以讨论如何最好地实现它。但你似乎描述了某种混合体,因此,我想退一步,在更高的层次上检查我们正在尝试做什么。@rcook TreeMapEditor实际上不是
GraphEditor
,而是基本上使用
GraphEditor
的代码进行一些操作。它还可以覆盖
GraphEditor
的一些行为,并可能添加以下操作:仅属于
TreeMapEditor
。让它扩展
GraphEditor
将违反LSP原则。示例代码已经使用组合来实现您的目标。您的下一步是关闭编辑器并为完成的作业鼓掌。@DwB我必须修复客户端代码。不能说它完成了。