Open/Closed Principle (OCP) – zasada otwarte-zamknięte mówi o tym, że:
Klasy (encje) powinny być otwarte na rozszerzenia i zamknięte na modyfikacje.
Co to dokładnie oznacza? W życiu zmiany są pewne. Co za tym idzie, gdy musimy dodać do aplikacji np. nową funkcjonalność, nie powinno się modyfikować kodu już istniejącego. Zamiast tego powinno się rozszerzać aplikację, a nie ją modyfikować np. poprzez dodanie nowej klasy, która będzie odpowiedzialna za nowy element. Do realizacji tej metody przydatne będzie używanie polimorfizmu i dziedziczenia.
Przykład: Zegarek sportowy (klasa SportWatch) posiada różne aktywności do wyboru. Na początku mamy trzy tryby do wyboru, które zostają włączone w zależności od podanej nazwy aktywności.
public class SportWatch {
public void switchOnMode(String sportMode){
switch (sportMode){
case "running":
System.out.println("Mode running is active");
break;
case "aerobic":
System.out.println("Mode aerobic is active");
break;
case "swimming":
System.out.println("Mode swimming is active");
break;
}
}
}
Co jeżeli chcielibyśmy dodać kolejną aktywność? Trzeba by modyfikować istniejący kod o kolejne przypadki. Zamiast tego lepiej użyć wspólnego interfejsu Mode z zadeklarowaną metodą switchOnMode(), a dla poszczególnych trybów stworzyć oddzielne klasy, które będą implementowały interfejs Mode i zastępowały metodę switchOnMode(). W klasie SportWatchOCP wywołana zostanie metoda switchOnMode() na odpowiednim podanym trybie.
public class SportWatchOCP {
private Mode mode;
public void switchOnMode(Mode mode){
mode.switchOnMode();
}
}
public interface Mode {
void switchOnMode();
}
public class RunningMode implements Mode{
@Override
public void switchOnMode() {
System.out.println("Mode running is active");
}
}
public class SwimmingMode implements Mode{
@Override
public void switchOnMode() {
System.out.println("Mode swimming is active");
}
public class AerobicMode implements Mode{
@Override
public void switchOnMode() {
System.out.println("Mode aerobic is active");
}
}
public class HikingMode implements Mode{
@Override
public void switchOnMode() {
System.out.println("Mode hiking is active");
}
}