【问题标题】:Open-Close Principle Example开闭原则示例
【发布时间】:2016-09-12 15:23:45
【问题描述】:

我想通过重写这段代码在下面这个例子中应用开闭原则。

class MyQueue<E> extends ArrayList<E> implements Queue<E> {
   int front=0, back=0;
   MyQueue() { }
   …
   void put(E e) { add(back++, e); ...}
   E get () { E elem = get(front++); …}
}

解决方案最匹配哪种设计模式,为什么?解释为什么它比下一个最佳匹配更好。

我很难考虑这个类会扩展哪些功能。它已经有了 getter 和 setter。在不知道可以应用什么类型的扩展的情况下,我不确定如何重写此代码。

我所知道的:OCP 对扩展开放,对修改开放。因此,一般的方法是弄清楚如何抽象它。所以我最初的想法是把它变成一个带有抽象方法的抽象类。然后,每个扩展MyQueue() 的类都可以实现它想要的getter 和setter 方法。而且,如果我这样做,那么我会假设这与适配器模式非常匹配。

请纠正我对我的理解的任何误解。

【问题讨论】:

  • 我不明白为什么这被否决了......我遵循了提问的指导方针。有人可以澄清吗?在不知道原因的情况下被否决是没有帮助的。
  • 很可能因为看起来像家庭作业和征求意见而被否决。
  • 问题很好。也许接近家庭作业,但在实践中仍然更像是对OCP 的理解。这并不总是很明显。
  • 感谢您告诉我!

标签: java open-closed-principle


【解决方案1】:

在我看来,这是基于ArrayList 实现制作Queue 的示例。首先,我将尝试只公开Queue 接口方法。从ArrayList 继承的所有方法都应该以某种方式隐藏。

问题是,我们知道在 Java 中您不能在继承期间隐藏公共方法。 然后,您可以采取的唯一方法是覆盖它们并抛出UnsupportedOperationException 或类似这样的东西。

您需要确保您将基于ArrayList 内部正确实现Queue 接口。 您应该正确实现addofferremovepoolelementpeek。源自ArrayList 的其他方法应该抛出一些异常。

这是我对这个问题的看法。

【讨论】:

  • 所以,澄清一下,您建议我将这个“MyQueue()”类作为接口,添加 ArrayList 具有的所有功能,例如添加、提供、删除等,然后每个具体类可以实现自己的 getter/setter/etc 版本。对吗?
  • 在这种情况下,假设它遵循适配器模式是否正确?
  • 回答第一条评论。我建议将MyQueue 类视为队列。第二条评论答案:或多或少是适配器。您正在尝试将ArrayList 调整为Queue。我试图展示的是请尝试使用ArrayList 作为Queue 的机制。回到用法,您应该将MyQueue 实例分配给Queue 接口。喜欢:Queue yourQueue = new MyQueue().
猜你喜欢
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多