Sto lavorando al refactoring di un'applicazione legacy in cui ho implementato correttamente il pattern State come mostrato nello schema seguente:

Comevedic'èuncomportamentocomunetrai3stati,quindihodecisodiestrarreilmetodocomuneRefund()inunaclasseastrattagenitoreRefundableStatedovel'hoimplementata:
Refactoring ulteriormente noto che il metodo Ship() è comune tra i 2 stati Cancelled e NewOrder , quindi vado per un altro giro di estrazione del comportamento comune a un'altra classe genitore ShippableState :
Ora ho bisogno del mio stato Cancelled per estendere 2 classi e nello stesso tempo non posso raggruppare la funzione Refund() e Ship() insieme poiché non tutti gli stati permettono le 2 azioni.
Come posso risolvere questo problema?
Note:
- Questa domanda riguarda principalmente l'applicazione di DRY e il refactoring non su come implementare il pattern di stato.
- Sto usando PHP 5.3, ma sono aperto a qualsiasi altra lingua.