Single responsibility (a class and method does only one thing)

Richter substitution (polymorphic, subclass extensible parent class)

Dependency inversion (details depend on abstractions, lower levels depend on upper levels)

Interface isolation (creating a single interface)

Demeter principle (least know, less coupling)

Open closed Principles (Abstract architecture, extended implementation)