The first thing you must realize is that the OO paradigm is really easy. Don't be intimidated by it.
The important relationships in OO are (name,uml,description,example):
Has a
<>- (aggregation)
<*>- (composition)
Class declares an object in it's declaration, class determines the lifetime of the object.
Composition: lifetime of member object depends on object that has it.
Aggregation: lifetime of member object depends on "new" and "deletion" from the object that has it.
Example: Dog has a head.
Knows a
-> (solid line)
Class declares an object in it's declaration, class doesn't determine the lifetime of the object. The object will be passed to this class via constructor of a set method (by use of pointer or reference).
Dog knows it's mother.
Uses a
--> (dashed line)
Class will create an object temporarily and either pass it off to a client or end it's lifetime. It could also be an object passed to the class that it uses temporarily in a function. No member variable to save the object in the class.
Dog uses a bone to clean it's teeth.
Is a
-|> (solid line with triangle)
--|> (dashed line with triangle, implements)
Class derives another class. That is, the class can be viewed as the class it derives from. The derived class contains each function and member variable of the class it derived. This is the key to polymorphism. The "Implements" relationship simply means that the class derives a special class which is called an interface. An interface contains only functions (or methods) that need to be implemented by the class deriving it. The interface has no definition for the function, so the derived must provide it.
Dog is a mammal.
Polymorphism is another important term used. It basically means doing something with a derived class by interacting with it being viewed as it's base class (the class it derived). For example, if you had a dog, a cat and a person and you wanted them all to talk..you could look at them as mammals and call a function Talk(). The dog might use the function Bark() in the Talk() function, the cat might use the function Meow(), and the person might use the Speak("Why am I grouped with cat's and dog's?").
The SOLID principles are rules to follow concerning these relationships.
OO Design patterns are reoccurring patterns that solve a certain problem. It's basically ways to design your code to follow the SOLID principles.
Other than that, learn a language that supports OO and dabble in it. Try out these relationships first, try to draw out your design in UML, and write it! Then try to understand some of the design patterns and how they relate to the SOLID principles. If you can do that, you're basically thinking like an OO designer/developer.