Teoria
Zasada segregacji interfejsów stwierdza, że żadna klasa nie powinna implementować kodu, którego nie używa ( nie potrzebuje). Można wyciągnąć z tego taki wniosek, że lepiej jest mieć kilka mniejszych interfejsów, niż jeden duży i chaotyczny.
Przykład
Rozważmy przypadek fabryki samochodów, która w swojej ofercie ma modele samochodów różnych klas.
public interface Car {
void startUp();
void headlightsOn();
void navigation();
void electricMirrors();
}
public class BudgetCar implements Car{
@Override
public void startUp() {
System.out.println("Starting engine and all systems");
}
@Override
public void headlightsOn() {
System.out.println("Turning on headlights");
}
@Override
public void navigation() {
}
@Override
public void electricMirrors() {
}
}
public class Limousine implements Car{
@Override
public void startUp() {
System.out.println("Starting engine and all systems");
}
@Override
public void headlightsOn() {
System.out.println("Turning on headlights");
}
@Override
public void navigation() {
System.out.println("Turning on navigation system");
}
@Override
public void electricMirrors() {
System.out.println("Operating mirrors electrically");
}
}Limuzyna z oferty producenta samochodów posiada implementację wszystkich opcji jakie ma do zaoferowania marka. Problem pojawia się, gdy chcemy stworzyć wersję dostępna dla klientów z mniejszym portfelem, samochód w wariancie budżetowym ma nie zaimplementowane dwie metody, co niepotrzebnie zaśmieca kod i zmniejsza jego czytelność. Możemy temu zaradzić przez rozdzielenie dużego interfejsu Car na mniejsze.
public interface CoreFunctionalities {
void startUp();
void headlightsOn();
}
public interface Navigation {
void navigation();
}
public interface ElectricMirrors {
void electricMirrors();
}
public class BudgetCar implements CoreFunctionalities{
@Override
public void startUp() {
System.out.println("Starting engine and all systems");
}
@Override
public void headlightsOn() {
System.out.println("Turning on headlights");
}
}
public class Limousine implements CoreFunctionalities, Navigation, ElectricMirrors{
@Override
public void startUp() {
System.out.println("Starting engine and all systems");
}
@Override
public void headlightsOn() {
System.out.println("Turning on headlights");
}
@Override
public void navigation() {
System.out.println("Turning on navigation system");
}
@Override
public void electricMirrors() {
System.out.println("Operating mirrors electrically");
}
}Zastosowanie zasady segregacji interfejsów pozwoliło nam na implementację tylko tych metod, które są niezbędne. Uzyskujemy większą elastyczność systemu i jak to zwykle bywa przy regułach SOLID, większą czytelność kodu.