类型安全的对象组成

时间:2014-04-23 14:46:08

标签: java oop generics composition

我目前正在开发一个网络健康监控系统,可以监控多种资源,根据事实进行诊断并根据诊断做出反应。

初始虽然......

我最初的想法是拥有一个抽象的Watcher类,可以使用Diagnosis对象进行配置(该对象负责根据Diagnostic生成Facts以及DiagnosticHandler个对象的列表。此Watcher类将使用abstract protected Facts _check()HttpWatcher等子类覆盖MemoryWatcher模板方法。

Facts是一个标记界面,表示可以观察到生成Diagnostic的内容。例如,_check的{​​{1}}方法会返回HttpWatcher,这基本上就是http响应详情。

以下是HttpFacts构造函数的外观:

HttpWatcher

正如我们所看到的,由于此类的public HttpWatcher( Duration interval, Diagnosis<HttpFacts> diagnosis, List<DiagnosticHandler> handlers, URL url ) 方法返回_check,因此它也只允许基于HttpFacts诊断的Diagnosis策略,这就是我们想要的。这样,如果使用不兼容的HttpFacts策略,编译器可能会抱怨。

缺少概念?

然而,有些东西让我对这个设计感到困扰,因为我注意到在行为方面,Diagnosis子类覆盖的唯一事情是Watcher方法。更糟糕的是,_check算法无法在其他地方重复使用。这让我想到,或许我在设计中错过了一个_check概念,它可以封装算法来检索Resource而不必继承Facts

这就是说,我只需要一个具体的Watcher类,它将配置WatcherResourceDiagnosis<T extends Facts>

这种设计对我来说更有意义,但是我会失去类型安全性,以防止不兼容的策略一起使用,如下所示:

List<DiagnosticHandler>

解?

我用一种强类型语言进行编程已经有一段时间了,我想确保我使用这些类型,但同时我不希望我的设计受到影响。

我的一个想法是创建一个新的类,例如new Watcher( new Duration(...), new HttpResource(...), new SimpleMemoryDiagnosis(...), /*<- incompatible with HttpResource*/ ... ) ,它将封装HttpWatchedResourceHttpResource个对象。

类似的东西:

Diagnosis<HttpFacts>

public abstract class WatchedResource { private final Resource resource; private final Diagnosis diagnosis; public WatchedResource(Resource resource, Diagnosis diagnosis) { //null checks this.resource = resource; this.diagnosis = diagnosis; } //called by Watcher public final Diagnostic checkHealth() { return diagnosis.diagnose(resource.facts()); } } public final class HttpWatchedResource { public HttpWatchedResource(HttpResource resource, Diagnosis<HttpFacts> diagnosis) { super(resource, diagnosis); } } 构造函数如下所示:

Watcher

我想知道当一个对象由多个可能不兼容的策略组成时和/或如果我正在朝着正确的方向推进所提出的解决方案时,是否使用了广泛采用的模式?

1 个答案:

答案 0 :(得分:1)

我可能会遗漏一些东西,但基于我目前对此的理解 问题我会做类似的事情:

public class Watcher<T> {
    public Watcher(Resource<T> res, Diagnosis<T> diag) {
    ...
    }
}

public class HttpResource implements Resource<HttpFacts> {
   ...
}

这将保证观察者和诊断 始终是兼容的类型,仍然允许您覆盖 任

我很可能会错过一些至关重要的东西。