[英]Type-safe object composition
我目前正在開發一個網絡健康監視系統,該系統可以監視多種資源,基於事實進行診斷並根據診斷做出反應。
我最初的想法是要有一個抽象的Watcher
類,該類可以配置一個Diagnosis
對象(負責基於Facts
生成Diagnostic
)和DiagnosticHandler
對象列表。 這個Watcher
類將具有一個abstract protected Facts _check()
模板方法,該方法被子類(例如HttpWatcher
或MemoryWatcher
abstract protected Facts _check()
覆蓋。
Facts
是一個標記界面,代表可以觀察到產生Diagnostic
。 例如, HttpWatcher
的_check
方法將返回HttpFacts
,它基本上是http響應的詳細信息。
HttpWatcher
構造函數如下所示:
public HttpWatcher(
Duration interval,
Diagnosis<HttpFacts> diagnosis,
List<DiagnosticHandler> handlers,
URL url
)
如我們所見,由於此類的_check
方法返回HttpFacts
,因此它還僅允許基於HttpFacts
進行Diagnosis
策略,而這正是我們想要的。 這樣,如果使用了不兼容的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*/
...
)
自從我使用強類型語言編程以來已經有一段時間了,我想確保自己使用類型來發揮自己的優勢,但是與此同時,我也不希望自己的設計受到影響。
我曾經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
構造函數將如下所示:
public Watcher(
Duration interval,
WatchedResource resource,
List<DiagnosticHandler> handlers,
URL url
)
我想知道當對象由可能不兼容的多種策略組成和/或我是否朝着建議的解決方案邁向正確方向時,是否使用了廣泛采用的模式?
我可能會遺漏一些東西,但是基於對問題的當前理解,我會做類似的事情:
public class Watcher<T> {
public Watcher(Resource<T> res, Diagnosis<T> diag) {
...
}
}
和
public class HttpResource implements Resource<HttpFacts> {
...
}
這樣可以保證Watcher和Diagnosis始終是兼容的類型,並且仍然允許您覆蓋二者之一。
我可能很想念一些重要的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.