OO设计 - 在模式之间切换

时间:2012-07-03 07:25:22

标签: oop

我正在设计一个监控组件可用性的应用程序。

首先,我要有一个计划程序来定期运行可用性检查(例如作业)。

有一些组件(以及预计将来会支持更多组件)需要进行监控,并且每种组件都有不同的方法来确定它是否可用。

所以我想我会用一个名为验证抽象布尔方法做一个抽象的 ComponentStatusVerifier 类,对于每个组件我创建一个子类来实现特定的验证策略。

但问题有点复杂。该应用程序应支持在两个不同的平台上运行(例如服务器,并且将来可能支持更多平台),并且要监视的组件集取决于部署应用程序的平台。

可以为每个目标服务器单独构建应用程序,也可以让应用程序知道它在配置中的运行位置 - 所以问题不在于如何让应用程序知道它在哪里运行。

我的问题是如何补充应用程序的设计以支持这些运行模式,同时不会失去各个类的高凝聚力。

4 个答案:

答案 0 :(得分:1)

您可以让ComponentStatusVerifier检查一个组件,同时检查 您的verify方法应该进行一些扩展以支持它:它应该接收相关的参数:就像应用程序所在的平台一样:

interface ComponentStatusVerifier {
  boolean verify(VerificationParameters parameters);
}

interface VerificationParameters {
  Platform getPlatform();
}

enum Platform {
  PLATFORM1,
  PLATFORM2 // ...
}

此外,根据您的描述,似乎某些诊断信息很重要,而不是简单的boolean结果。为此,我创建了一个消息列表,其中包含验证程序可以报告的信息,如下所示:

interface ComponentStatusVerifier {
  VerificationResults verify(VerificationParameters parameters);
}

interface VerificationResults {
  boolean succeeded();
  Iterable<Message> getMessages();
}

interface Message {
  string getDescription();
  MessageType getType();
}

enum MessageType {
  INFO,
  WARNING,
  ERROR
}

(请注意,我已经使用接口和枚举来展示概念,适当地进行调整......)

在不支持的平台上运行的验证程序可以执行此操作:

class Platform1SomeComponentVerifier implements ComponentStatusVerifier {
  @Override
  public VerificationResults verify(VerificationParameters parameters) {
    VerificationResults results = new ...
    if (parameters.getPlatform() != Platform.PLATFORM1) {
      results.addMessage(
        new InfoMessage("Skipping verification of component, platform is not PLATFORM1"));
      return results;
    }

    ...
  }
}

答案 1 :(得分:0)

好的,根据你的描述,听起来你应该有一个 ComponentStatusVerifier

该对象应包含 ComponentConnectorClass

ComponentConnectorClass 应包含将运行的 Verifier 类列表,并检查您需要验证的所有内容。

或者您应该能够运行 ComponentConnectorClass ,然后为其提供一个 Verifier 类的列表。

答案 2 :(得分:0)

有几种方法可以解决这个问题。

您可以配置要在监控应用程序中验证的所有应用程序。这是灵活的,可扩展到某一点。

另一种方法(尽管更具侵入性)是让您的应用程序在监视应用程序中进行自我注册。这样,监视器唯一要做的就是调用已注册的应用程序。由于您的监控应用程序可能“笨拙”,因此这也非常灵活且可扩展。

我建议使用Yochai的建议架构,并且有多个Verifier类,每个类都实现了另一种验证方式,尽管是http请求,rmi等。

答案 3 :(得分:0)

您可以编写proxy class来进行必要的编码,以检查它是否还活着。



    // Remote box
    class remoteObject {
        int check() {
            // I write code for this universe 
            // is multiverse true ?
        }
    }

    class remoteObjectProxy {
        remoteObject y;
        int check() {
            // do things necessary
            return y.check();
        }
    }




    // Your box
    class localProxy {
        remoteObjectProxy z;
        int check() {
            // do things necessary
            return z.check();
        }
    }