Z interfejsami jest trochę jak z Dzikim Zachodem. Gdy w jakiejś mieścinie rewolwerowiec dostaje odznakę szeryfa, to równocześnie zawiera umowę ze wszystkimi mieszkańcami, że odtąd będzie strzegł porządku. Taki rewolwerowiec nie może już napaść na bank czy wszcząć burdy w saloonie – zamiast tego będzie ścigał rabusiów i pacyfikował co bardziej natarczywych klientów saloonu. A jeśli spróbuje popełnić jakieś przestępstwo, nosząc na piersi dumnie gwiazdę szeryfa, to reszta mieszkańców z satysfakcją go zastrzeli.
Dokładnie tak samo jest z interfejsami. Gdy jakaś klasa dostaje interfejs (odznakę szeryfa), to zobowiązuje się do robienia konkretnych rzeczy. Wiemy, co dana klasa robi i reszta kodu może na niej polegać, oczekując, że dobrze wykona swoje zadanie. Interfejs to nic innego, jak rodzaj dżentelmeńskiej umowy pomiędzy poszczególnymi elementami kodu: "Ja, klasa A, oświadczam, że będę wypełniać obowiązki wynikające z mojego interfejsu i nie będę robić nic więcej". Takie ścisłe określenie przeznaczenia klasy i jej ograniczenie pozwala na tworzenie kodu, który jest o wiele bardziej przewidywalny i łatwiejszy do ogarnięcia (bo od razu widać, która klasa za co odpowiada).
To ma jeszcze jeden plus. Wyobraźmy sobie, że budujemy dom i zatrudniamy robotników. Ale nie wszyscy robotnicy są specjalistami w tym samym. Jeden to mistrz zalewania fundamentów betonem, drugi to wirtuoz hydrauliki, trzeci to prestidigitator elektryki itp. itd. Wciąż jednak wszyscy są robotnikami na tej samej budowie i strażnika przy wejściu na nią nie interesuje, czym dana osoba się zajmuje, po prostu wpuszcza wszystkich robotników. Tak samo można zastosować interfejsy – by stworzyć ogólny zarys funkcjonalności (np. interfejs do obsługi baz danych, z metodami typu connect, find itd.). Natomiast poszczególne klasy, implementujące ten interfejs, będą się specjalizowały w obsłudze konkretnej bazy danych. Naszego kodu nie obchodzi, jaka baza jest używana, po prostu chce dobrać się do danych lub coś zapisać – więc będzie chciał jakiejkolwiek klasy implementującej interfejs od baz danych. Dzięki temu, gdy SQLite stanie się już za małe, można będzie po cichu podmienić je na PostgreSQL, a kod nawet się nie zorientuje. Ot, przyszedł nowy robotnik na budowę.