Witam, jestam bardzo początkującym programistą i mam proste pytanie.
Chciałbym napisać program wysyłający powiadomienia email, po wystąpieniu jakiegoś zdarzenia. Interesuje mnie żeby użytkownik mógł definiować odbiorców wiadomości. Odbiorcami mogą być pojedyńcze adresy, jak również grupy.
Dlatego chciałbym zrobić prostą książkę adresową, oraz móc tworzyć grupy kontaktów.

Przykładowe klasy:
klasa: Contact
pola: name, email
metody: settery, gettery

klasa: ContactGroup
pola: name, List<Contact> contacts
metody: settery, gettery, addContact(Contact con)

Każde zdarzenie (klasa Event) będzie mogło wysyłać wiadomość do kilku osób lub grup np. do: Jan Kowalski, administratorzy
gdzie Jan Kowalski to obiekt klasy Contact, a administratorzy to ContactGroup do której przypisane są inne kontakty. Lista odbiorców definiowana będzie w klasie Destination. Zatem do klasy Destination trzeba móc dodawać zarówno obiekty typu Contact jak i ContactGroup. Na końcu chciałbym aby klasa Destination zwróciła listę wszystkich kontaktów, z uwzględnieniem kontaktów z ContactsGroup (np. poprzez metodę getContacts()). Czy zatem obiekty te powinny implementować jakiś wspólny interfejs ? Jeśli tak to jak on powinien wyglądać?

Można zrobić interfejs np. Recipient (odbiorca)

klasa: Destination (jako kompozycja/agregacja dla klasy Event)
pola: List<???> recipients
metoda: addRecipient(Recipient rec), List<Contact> getContacts()

Zdaję sobie sprawę że zadanie jest bardzo proste. Ale chciałbym wiedzieć jak powinno się to robić "zgodnie ze sztuką".
Mógłbym utworzyć pusty interfejs Recipient i następnie w klasie getContacts sprawdzać czy kolejny obiekt z listy jest "instanceof" Contact, lub ContactGroup, ale wydaje mi się że nie tędy droga. Proszę o jakiś prosty UML jak powinna wyglądać implementacja tej funkcjonalności. Czy może jest jakiś wzorzec projektowy.