Композиция (Composition): Объект содержит другие объекты как свои поля. Отношение "has-a" (имеет), в отличие от "is-a" (является) при наследовании. Позволяет гибко менять поведение объекта, подставляя разные реализации входящих объектов.
java
Делегация (Delegation): Объект передает выполнение задачи другому объекту. Часто используется совместно с композицией.
java
Интерфейсы (Interfaces): Определяют контракт поведения, который может реализовывать множество классов. Позволяет достичь полиморфизма без жесткой иерархии наследования.
java
Traits (трейты) / Mixins (миксины) (присутствуют в некоторых языках, например, Scala, Groovy): Представляют собой набор методов, которые могут быть "подмешаны" в класс. Позволяют повторно использовать функциональность в несвязанных иерархиях классов. В Java их можно частично имитировать с помощью интерфейсов с default-методами.
java
Аспектно-ориентированное программирование (Aspect-Oriented Programming - AOP): Позволяет выделить сквозную функциональность (логирование, безопасность и т.д.) в отдельные модули (аспекты) и "внедрять" ее в различные части приложения без изменения исходного кода классов.
Каждая альтернатива имеет свои преимущества и недостатки. Выбор зависит от конкретной задачи и требований к гибкости, повторному использованию кода и сложности архитектуры. Композиция, делегация и использование интерфейсов часто предпочтительнее прямого наследования, особенно в случаях, когда наследование приводит к жесткой иерархии или "проблеме ромба".