sobota, sierpnia 28

Chain of Responsibility


Purpose:

Gdy potrzebujemy by request mógł być obsłużony przez kilku odbiorców(handler). Odbiorcy są połączeniu ze sobą i przekazują wzajemnie między sobą wynik obsłużenia.


Use:

  • wiele obiektów może obsłużyć żądanie, nie jest zdeterminowane jaki obiekt będzie wstanie obsłużyć żądanie,
  • kilka obiektów może obsłużyć żądanie, obiekty obsługujące są determinowane w czasie wykonania (runtime),
  • jest do przyjęcia to, że żądanie nie zostanie obsłużone przez żaden obiekt.


Not Use:

  • każde żądanie obsługiwane jest tylko przez jedne obiekt,
  • gdy klient wie jaki serwis obsługuje jakie żądanie.


Example

Wzorzec ten realizowany jest przez obsługę wyjątków w niektórych językach. Gdy pojawia się wyjątek w metodzie, najpierw sprawdzane jest czy dana metoda posiada mechanizm obsługi, jeżeli dana metoda nie posiada mechanizmu obsługi wyjątek przekazywany jest do kolejnej metody na stosie. Przekazywanie kontynuowane jest do momentu napotkania metody potrafiącej obsłużyć wyjątek lub do skończenia się wywołań na stosie.


Resource:

wtorek, sierpnia 24

Gang of Four

Witam,
po pracowitym okresie nauki do SCJP i zdaniu egzaminu,

postanowiłem zrealizować mój stary pomysł szybkiego re-view wszystkich 23 wzorców przedstawionych przez Gang of Four, a po raz pierwszy zaprezentowanych w książce Design Patterns: Elements of Reusable Object-Oriented Software. Każdy wzorzec zostanie wyposażony w diagram, opis, przykład użycia oraz namiar na inne źródła z informacjami.


Creational Patterns, używane do tworzenia instancji w taki sposób by w jak największym stopniu ukryć logikę i skomplikowanie procesu tworzenia.

  • Abstract Factory - pozwala na zgrupowanie fabryk działających w tej samej domenie,
  • Builder - oddziela budowanie obiektu od prezentacji, ma za zadanie ukryć skomplikowany proces budowania,
  • Factory Method - budowanie złożonego obiektu bez dokładnego wyspecyfikowania drzewa zwróconych obiektów,
  • Prototype - tworzenie nowej instancji klasy na podstawie już istniejącej instancji,
  • Singleton - ma za zadanie zbudowanie tylko jednej instancji klasy. Niektóre źródła podają ten wzorzec jako 'antywzorzec'.


Structural Patterns, skupione są na klasach i dużych strukturach obiektów. Poprzez wykorzystanie dziedziczenia i kompozycji pozwalają na utworzenie nowych funkcjonalności na podstawie już istniejących.

  • Adapter - pozwalana na współpracę klas z niekompatybilnymi interfejsami,
  • Bridge - bardzo mocne oddzielenie(low coupling) formy abstrakcyjnej klasy od implementacji, co pozwala je traktować niezależnie,
  • Composite - zebranie kilku obiektów w jeden, pozwala to na manipulowanie obiektami jak by były jednym obiektem,
  • Decorator - dynamicznie dodaje/nadpisuje zachowanie metod w obiektach,
  • Facade - udostępnia uproszczoną formę dużej ilości złożonego kodu,
  • Flyweight - zmniejsza koszt tworzenia i manipulowania dużą liczbą podobnych obiektów,
  • Proxy - zastępnik dla innego obiektu, ma za zadanie kontrolować dostęp, zredukować koszt użycia.


Behavioral Patterns, mają za zadanie uprościć komunikację, dzielenie się obowiązkami pomiędzy obiektami.

  • Chain of Responsibility - deleguje polecenia do łańcucha przetwarzania,
  • Command - tworzy obiekt enkapsulujący działanie i parametry,
  • Interpreter - interpretuje nasz wewnętrzny język (nasz mały DSL),
  • Iterator - sekwencyjny dostęp do obiektów bez zdradzania wewnętrznej implementacji,
  • Mediator - pozwala na luźne powiązanie klas, gdzie tylko mediator posiada informację o budowie obiektów. Klasy wzajemnie nie posiadają informacji o swoich metodach,
  • Memento - umożliwia zawsze przywrócenie obiektu do stanu z przed zmiany, operacja(undo),
  • Observer - wzorzec publish/subscribe pozwala dużej liczbie obserwatorów(observers) zobaczyć zdarzenia,
  • State - pozwala na zmianę zachowania obiektu, gdy jego stan ulegnie zmianie,
  • Strategy - pozwala na wybieranie algorytmu ze zbioru podczas runtime'u,
  • Template Method - definiuje szkielet algorytmu jako klasę abstrakcyjną, konkretne implementacje precyzują poszczególne zachowania,
  • Visitor - wydzielenie algorytmu ze struktury na której pracuje.


Polecam też kilka anglojęzycznych katalogów wzorców:

sobota, sierpnia 14

google.com vs Oracle(fake Sun)

Witam,
pewnie większość z was już się dowiedziała, że Oracle zasępił się na Google. Pierwsze zdanie wyraża moje sympatie, ale nie o tym chce pisać.

Przeczytanie kliku postów pozwoliło mi stwierdzić, że nie chodzi tu o łamanie patentów, ale o pieniądze. W sieci pojawiała się informacja, że Android zanotował ogromny wzrost popularności. Panowie z Oracle zorientowali się, że można spory kawałek tortu dla siebie zagarnąć.

Podobna historia pojawiała się już wcześniej Sun vs Microsoft, wtedy Java nie posiadała jeszcze tak ugruntowanej pozycji i Microsoft porzucił Jave. Działanie Sun'a pozwoliło na pojawienie się na C# i .NET - pomijając fakt, że pochodzą z Microsoft - znakomite rozwiązanie, nie można mu nic złego zarzucić.

Podejrzewam, że dziś będzie inaczej. Google postara się osiągnąć jakieś ogólne porozumienie, które pozwoli Oracle dostawać ich kawałek Android'owego tortu, a nie narazi google na straty i upokorzenie. Jeżeli porozumienie by nie zostało osiągnięte to rychło zobaczymy nowe googlowe rozwiązania. Może zostanie bardziej rozbudowany google GO lub też uśmiechną się do c++, pythona.

W chwili obecnej chyba google nie porzuci 25% rynku programistycznego i pewnie podpisze porozumienie z Oracle.

Oracle zaczyna się bawić w trola patentowego, tak dużej i porządnej firmie to nie przystoi.

Jeżeli ktoś jest zainteresowany aspektami technicznymi pozwu polecam en.swpat.org/wiki/Oracle_v._Google_%282010,_USA%29.