[英]Using a base enum as a default for dependent enums
我正在使用標准化Web服務的客戶端,但其中一個供應商的行為略有不同,因此我們必須考慮這些行為。 要做到這一點,我們一直在使用枚舉:
public enum ServiceProviderType {
FOO, BAR;
public ServiceProviderType checkService(String url) {
if (url.equals("http://www.example.com")) {
return ServiceProviderType.FOO;
} else {
return ServiceProviderType.BAR;
}
}
}
這些行為的差異也根據我們對服務的要求而有所不同,例如我們可能會請求一個圖層並希望該圖層為紅色,但要知道BAR和FOO服務以不同方式表示RGB值。 為此,我們創建了另一個枚舉,用於存儲服務中每個層所需的屬性。
public enum LayerServiceProviderType {
FOO("#ff0000"),
BAR("#ff5555");
private String colour;
public ServiceProviderType(String colour) {
this.colour = colour;
}
public String getColour() {
return colour;
}
public ServiceProviderType checkService(String url) {
if (url.equals("http://www.example.com")) {
return ServiceProviderType.FOO
} else {
return ServiceProviderType.BAR;
}
}
}
這種方法很好,除非我們想要處理多個層並將它們視為同一個基本枚舉的衍生物。 基本上我們希望將Layer1ServiceProviderType.BAR作為等價於Layer2ServiceProviderType.BAR。 但是我們不能對枚舉進行子類化,甚至試圖這樣做也似乎打破了各種聲音設計原則。
我的第一個想法是有一個包含枚舉的接口:
interface ServiceProvider {
ServiceProviderType {FOO, BAR};
ServiceProviderType getServiceProviderType();
ServiceProvider checkService(String url);
}
public enum LayerServiceProvider implements ServiceProvider {
FOO (ServiceProviderType.FOO, "#ff0000"),
BAR (ServiceProviderType.BAR, "#ff0000");
public LayerServiceProvider(ServiceProviderType serviceProviderType, String colour) {
this.serviceProviderType = serviceProviderType;
this.colour = colour;
}
@Override
public ServiceProviderType getServiceProviderType() {
return this.serviceProviderType;
}
@Override
public ServiceProvider checkService(String url) {
if (url.equals("http://www.example.com")) {
return LayerServiceProviderType.FOO
} else {
return LayerServiceProviderType.BAR;
}
}
}
但是,對於我來說,在枚舉中使用枚舉,每個都具有相同的值。 有一個更好的方法嗎?
也許訪客模式是你正在尋找的。
與枚舉一起使用時,它基本上允許在不使用switch
語句的情況下添加依賴於枚舉的邏輯。
例:
public enum ServiceProviderType {
FOO {
@Override public <T> T apply(Action<T> action) { return action.doFoo(); }
},
BAR {
@Override public <T> T apply(Action<T> action) { return action.doBar(); }
};
public interface Action<T> {
T doFoo();
T doBar();
}
public abstract <T> T apply(Action<T> action);
public static ServiceProviderType checkService(String url) {
if (url.equals("http://www.example.com"))
return FOO;
return BAR;
}
}
public class LayerServiceProviderType implements ServiceProviderType.Action<String> {
@Override
public String doFoo() {
return "#ff0000";
}
@Override
public String doBar() {
return "#ff0000";
}
}
public class Main {
public static void main(String[] args) {
ServiceProviderType type = ServiceProviderType.checkService("");
String colour = type.apply(new LayerServiceProviderType());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.