Zpo-8-wyk-Slajd15
Replace Type Code with State
Przekształcenie to jest podobne do poprzedniego, a różnica polega na zastąpieniu mechanizmu dziedziczenia delegacją. Stosuje się je w tych przypadkach, gdy użycie podklas jest niemożliwe, np. w sytuacji, gdy obiekt musi zmienić swój stan (w przypadku podklas wymagałoby to utworzenia nowego obiektu, co często jest nie do przyjęcia z uwagi na różnicę referencji starego i nowego obiektu).
Celem przekształcenia jest wyłączenie sfery związanej ze stanami i zmiennym zachowaniem do oddzielnej hierarchii dziedziczenia, złożonej z klasy abstrakcyjnej (lub interfejsu) oraz jej podklas. Obiekt jest związany z obiektem reprezentującym określony stan relacją kompozycji, i poprzez nią deleguje wywołania do obiektu stanu.
Mechanika przekształcenia przebiega w następujących krokach. Na początku należy zahermetyzować pole stanu i udostępnić je przez metody dostępowe set/get. Następnym krokiem jest zdefiniowanie klasy abstrakcyjnej, której implementacje będą reprezentować stany obiektu, wraz z metodami set/get zapewniającymi dostęp do starego pola stanu. Inne metody zadeklarowane w tej klasie, które następnie będą pokrywane w podklasach, umożliwiają określenie, jakie zachowanie będzie zależało od stanu. Po stworzeniu klasy abstrakcyjnej należy zdefiniować jej podklasy, pokrywając odpowiednio metody set/get dostępu do pola stanu dziedziczone z nadklasy. W tym momencie następuje zdefiniowanie nowego mechanizmu opisu stanu: z pola przechowywanego bezpośrednio w klasie źródłowej do nowej, niezależnej hierarchii klas reprezentujących stany. Polega to na stworzeniu pola w klasie źródłowej, wskazującego na obiekt typu klasy abstrakcyjnej, a następnie zmianie metod set/get, tak aby odwoływały się do nowego pola reprezentującego stan. Ostatnim krokiem jest usunięcie starego pola stanu.