This textbook provides an in-depth introduction to software design with a focus on
object-oriented design and using the Java programming language. Its goal is to help readers
learn software design by discovering the experience of the design process. To this end the
text follows a continuous narrative that introduces each element of design know-how in context
and explores alternative solutions in that context. This narrative is complemented by hundreds
of code fragments and design diagrams. The first chapter is a general introduction to software
design and the subsequent chapters cover design concepts and techniques. The concepts and
techniques covered include interfaces encapsulation inheritance design patterns composition
functional-style design unit testing and many more. A major emphasis is placed on coding and
experimentation as a necessary complement to reading the text. To support this aspect of the
learning process a companion website with practice exercises is provided as well as two
complete sample applications. Guidance on these sample applications is provided in Code
Exploration insets throughout the book. Although the Java language is used as a means of
conveying design-related ideas the book's main goal is to address concepts and techniques that
are applicable in a host of technologies. This second edition covers additional design
techniques such as input validation and dependency injection. It also provides extended and
revised treatment of many core subjects including polymorphic copying unit testing the
Observer pattern and functional-style programming.This book is intended for readers who have a
minimum of programming experience and want to move from writing small programs and scripts to
tackling the development of larger systems. This audience naturally includes students in
university-level computer science and software engineering programs. As the prerequisites to
specific computing concepts are kept to a minimum the content is also accessible to
programmers with no previous background in computing. In a similar vein understanding the code
fragments requires only a minimal grasp of the Java language such as would be taught in an
introductory programming course.