Termostat w modelu MVC
Cel
Celem tego przykładu było stworzenie prostej aplikacji do wyznaczania temperatury opartej o wzorzec MVC, implementując Model w obiektach Logtalk oraz Widok i Kontroler w J2SE. Termostat ma wyznaczać dokładną temperaturę jak powinna być w ogrzewanym biurze na podstawie trzech danych:
Aktualnej godziny
Dnia tygodnia
Aktualnego miesiąca
Reguły opisujące wyznaczanie tej temperatury są opisane w ARD i XTT w modelu termostatu.
Realizacja projektu
Jest to również bardzo prosty przykład, aby go zaimplementować wystarczy tak naprawdę utworzyć trzy klasy odpowiadające każdemu z modułów wzorca :
Widok
ThermostatView prosta klasa tworząca Swingowe okno umożliwiające wprowadzenie aktualnej Godziny, Dnia tygodnia oraz Miesiąca, oraz Wyświetlająca wyznaczoną temperaturę.
Po zatwierdzeniu wyboru danych wejściowych są one przekazywane do kontrolera.
Kontroler
klasa ThermostatController jest bardzo podobna do LogtalkControler z przykładu z edytorem tekstu. Wewnątrz konstruktora dokonuje koniecznej konfiguracji Logtalka i SWIProloga, oraz tworzy obiekt Logtalk thermostatModel. Następnie poprzez metodę GetTemperature wywołuje zmianę modelu w następujący sposób :
public int GetTemperature(int hour, int day, int month)
{
Query getTemp = new Query("thermostatModel::get_temp(" +hour + ", "+ day + ", " + month + ", T).");
int value = -1;
if (getTemp.hasMoreElements()) {
Object elem = getTemp.nextElement();
if (elem instanceof java.util.Hashtable) {
java.util.Hashtable<String, jpl.Integer> solution = (java.util.Hashtable<String, jpl.Integer>) elem;
jpl.Integer temp = solution.get("T");
value = temp.intValue();
}
}
return value;
}
Metoda ta zwraca wyznaczoną w modelu wartość temperatury, która zostaje potem wyświetlona w Widoku.
Model
Zaimplementowany w Logtalku obiekt thermostatModel, który zawiera jedną publiczną metodę get_temp(Hour, Day, Month, T), która umożliwia wyznaczenie aktualnej temperatury zgodnie z modelem reguł narzuconych przez projekt.
:-object(thermostatModel, imports(properties)).
:-public(get_temp/4).
get_temp(Hour, Day, Month, T):-
checkDayTime(Hour),
season(S,Month),
checkWorkingTime(Day, Hour, O),
temperature(S, O, T),
write(T).
...
:-end_object.
Pełny kod obiektu thermostatModel, natomiast źródła pełnego projektu znajdują się w sekcji Projekt.