如果是,下面是Java多重继承设计模式吗?

时间:2019-02-19 07:18:41

标签: java design-patterns

我在Swing应用程序中工作了8年以上,但它大概是20年前设计的,设计师创建了自己的定制组件(我认为最初使用AWT,但在某个阶段已更新为Swing)。

有多个窗口使用的小部件,可在甘特图阶梯中显示数据,从而允许用户进行交互,拖放等操作。此设计的简化描述如下:

//Many lines of implementation code and only 1 constructor
public class GanttChartImplementation extends JPanel {

  public GanttChartImplementation(String p1, Object p2, boolean p3, boolean p4){
    //Implementation code
  }

}


//No implementation only constructors
public class GanttChartInterface extends GanttChartImplementation {

  public GanttChartInterface(String p1, Object p2, boolean p3, boolean p4) {
    super(p1,p2,p3,p4);
  }

  public GanttChartInterface(String p1, Object p2, boolean p3) {
    super(p1,p2,p3,true); //defaults p4 to true as it's not passed in
  }

  public GanttChartInterface(String p1, Object p2) {
    super(p1,p2,true,true); //defaults p3, p4 to true as these are not passed in
  }
}

应用程序中的所有屏幕都将扩展GanttChartInterface,它的第一个明显用途是从使用Gantt Chart小部件的屏幕中隐藏实现类。即使从理论上讲,也可以更改GanttChartInterface以扩展不同的实现类,而不必更改使用Gantt Chart小部件的屏幕。

我多年来发现的这种设计的另一个好处是,当在GanttChartImplementation类中向构造函数添加新参数时,不需要更改使用小部件的屏幕,因为只需要修改现有的屏幕即可。 GanttChartInterface中的构造函数,因此他们将新的param值设置为默认值,然后将创建一个新的构造函数,如下例所示:

//Add new parameter to constructor used to have 4 now 5
public class GanttChartImplementation extends JPanel {

   public GanttChartImplementation(String p1, Object p2, boolean p3, boolean p4, boolean p5){
     //Implementation code
   }

}

仅需修改GanttChartInterface即可进行编译,而无需更改任何使用该小部件的现有屏幕:

//No implementation only constructors had 3 constructors now has 4
public class GanttChartInterface extends GanttChartImplementation {

  //Create new constructor that receives the new parameter
  public GanttChartInterface(String p1, Object p2, boolean p3, boolean p4, boolean p5) {
    super(p1,p2,p3,p4,p5); 
  }

  public GanttChartInterface(String p1, Object p2, boolean p3, boolean p4) {
    super(p1,p2,p3,p4,true); //defaults p5 to true as it's not passed in
  }

  public GanttChartInterface(String p1, Object p2, boolean p3) {
     super(p1,p2,p3,true,true); //defaults p4, p5 to true as these are not passed in
  }

  public GanttChartInterface(String p1, Object p2) {
     super(p1,p2,true,true,true); //defaults p3, p4, p5 to true as these are not passed in
  }
}

我看了很多有关Web的文章以及关于SO的问题,这似乎不是GoF设计模式,而且无论这是否是广泛使用的设计模式,在任何地方都找不到吗?我想查找信息,因为我想知道谁提出了这种设计。预先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在OOP中,它是提供默认值的重载构造函数。

编辑 就像评论中提到的@boris一样。 您不需要使用子类来重载方法,只需在GanttChartImplementation中执行即可。这里没有继承的好处。只是不必要的课。