Как бы вы реализовали такую архитектуру в рамках PHP?
У объекта-модификатора должен быть метод combine, который возвратит скомбинированный объект. У скомбинированного объекта должен быть метод, который его снова разделит.

Иными словами, нужно что-то вроде вот этого: 
Можно сделать что-то подобное:

Подойдет, если изменения свойств карт затрагивают в основном только атрибуты (прибавить, отнять и т.д.)
в таком случае $modifier->apply($card) будет напрямую менять значения карты (например прибавит +5 к урону) $mofidier->revert($card) опять таки напрямую возвращает значения на исходную точку (отнять -5 от урона). 
Плюс такого решения, что нет проблемы ромба. Если карты очень различаются набором атрибутов, то Modifier можно сделать по подобию паттерна Visitor. 

Правда, тут может настать проблема с процентными модифицированиями (карта +20% урона плюс картa +5 урона дадут неправильный результат), но это можно обойти модифицировав логику ModifiebleSupport.