我目前正在开发一个网络健康监控系统,可以监控多种资源,根据事实进行诊断并根据诊断做出反应。
我最初的想法是拥有一个抽象的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
类,它将配置Watcher
,Resource
和Diagnosis<T extends Facts>
。
这种设计对我来说更有意义,但是我会失去类型安全性,以防止不兼容的策略一起使用,如下所示:
List<DiagnosticHandler>
我用一种强类型语言进行编程已经有一段时间了,我想确保我使用这些类型,但同时我不希望我的设计受到影响。
我的一个想法是创建一个新的类,例如new Watcher(
new Duration(...),
new HttpResource(...),
new SimpleMemoryDiagnosis(...), /*<- incompatible with HttpResource*/
...
)
,它将封装HttpWatchedResource
和HttpResource
个对象。
类似的东西:
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
我想知道当一个对象由多个可能不兼容的策略组成时和/或如果我正在朝着正确的方向推进所提出的解决方案时,是否使用了广泛采用的模式?
答案 0 :(得分:1)
我可能会遗漏一些东西,但基于我目前对此的理解 问题我会做类似的事情:
public class Watcher<T> {
public Watcher(Resource<T> res, Diagnosis<T> diag) {
...
}
}
和
public class HttpResource implements Resource<HttpFacts> {
...
}
这将保证观察者和诊断 始终是兼容的类型,仍然允许您覆盖 任
我很可能会错过一些至关重要的东西。