实施可配置的分类标准

时间:2018-09-03 18:31:29

标签: java oop design-patterns

我需要能够按多种条件对对象进行排序,并且这些排序需要可以从application.properties文件进行配置(因为应该可以在文件中指定要应用的排序和顺序)。

因此,在我的设计中,我为每种类型的比较器创建了一个比较器,然后创建了一个带有供应商的枚举,例如:

<html>
<head>
<title>Printer Install</title>

<HTA:APPLICATION 
     APPLICATIONNAME = "Printer Install"
     SCROLL = "Yes"
     MAXIMIZEBUTTON = "no"
     SINGLEINSTANCE = "yes"
     INNERBORDER = "yes"
     BORDER = "dialog"
     NAVIGABLE = "no"
     CONTEXTMENU = "no"
     ICON = ""

</head>

<SCRIPT Language="VBScript">

Sub Window_Onload

     Self.ResizeTo 450, 400
     Self.MoveTo 420, 190

End Sub

Set Objnetwork = CreateObject("wscript.network")

Sub Install
     printserver = document.getElementById("server").value
     strPrinterName = document.getElementById("name").value
     strprinterpath = "\\" & printserver & "\" & strPrinterName
     objNetwork.AddWindowsPrinterConnection strprinterpath
     MsgBox "Successfully mapped" & "\\" & printserver & "\" & strPrinterName

End Sub

</SCRIPT>

<body>

Printer Server: <input type="text" id="server"></input><p>
Printer Name: <input type="text" id="name"></input><p>
<input type="button" onclick="Install" value="Install"></input><p>

</body>
</html>

通过这种设计,我将能够从属性文件中加载排序:

public enum CarSort {
    ENGINE(CarEngineComparator::new), BRAND(CarBrandComparator::new);

    private final Supplier<Comparator<Car>> constructor;

    CarSort(Supplier<Comparator<Car>> constructor){
        this.constructor = constructor;
    }

    Comparator<Car> newComparator() {
        return constructor.get();
    }
}

并用类似的方式链接排序:

myapp.cars.sorts=BRAND,ENGINE

我目前遇到的问题是比较器之一需要两个参数,因此我认为该解决方案不再适用,但是目前我无法想到任何干净的选择。

您知道是否有可能使我当前的设计适应这一要求,或者有其他可行的解决方案?

我将添加更多详细信息。假设我需要添加特定的比较器,例如根据它们离客户端的距离来进行排序。因此可能是这样的(细节实际上并不重要,只是需要一个附加参数这一事实):

    Stream<Comparator<Car>> comparators = sorts.stream().map(CarSort::newComparator);
    return comparators
            .reduce(Comparator::thenComparing)
            .map(comparator -> filteredCars.sorted((comparator.reversed())))
            .orElse(filteredCars)
            .collect(Collectors.toList());

因此,我希望能够按品牌,发动机,距离(在配置文件中指定)对多个客户进行排序。这意味着我每次都需要将一个不同的参数传递给DistanceComparator。

0 个答案:

没有答案