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

标签 java design-patterns

问题就在这里。我有一个抽象基类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。我如何在这里重构这段代码?我希望属于 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

} 

}

最佳答案

您可能想寻找 GraphEditor 和其他两个之间的概念;您正在做的事情中是否有一个构造可以由扩展 GraphEditor 但不是功能齐全的 GraphEditor 或 TreeMapEditor 的类来表示?如果有的话,通用代码可能会放进去。

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

关于java - 如何修复客户端代码以便通过组合实现代码重用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15343160/

相关文章:

oop - 反模式的名称是什么!string.IsnullOrEmpty(Employee.Name),(解封装?)

java - 生成与双引号字符串完全匹配的过滤器机制,并包含与单引号类似的功能

c# - 将方法变量作为参数传递以进行代码优化

design-patterns - 您认为最滥用的设计模式是什么?

Java:图像的读取、转换和大小调整

java - 当派生类主要用于扩展状态而不是行为时,如何动态获取继承层次结构中的子类?

java - 我们可以在 pojo 中放置两个 setter 吗?

java - 无限检查第二个线程中的条件

java - 我是否使 Java 中的简单解决方案变得过于复杂?

java - 我正在学习人工智能,我可以实现什么游戏来将其付诸实践?