Before you can master design patterns, you must master SOLID. These five principles are the "Constitution" of Object-Oriented Programming. If you follow them, your code becomes naturally extensible, testable, and maintainable.
A class should have one, and only one, reason to change. If a class handles database logic AND email notifications, it's violating SRP. Split them.
Code should be Open for extension, but Closed for modification. You should be able to add new features by adding new classes, NOT by editing existing ones. Patterns like Strategy and Decorator are built on this principle.
Objects of a superclass should be replaceable with objects of its subclasses without breaking the application. Don't inherit if you have to throw NotImplementedException in the child class!
A client should never be forced to depend on methods it does not use. Large interfaces should be split into smaller, more specific ones (e.g., IReader and IWriter instead of a single IFileHandler).
High-level modules should not depend on low-level modules. Both should depend on Abstractions (Interfaces). This is the foundation of Dependency Injection.
Q: "What is the difference between 'Dependency Inversion' and 'Dependency Injection'?"
Architect Answer: "They are often confused but fundamentally different. **Dependency Inversion** is the high-level *Principle* (the 'D' in SOLID) that tells us to depend on abstractions. **Dependency Injection** is a specific *Pattern* or *Technique* used to implement that principle by passing (injecting) those abstractions into a class's constructor at runtime."