Most programmers learn by looking at computer programs. This book teaches you design patterns in exactly this way: by looking at computer programs and analyzing them in terms of the patterns that they use. Consequently, you learn how the patterns actually occur in the real world, and how to apply the patterns to solve real problems. This book also looks at the broader context of OO design and how the patterns solve commonplace OO design problems. It covers many of the principles of OO design--principles not covered by most books on Java--and shows you how to apply these principles to make your code easier to maintain and debug.