如何在这种情况下应用oo设计模式



情况:假设我们正在使用Java API设计Windows 9的UI。我们需要建立三个类mainBuildInWindowApplicationWindow

main-呈现系统UI的窗口(即启动botton&壁纸页面)

BuildInWindow-用于在应用程序(例如IE)中渲染构建的窗口

ApplicationWindow-用于呈现来自第三方(例如eclipse)的应用程序的窗口

它们都必须实现3个Java API接口WindowFocusListenerWindowListenerWindowStateListener,并具有方法onExit()onCrushing()

onExit()在系统/内置应用程序/第三方应用程序正常关闭时执行

onCrushing()捕获任何系统/应用程序崩溃并将系统状态发送回服务器

这是最初的设计:

https://i.stack.imgur.com/JAJiY.png

我对如何以OO的方式设计它有一些想法,但我不确定这是否是正确的方式。以下是我的想法:

  1. 使用方法onExit()onCrushing()创建一个abstract class。由于onExit()的代码将从3个类变化,因此它应该是abstract method&onCrushing()对于所有类都是相同的,因此它将是一个具体的方法
  2. MAIN WINdow应使用singleton设计,以确保用户只创建一个main实例
  3. facade设计省去了实现三类三接口的麻烦

我的问题是我不太了解立面设计,所以我不确定它是否能应用于这种情况。此外,我真的不确定onExit()是否会对3个类不同,而onCrushing()是否会执行相同的功能。

我尽力把问题解释清楚。。。如果你不理解免费评论。非常感谢!

我在与您的问题相关的评论中留下了一些问题,但这里有一些指导:

  1. 如果BuildInwindowApplicationWindow不共享任何实现,则不应该在它们都必须具有方法#onExit#onCrushing的基础上创建抽象类。抽象类在有公共实现的情况下最有用。包含这些方法的接口就足够了。也就是说,你的两个窗口可能共享其他功能,如果是这样,它可以通过一个公共的超类共享(如果它依赖于子类实现细节,则是抽象的)。您可能会发现Template Method模式有助于管理针对不同窗口类型的特定剪裁的整个窗口机制。您还可以发现,创建实例的Factory方法(对于您的窗口类)将有助于将对象创建和设置与创建机制分离。

  2. 一个单独的共享实例似乎是明智的,而一个单独实例可以达到这个目的(只要您能够处理终止等)。或者,您的应用程序可能只启动一个Main实例,甚至可以通过包访问隐藏构造函数,以确保不会创建其他实例。

  3. facade模式只是用来简化复杂的界面。它主要通过在一个(粗糙的)接口下一起滚动对协作实例的调用来实现这一点。这通常不会隐藏类支持的接口。事实上,发布类扩展了哪些接口对API用户来说很重要。为了"方便",您可以将三个接口合并为一个接口,但我认为这是不必要的。如果你确定了一个通用的超类,那么这将"扩展"这三个接口(如果所有的子类都支持它们的话)。它还可能实现这些接口的一些默认实现(同样,注意访问修饰符,以确保您想要成为的那些可以被覆盖,而其他可能是最终的)。

编辑:引导

您只需要确定类和关系:我建议你拿些纸画画。你已经有了你的名词和动词(否则你可以进行名词和动词定位来识别它们上的类和方法)。

那么,为什么不画一个包含所有信息的简单图(ABCMain等),并绘制它们之间的关系呢。这是你的出发点。在计算Main如何链接到窗口类(假设有两种)时,您可能会有一些困惑。只需在上面写一张纸条,然后继续澄清图片的其余部分。

接下来,完善您的图表,开始将通用特性移动到一个地方(抽象)。您知道这与您的接口和建议的方法有关,但您可能需要决定哪些(如果有的话)具有任何通用功能。然后决定接口是否满足您的需求(方法是通用的,但实现不同),或者实现本身是否相同,因此父超类可能有用(这涉及抽象[谁负责什么]、封装[适当级别的单个实现]和多态性[哪些类支持通用方法])。注意,即使你选择了一个超类,你也应该用一个接口来支持它(这会让引入同级或替换类更容易——想想维护)。

接下来,处理您发现的问题。你的设计草案澄清了其中的任何一个吗?例如,您的Main需要了解其窗口,但它们是什么类型的?那么,你的任何改进都让这件事变得更清楚了吗?

有什么模式存在吗?对于这一点,你需要已经对设计模式有了感觉,所以请购买并吸收GoF的设计模式书。它会让你在旅途中发现图案。我还建议在阅读其他任何一本书之前先阅读这本特定的书,因为它与技术无关(其他一些书充斥着特定于技术的变通方法)。也许研究一下我指出的两种模式,看看它们是否符合你的要求。

总的来说,你的想法似乎朝着正确的方向发展。

最新更新