Wzorzec fasada czyli o samochodach elektrycznych raz jeszcze.

W moim poprzednim wpisie skupiłem się na problematyce dostępu do przeciążonych ładowarek elektrycznych. Kontynuując temat, chciałem pokazać jak można wykorzystać wzorzec fasada do obsługi stacji ładowania samochodów.

Nie wiem czy programiści wykorzystują ten wzorzec do tworzenia oprogramowania ładowarek elektrycznych ale myślę że analogicznie do standardowych przykładów wykorzystania jakie znalazłem w internecie (bankomaty i paczkomaty), ten wzorzec aż się prosi o jego wykorzystanie.

Nowoczesne ładowarki samochodowe umożliwiają wiele metod autoryzacji. Wszystkie funkcjonują w sieci IOT a system ładowarek ma wiele funkcjonalności które odnoszą się do użytkownika jak i do właściciela całej infrastruktury. Każda ładowarka powinna jednak mieć ograniczony i uproszczony dostęp do systemu ładowarek, dlatego powinniśmy wykorzystać wzorzec fasada.

W skład aplikacji wchodzą klasy ChargingStation i ChargingSystem wykorzystywane przez klasę ChargingStationFacade.

Oto ChargingSystem:

public class ChargingSystem {
private boolean authenticated;

public boolean AuthenticateRFID(){
System.out.println("Successfull RFID login");
authenticated = true;
return authenticated;
}

public boolean AuthenticateApp(){
System.out.println("Successfull App login");
authenticated = true;
return authenticated;
}
public void sendInvoice(){
System.out.println("Invoice has been sent");
}
public void checkChargersAvailability(){
System.out.println("checking and publishing status online");
}
}

Klasa ChargingSystem ma metody sprawdzające weryfikacje użytkownika a także metody monitorujące system lub wysyłające faktury do użytkowników.

Spójrzmy na klasę ChargingStation:

public class ChargingStation {
private boolean status;
private float elapsed;

public ChargingStation(){
status = true;
}

public boolean ChargingAvailability(){
if (status == true) {
System.out.println("Charger is ready to use");
return status;
}
else {
System.out.println("Charger is occupied");
return status;
}
}

public int SelectAuthenticationMethod(){
System.out.println("Select authentication method: (1: RFID , 2: App)");
Scanner in = new Scanner(System.in);
int auth = Integer.parseInt(in.nextLine());

if (auth==1){
System.out.println("RFID authentication attempt");
return 0;
}else if (auth ==2){
System.out.println("App authentication attempt");
return 1;
}else {return 2;}

}

public void StartCharging (){
Instant start = Instant.now();
System.out.println("Starting charging");
status = false;
this.ChargingAvailability();
System.out.println("Hit Enter to stop charging");
Scanner scan = new Scanner(System.in);
scan.nextLine();
Instant stop = Instant.now();
Duration interval = Duration.between(start, stop);
this.elapsed=interval.getSeconds();

StopCharging();

}
public void StopCharging(){
System.out.println("Stopped charging, duration: "+this.elapsed+" s .");
status = true;
this.ChargingAvailability();
}
}

Klasa ChargingStation posiada metody wchodzące w interakcje ze sterowaniem ładowarki oraz mierzące zużycie prądu.

A teraz wzorzec ChargingStationFacade:

public class ChargingStationFacade {
private ChargingStation chargingStation;
private ChargingSystem chargingSystem;
private int login;

public ChargingStationFacade(){
chargingStation = new ChargingStation();
chargingSystem = new ChargingSystem();
}

public void chargeCar(){
if (chargingStation.ChargingAvailability()){
login = chargingStation.SelectAuthenticationMethod();
if (login ==0){
chargingSystem.AuthenticateRFID();
chargingStation.StartCharging();
}else if (login ==1){
chargingSystem.AuthenticateApp();
chargingStation.StartCharging();
} else {
System.out.println("Goodbye");
chargingStation.StopCharging();
}
}
else{
System.out.println("Goodbye");
}

}
}

Klasa fasadowa tworzy instancje klas ChargingStation i ChargingSystem w swoim konstruktorze. Klasa ta posiada główną funkcję chargeCar która odpowiednio wywołuje metody w klasach za fasadą w celu uruchomienia procesu ładowania.

A tutaj już funkcja main:

public class Main {

public static void main(String[] args) {
// write your code here
do {
ChargingStationFacade charger = new ChargingStationFacade();
charger.chargeCar();
} while (keyPressed());
}

public static boolean keyPressed()
{
System.out.println("Would you like to exit? (x)");
Scanner input = new Scanner(System.in);
String key = input.nextLine();

if (key.equals("x")) {
System.out.println("Exiting");
System.exit(0);
}
else{
System.out.println(key);
}
return true;
}

}

Funkcja main tworzy instancje klasy fasada w pętli. Każde utworzenie fasady jest związane z nowym użytkownikiem który chce naładować swój samochód. Pętla jest wykonywana dopóki ktoś nie wyłączy ładowarki. Mechanizm jest stworzony w funkcji sprawdzającej czy przycisk wyłączający ładowarkę został wciśnięty.

Poniżej wykonanie programu:

Charger is ready to use
Select authentication method: (1: RFID , 2: App)
2
App authentication attempt
Successfull App login
Starting charging
Charger is occupied
Hit Enter to stop charging Stopped charging, duration: 5.0 s .
Charger is ready to use
Would you like to exit? (x)
x
Exiting

Wzorzec fasada czyli o samochodach elektrycznych raz jeszcze.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *