The DCI Architecture: A New Vision of Object-Oriented Programming (2009)
artima.com
artima.com
I'll often use it when building out tasks and services, where a simple model (data) is passed into a service (context) and interaction/behaviour specific to that task is injected into the model. In Ruby I'll typically use refinements to do this.
The primary purpose of this approach is avoiding model bloat in my code by being able to decompose additional complexity over time in a flexible way.
If you're interested in getting into DCI more deeply you might want to check out Jim Gay's "Clean Ruby" book (http://clean-ruby.com/)