Wzorzec interfejsu znacznika - Marker interface pattern

Wzór interfejsu znacznik jest wzorzec projektowy w informatyce , stosowany z języków, które zapewniają typu run-time informacji o obiektach. Zapewnia możliwość powiązania metadanych z klasą, w której język nie ma wyraźnej obsługi takich metadanych.

Aby użyć tego wzorca, klasa implementuje interfejs znacznika (zwany również interfejsem tagowania ), a metody, które wchodzą w interakcję z instancjami tej klasy, sprawdzają istnienie interfejsu. Podczas gdy typowy interfejs określa funkcjonalność (w formie deklaracji metod), którą musi obsługiwać klasa implementująca, interfejs znacznika nie musi tego robić. Sama obecność takiego interfejsu wskazuje na specyficzne zachowanie klasy implementującej. Możliwe są interfejsy hybrydowe, które działają zarówno jako znaczniki, jak i określają wymagane metody, ale mogą być mylące, jeśli zostaną niewłaściwie użyte.

Przykładem zastosowania interfejsów znacznikowych z języka programowania Java jest Serializableinterfejs. Klasa implementuje ten interfejs, aby wskazać, że jej nieprzejściowe składowe danych mogą być zapisywane w ObjectOutputStream. Metoda ObjectOutputStreamprywatna writeObject0(Object,boolean)zawiera serię instanceoftestów w celu określenia możliwości zapisu, z których jeden szuka Serializableinterfejsu. Jeśli którykolwiek z tych testów zakończy się niepowodzeniem, metoda zgłasza NotSerializableException.

Krytyka

Głównym problemem związanym z interfejsami znaczników jest to, że interfejs definiuje kontrakt na implementację klas, który jest dziedziczony przez wszystkie podklasy. Oznacza to, że nie możesz "odkleić" znacznika. W podanym przykładzie, jeśli tworzysz podklasę, której nie chcesz serializować (być może dlatego, że zależy to od stanu przejściowego), musisz uciec się do jawnego rzucania NotSerializableException(na ObjectOutputStreamdokumenty)

Innym rozwiązaniem jest bezpośrednia obsługa metadanych przez język :

  • Zarówno .NET Framework, jak i Java (od wersji Java 5 (1.5)) zapewniają obsługę takich metadanych. W .NET są one nazywane „atrybutami niestandardowymi” , w Javie nazywane są adnotacjami . Pomimo różnej nazwy, koncepcyjnie są tym samym. Można je zdefiniować na klasach, zmiennych składowych, metodach i parametrach metod, a dostęp do nich można uzyskać za pomocą odbicia .
  • W Pythonie termin „interfejs znaczników” jest powszechny w Zope i Plone . Interfejsy są deklarowane jako metadane, a podklasy mogą być używane implementsOnlydo deklarowania, że ​​nie implementują wszystkiego ze swoich superklas.

Zobacz też

  • Zaprojektuj markery do rozwinięcia tego wzoru.
  • Joshua Bloch, „Efektywna Java (wydanie drugie)”, punkt 37: Użyj interfejsów znaczników do zdefiniowania typów, strona 179 (wydanie trzecie: punkt 41, strona 191).

Bibliografia