"Perfect behavior is born of complete indifference."
Often one finds that certain types of logic are repeated throughout a program. Many separate parts of an application share similar concerns such as logging, security, or transactions. These are known as crosscutting concerns.
Rather than address these concerns in each individual class (as one would do normally), it's easier to address them all at once from a central location. Not only does this reduce repetitive boilerplate code, but it also makes maintenance of existing code less complicated.
Let's look at an example.
Brokerage is a class that places an order for stock inside a database transaction. Traditionally, we would write code for ...