The problem Observer solves
OrderService.place() saves an order. Then marketing asks for a confirmation email, so it calls the mailer. Then ops wants an SMS. Then analytics wants an event. Then the warehouse wants stock decremented, and finance wants an invoice row.
Now a method whose job is save an order imports six unrelated subsystems, and a flaky SMS provider can fail an order that was already written to the database. Every new reaction means editing, re-reviewing and re-deploying the single most critical method in your system.
And the coupling points the wrong way: ordering is core, notifications are peripheral, yet the core is the thing that has to know about all of them.
