(Zasada segregacji interfejsów)
Klienci nie powinni być zmuszani do korzystania z interfejsów (zależenia od interfejsów), których nie używają.
Robert C. Martin
Lepiej jest utworzyć kilka mniejszych (precyzyjniejszych) interfejsów zamiast jednego rozbudowanego (służącego do wielu czynności).
Na ekranie telefonu mamy ikony wielu aplikacji. Projektanci umożliwili nam przesuwanie tych ikon, abyśmy mieli pod ręką te aplikacje, których używamy często, a te rzadziej używane możemy przesunąć na kolejne ekrany.

</> Lepszy przykład niż wykład
✘ Błędny kod
W interfejsie Move utworzymy trzy metody odpowiedzialne za przemieszczanie się poprzez bieganie, fruwanie i pływanie.
public interface Move {
void go();
void fly();
void swim();
}
W przypadku tak rozbudowanego interfejsu zmuszani jesteśmy do korzystania z kilku metod przemieszczania, których nie zawsze potrzebujemy. Gdy zaimplementujemy nasz interfejs w klasie Duck, wszystko zadziała prawidłowo, ponieważ kaczki chodzą, fruwają i pływają
public class Duck implements Move{
@Override
public void go() {
System.out.println("Chodzę powoli.");
}
@Override
public void fly() {
System.out.println("Fruwam nieźle.");
}
@Override
public void swim() {
System.out.println("Bardzo dobrze pływam.");
}
}
Ale w klasie Ostrich już niekoniecznie, przecież nikt nie wiedział latającego strusia.
public class Ostrich implements Move {
@Override
public void go() {
System.out.println("Chodzę i biegam.");
}
@Override
public void fly() {
throw new RuntimeException("Nie potrafię latać!");
}
@Override
public void swim() {
System.out.println("Rzadko pływam.");
}
}
✔ Prawidłowy kod
Należy rozdzielić rozbudowany interfejs Move na kilka mniejszych Go, Fly, Swim. Każda klasa będzie implementowała tylko te interfejsy, których potrzebuje.
public interface Go {
void go();
}
public interface Fly {
void fly();
}
public interface Swim {
void swim();
}
public class Duck implements Go, Fly, Swim{
@Override
public void go() {
System.out.println("Chodzę powoli.");
}
@Override
public void fly() {
System.out.println("Fruwam nieźle.");
}
@Override
public void swim() {
System.out.println("Bardzo dobrze pływam.");
}
}
public class Ostrich implements Go, Swim {
@Override
public void go() {
System.out.println("Chodzę i biegam.");
}
@Override
public void swim() {
System.out.println("Rzadko pływam.");
}
}
