SOLID isn't five unrelated rules — it's one idea about managing dependencies and change. Watch one messy NotificationService become clean, one principle at a time.
SRP isn't 'do one thing' — it's 'answer to one actor'. Watch a Marketing copy tweak break Compliance's audit log, then split one NotificationService by who owns each change.
Every new notification channel meant another edit to the same switch — and another regression. Open/Closed makes new behavior a drop-in, not a rewrite.
An SmsChannel that can't do what a Channel promised isn't a safe stand-in for its base — so callers start type-checking. Liskov, explained simply: a subtype must work anywhere its parent does.
One fat Notifier interface forces every channel to stub methods it can't support and every caller to depend on methods it never calls. Interface Segregation splits it into roles.
A service that news-up its own email sender can't be tested or swapped. Dependency Inversion flips the arrow so high-level policy and low-level detail both depend on an abstraction.