Il concetto è legato al Pattern MVC (su cui è modellato Swing). Quando nel "model" qualcosa cambia, la "view" deve essere notificata affinché possa aggiornarsi prontamente. Questo è proprio quello che succede tra JTable e TableModel.
TableModel ha 2 metodi addTableModelListener/removeTableModelListener per gestire registrazioni di TableModelListener.
Quando nel table model "qualcosa" cambia, esso va a notificare tutti i listener registrati.
Il principale listener è ... JTable! (JTable implementa TableModelListener) Proprio perché deve notificare la view e aggiornarsi visivamente.
Poi è chiaro che puoi anche registrare tuoi TableModelListener per "affari tuoi" ...
Quando si implementa un table model "custom", tipicamente si estende AbstractTableModel, semplicemente perché la gestione dei listener è già fatta di serie e in più offre una serie di metodi fireXYZ già fatti per notificare uno dei vari eventi facilmente (senza dover creare "a mano" un TableModelEvent).