background image

Inżynieria Oprogramowania, wykład 5

1

Inżynieria oprogramowania (5)

Inżynieria oprogramowania (5)

→ Wzorce projektowe 

Wykorzystano: materiały na stronach Data & Object Factory (www.dofactory.com) 

oraz szeroko dostępną literaturę…

Przygotował: dr inż. Dariusz 

Pierzchała

dariusz.pierzchala@wat.edu.pl

background image

Inżynieria Oprogramowania, wykład 5

2

O czym teraz…

Wzorce architektoniczne

konstrukcyjne

strukturalne,

operacyjne; 

Projektowanie obiektowe z wykorzystaniem 

wzorców

Przykłady diagramów UML i programów;

Cel:

Zapoznać z przeznaczeniem i własnościami wzorców 

projektowych;

background image

Inżynieria Oprogramowania, wykład 5

3

Proces tworzenia oprogramowania 

Zbiór czynności i związanych z nimi wyników, które 

prowadzą do powstania produktu programowego;

Zasadnicze czynności wspólne dla wszystkich procesów:

Specyfikowanie oprogramowania 

•Funkcjonalność oprogramowania  i ograniczenia jego działania muszą 

być zdefiniowane;

Projektowanie i implementowanie 

oprogramowania

•Oprogramowanie, które spełnia specyfikację, musi 

być stworzone;

Zatwierdzenie oprogramowania 

•Wytworzone oprogramowanie musi spełniać oczekiwania klienta;

Ewolucja oprogramowania 

•Oprogramowanie musi ewoluować, aby spełniać zmieniające się 

potrzeby użytkowników;

background image

Inżynieria Oprogramowania, wykład 5

4

Historia

Lata 60-70-te - architekt Christopher Alexander krytykuje 

nowoczesne, świadome projektowanie;

Zauważalna skuteczność wielu metod tradycyjnych, 

wypracowanych ewolucyjnie poprzez praktykę;

Podstawowe zarzuty wobec abstrakcyjnych modeli 

dotyczące   problemów podczas konkretnej realizacji;

Poszukiwanie alternatywy wśród metod stosowanych w 

architekturze budowlanej;

W swoich pracach opisał ponad 250 wzorców;

Każdy wzorzec był małym podręcznikiem opisującym 

konkretne zagadnienia architektury, np. „Główne wejście”;

Wynik prac: odwzorowanie metod i stylów 

architektonicznych (budowanych) w architekturze 

systemów informatycznych; 

background image

Inżynieria Oprogramowania, wykład 5

5

Historia

1987 - Ward Cunningham i Kent Beck: koncepcja wzorców 

projektowych do nauczania programistów Smalltalk’a;

Nie sprawdziły się w podejściu proceduralnym lat 70-80-

tych;

1991 – Bruce Andersen odkrywa ponownie ich 

zastosowanie w OOD/OOP;

1993 – Gang Of Four: E. Gamma,  R. Helm, R. Johnson,  J. 

Vlissides;

1994 – GoF: “Design Patterns: Elements of Reusable 

Object-Oriented Software”:

opisują wzorce projektowe;

aktualnie znane i powszechnie stosowane;

Bruce Eckel: „Thinking in Patterns”, 

aktualnie dostępne na 

www.bruceeckel.com

background image

Inżynieria Oprogramowania, wykład 5

6

Historia

Aktualna literatura

background image

Inżynieria Oprogramowania, wykład 5

7

Pojęcie wzorca

Wzorce projektowe stanowią powtarzalne rozwiązanie 

zagadnień projektowych, z którymi się wciąż spotykamy;

Smalltalk Companion

Wzorce projektowe stanowią zbiór reguł określających jak 

osiągnąć pewne cele w dziedzinie programowania;

Pree, 1994

Wzorzec adresowany jest do powtarzających się 

problemów, które pojawiają się w specyficznych 

momentach projektowania i stanowi dla nich rozwiązanie;

Bushmann, 1996

Wzorzec identyfikuje i specyfikuje pewna abstrakcję, której 

poziom znajduje się powyżej poziomu abstrakcji 

pojedynczej klasy, instancji lub komponentu;

Gamma, 1993

background image

Inżynieria Oprogramowania, wykład 5

8

Pojęcie wzorca

Sprawdzone szkieletowe rozwiązania:

Wzorce dostarczają sprawdzonych rozwiązań dla 

powtarzających się problemów;

Możliwe do zastosowania w wielu rzeczywistych kontekstach;

Wpływają na sposób modelowania;

Zapobiegają „wymyślaniu koła od nowa”;

Usprawniają komunikację:

Ułatwiają dyskusję nad problemem i znalezienie właściwego 

rozwiązania;

Ułatwiają tworzenie dokumentacji:

Pozwalają na dużo szybsze zdefiniowanie i opisanie systemu;

Dokumentacja może zawierać odwołania do katalogów wzorców 

i książkach o wzorcach w celu uzupełnienia opisu systemu;

Wzorce projektowe zwiększają:

elastyczność, 

wielokrotne wykorzystanie 

oraz czytelność projektu;

background image

Inżynieria Oprogramowania, wykład 5

9

Pojęcie wzorca

Szablon definicji wzorca:

Nazwa wzorca

•znacząca dla problemu i rozwiązania

Kontekst 

•opis problemu

Argumenty

•czynniki wpływające na proponowane rozwiązanie
•powody dla których warto stosować dany wzorzec

Rozwiązanie

•struktura: najczęściej diagram klas + diagram sekwencji
•strategie: sposoby implementacji wzorca

Konsekwencje

•wady i zalety danego wzorca

Przykłady zastosowania (opcjonalnie)

Powiązane wzorce i porównanie z innymi

background image

Inżynieria Oprogramowania, wykład 5

10

Pojęcie wzorca

Procedura wyboru wzorca:

Wyróżnienie i zdefiniowanie problemów w projekcie;

Przegląd wzorców i wybór pasujących – kryterium:

•cele,
•kiedy można stosować,
•sposób rozwiązania problemu;

Określenie zakresu zmian w projekcie;

Ocena kosztów zmian w projekcie;

Zastosowanie wzorca:

Zdefiniowanie klas – uczestników wzorca;

Zdefiniowanie operacji wzorca;

Zintegrowanie wzorca z projektem (oprogramowaniem);

background image

Inżynieria Oprogramowania, wykład 5

11

Podział wzorców

Podział wzorców - 1:

 

Analityczne – ułatwiają modelowanie dziedziny

Projektowe – opisują pewne techniki projektowe

Architektury – standardowe rozwiązania architektury

Organizacyjne – opisują organizację pracy zespołu

Podział wzorców - 2:

Konstrukcyjne

Strukturalne

Operacyjne (czynnościowe)

Podział wzorców - 3:

Warstwy prezentacji

Warstwy logiki

Warstwy integracji

background image

Inżynieria Oprogramowania, wykład 5

12

Podział wzorców

Architektura globalna: koordynacja i komunikacja pomiędzy 

organizacjami;

Architektura korporacyjna (enterprise): koordynacja i 

komunikacja w obrębie organizacji;

Architektura systemu: koordynacja i komunikacja pomiędzy 

aplikacjami;

Architektura aplikacji (Subsystem): dostarczanie 

funkcjonalności;

Makro-architektura (Frameworks): powtarzające się 

aplikacje;

Mikro-architektura: wzorce projektowe;

Obiekty: specyficzne konstrukcje w językach 

programowania;

background image

Inżynieria Oprogramowania, wykład 5

13

Podział wzorców

Podział wzorców:

konstrukcyjne 

•wykorzystywane do pozyskiwania obiektów 

zamiast ich bezpośredniego tworzenia;

strukturalne 

•stosowane do łączenia obiektów w większe 

struktury;

operacyjne (czynnościowe)

•definiowanie komunikacji pomiędzy obiektami;
•kontrolowanie przepływów danych w złożonych 

algorytmach (programach);

•przydział zobowiązań obiektom;

background image

Inżynieria Oprogramowania, wykład 5

14

Wzorce konstrukcyjne

background image

Inżynieria Oprogramowania, wykład 5

15

Wzorce konstrukcyjne

Służą do pozyskiwania obiektów;

Opisują szczegółowo, jak obiekt może zostać stworzony,

Czynią kod niezależnym od typów tworzonych obiektów;

Wybór konkretnej klasy uzależniany jest np. od 

parametrów konfiguracyjnych;

Przykłady:

Singleton,

Fabryka,

Metoda Fabrykująca,

Fabryka Abstrakcyjna,

Budowniczy,

Prototyp;

background image

Inżynieria Oprogramowania, wykład 5

16

Singleton

Zapewnia powołanie tylko jednej instancji obiektu w 

całej aplikacji i kontrolowany dostęp; 

Obiekt powołany wg tego wzorca jest globalnym 

punktem dostępu do instancji danej klasy ;

Wzorzec może być zmodyfikowany do tworzenia 

określonej liczby instancji danej klasy (>1);

Funkcje wzorca:

utworzenie obiektu,

inicjalizacja obiektu,

punkt dostępu,

modyfikacja obiektu;

Prostszym rozwiązaniem jest: globalnie dostępna 

zmienna statyczną przechowująca referencję do 

obiektu;

background image

Inżynieria Oprogramowania, wykład 5

17

Singleton

background image

Inżynieria Oprogramowania, wykład 5

18

class Singleton {
  private Singleton instance;
  private int i; // dodatkowe pole
  private Singleton() {
    //  }
  public static Singleton getInstance() {
    if (instance == null)
      instance = new Singleton();
    return instance;
  }
  // dodatkowe metody dla pola ‘i’
  public int getValue() { 
    return i; }
  public void setValue(int x){ 
    i = x; }
}

Singleton

Singleton

instance : Singleton

Singleton()

<<static>> getInstance() : Singleton

doSth() : void

Przykład 

implementacyjny:

Java

background image

Inżynieria Oprogramowania, wykład 5

19

template <class TYPE>
class 

Singleton

 {

public:
  // Global access point
  static TYPE *

instance

 (void);

protected:
  // Default constructor
  Singleton (void);
  // Contained instance.
  TYPE instance_; };

Singleton

template <class TYPE>
TYPE * Singleton::instance_ = 0;

template <class TYPE>
TYPE * Singleton::

instance

 (void) 

{
  if (Singleton<TYPE>::instance_ == 0) 

  {

Singleton<TYPE>::instance_ = 

new Singleton<TYPE>;

  }
  return Singleton<TYPE>::instance_;
};

Przykład implementacyjny:

Template w Cpp

background image

Inżynieria Oprogramowania, wykład 5

20

Fabryka (factory)

Fabryka nowych obiektów w zdefiniowanych 

klasach wzorcowych;

Wszystkie klasy wzorcowe mają metody o tej 

samej nazwie, ale o innych realizacjach;

Zaleta – możliwość modyfikowania klas 

wzorcowych (tworzących) w jednym miejscu 

projektu;

Popularne wersje Fabryki: 

Metoda Fabrykująca, 

Fabryka Abstrakcji,

Budowniczy,

Prototyp;

background image

Inżynieria Oprogramowania, wykład 5

21

Fabryka (Factory method)

Metoda Fabrykująca (factory method)

Fabryka nie może przewidzieć, jakie obiekty i 

w jaki sposób tworzyć;

Klient zna tylko interfejs klasy abstrakcyjnej;

Informacje o sposobie i odpowiedzialność za 

tworzenie obiektu znajdują się w 

implementacjach „metody tworzącej” klas 

pochodnych;

Można tworzyć domyślny produkt, ale też dać 

użytkownikowi możliwość podstawienia 

swojej wyspecjalizowanej wersji;

background image

Inżynieria Oprogramowania, wykład 5

22

Fabryka (Factory method)

Uczestnicy wzorca:

Product 

•Deklaracja interfejsu produktu; 

ConcreteProduct 

•Implementacja interfejsu produktu;

Creator (Factory)

•Deklaracja interfejsu z metodą tworzącą produkt;
•Może tworzyć domyślny obiekt;

ConcreteCreator (ConcreteFactory)

•Potomek klasy Creator zwracający konkretny produkt;

background image

Inżynieria Oprogramowania, wykład 5

23

Fabryka (Factory method)

<<creates>>

<<creates>>

background image

Inżynieria Oprogramowania, wykład 5

24

Fabryka (Factory method)

Wersja z różnymi produktami oraz klientem

background image

Inżynieria Oprogramowania, wykład 5

25

Fabryka (Factory method)

class ConcreteFactory_A extends 

Factory

 {

  public ConcreteProduct createProduct() {
    return new ConcreteProduct_A ();
  }
}

...

Factory

 fab_A = new ConcreteFactory_A ();

Concrete

 p = fab_A.createProduct();

Przykład 

implementacyjny

background image

Inżynieria Oprogramowania, wykład 5

26

Fabryka (Abstract factory)

Fabryka Abstrakcji (abstract factory)

Tworzenie rodzin powiązanych ze sobą obiektów bez 

konieczności posługiwania się ich konkretnymi 

klasami;

Wprowadzenie wielu metod zwracających obiekty, 

spełniające określone interfejsy;

Klient nie musi znać szczegółów budowania rodzin 

obiektów;

Implementowana często z wykorzystaniem Factory 

Method;

background image

Inżynieria Oprogramowania, wykład 5

27

Fabryka (Abstract factory)

Uczestnicy wzorca:

AbstractFactory

•Deklaracja interfejsu operacji fabryki;

ConcreteFactory

•Implementuje operacje dla konkretnych produktów;

AbstractProduct 

•Deklaracja interfejsu produktu;

ConcreteProduct 

•Definicja konkretnego produktu;
•Implementacja interfejsu produktu abstrakcyjnego;

Client 

•Obiekt używający w deklaracji interfejsu fabryki i produktu;
•Konkretyzowany w implementacji;

background image

Inżynieria Oprogramowania, wykład 5

28

Fabryka (Abstract factory)

Factory

createProduct_AbstractProduct_A()

AbstractProduct_A

<<creates>>

ConcreteProduct_A

AbstractFactory

createProduct_AbstractProduct_A()

<<creates>>

Client

1

-theAbstractFactory

1

<<creates>>

background image

Inżynieria Oprogramowania, wykład 5

29

Fabryka (Abstract factory)

interface AbstractFactory {
  public AbstractProduct_A  

 

createProduct_AbstractProduct_A ();

  //...
}

class Factory implements AbstractFactory {
  public AbstractProduct_A 

  

createProduct_AbstractProduct_A () {

    return new ConcreteProduct_A();
  }
}

Przykład 

implementacyjny

background image

Inżynieria Oprogramowania, wykład 5

30

Fabryka (Abstract factory)

Wersja z różnymi produktami

background image

Inżynieria Oprogramowania, wykład 5

31

Fabryka (Builder)

Budowniczy (builder)

Funkcjonalnie zbliżony do Fabryki Abstrakcyjnej:

•tworzą złożone twory;
•Builder tworzy stopniowo, zaś Fabryka Abstrakcyjna kładzie 

nacisk na rodzinę produktów tworzonych w jednym działaniu;

Dostarcza interfejs dla klasy zarządzającej 

tworzeniem obiektu (zwanej Director lub Context);

Obiekt tworzony jest wieloetapowo, na podstawie 

dostarczonych argumentów;

Klasa zarządzająca ukrywa szczegóły tworzenia; 

background image

Inżynieria Oprogramowania, wykład 5

32

Fabryka (Builder)

Budowniczy (builder)

Director

construct()

Builder

buildPart()

1

1

ConcreteBuilder

Product

<<creates>>

Wywołaj bulid dla wszystkich 
składowych struktury

background image

Inżynieria Oprogramowania, wykład 5

33

Fabryka (Prototype)

Prototyp (prototype)

tworzenie obiektów przez klonowanie prototypu;

obiekty klonowane muszą umożliwiać zmianę swoich 

właściwości;

stosowane, gdy tworzenie obiektów zabiera dużą 

ilość czasu, np. obiekt utworzono na podstawie 

odpowiedzi z zapytania do bazy danych;

background image

Inżynieria Oprogramowania, wykład 5

34

Fabryka (Prototype)

Uczestnicy wzorca:

Prototype 

•Deklaracja interfejsu dla obiektu klonowanego;

ConcretePrototype 

•Implementuje operacje klonujące;

Client 

•Tworzy obiekt wysyłając komunikat z poleceniem 

sklonowania;

background image

Inżynieria Oprogramowania, wykład 5

35

Fabryka (Prototype)

background image

Inżynieria Oprogramowania, wykład 5

36

Fabryka (Prototype)

Prototyp (prototype)

class Fabryka {
  Map prototypy;
  public Fabryka() {
    prototypy = new HashMap();
    prototypy.put("tomek",new Tomek());
    prototypy.put(”marek",new Marek());
  }
  public Klon makeObject( String s ) {
    return ((Klon)prototypy.get(s)).klonuj();
  }
}

interface Klon {
  Klon klonuj();
}
class Tomek implements Klon {
  Klon klonuj() {
    return new Tomek();
  }
}

Przykład 

implementacyjny

background image

Inżynieria Oprogramowania, wykład 5

37

Wzorce konstrukcyjne

Podsumowanie:

Singleton – pojedyncza instancja obiektu;

Metoda Fabrykująca – tworzenie obiektów w klasach 

pochodnych;

Fabryka Abstrakcyjna – tworzenie rodzin obiektów 

bez wydzielonych klas fabryk;

Budowniczy – ukrycie szczegółów tworzenia za 

interfejsem zarządcy;

Prototyp – tworzenie kopii na podstawie w pełni 

zainicjalizowanej instancji;

background image

Inżynieria Oprogramowania, wykład 5

38

Wzorce strukturalne

background image

Inżynieria Oprogramowania, wykład 5

39

Wzorce strukturalne

Stosowany do łączenia obiektów w większe struktury;

Zastosowanie np. w implementacji złożonego 

interfejsu użytkownika;

Przykłady:

Fasada,

Adapter,

Most,

Kompozyt,

Dekorator,

Waga Piórkowa,

Proxy;

background image

Inżynieria Oprogramowania, wykład 5

40

Fasada (façade)

Ujednolicony i prostszy interfejs do struktury 

złożonych podsystemów;

Separacja klienta od złożonych podsystemów;

Wybór odpowiedniej struktury dla żądania klienta;

Możliwości zmian w ukrywanych podsystemach;

Przykłady:

w bibliotekach Javy: klasy pakietu java.sql (Statement, 

ResultSet);

wejście usług w Service Oriented Architecture (SOA);

background image

Inżynieria Oprogramowania, wykład 5

41

Fasada (façade)

Client

Korzysta z funkcjonalności udostępnianej przez 

podsystem;

Facade

Tłumaczy zgrupowane żądania klientów na 

pojedyncze wywołania metod usług i obiektów 

biznesowych;

Facade_Subsystem

Złożony podsystem pracujący niezależnie od 

pośredniczącego Facade;

background image

Inżynieria Oprogramowania, wykład 5

42

Fasada (façade)

Facade_SubsystemClass_A

Facade

<<creates>>

Facade_Client

-theFacade

1

1

background image

Inżynieria Oprogramowania, wykład 5

43

Fasada (façade)

Przykład:
Podsystemem są: ApplicationService, BusinessObject
Usługi i obiekty biznesowe są nieświadome istnienia obiektów Façade.

background image

Inżynieria Oprogramowania, wykład 5

44

Fasada (façade)

background image

Inżynieria Oprogramowania, wykład 5

45

Adapter

Konwertuje (dopasowuje) interfejsy jednej klasy 

do interfejsu innej klasy; 

Umożliwia klasom o różnych interfejsach 

współpracę w jednym programie;

Niewielka elastyczność – adaptacji podlega tylko 

jedna klasa (Adaptee), bez jej podklas;

Zmiana zachowania klasy Adapter może zmienić 

zachowanie klasy dostosowywanej Adaptee;

Dwa sposoby realizacji: 

dziedziczenie,

kompozycja;

background image

Inżynieria Oprogramowania, wykład 5

46

Adapter

Uczestnicy wzorca

Target 

•definiuje interfejs znany klasie Client;

Client 

•współpracuje z obiektami zgodnymi z interfejsem Target;

Adaptee 

•definiuje istniejący interfejs, wymagający adaptacji;

Adapter 

•adaptuje interfejs Adaptee do interfejsu Target;

background image

Inżynieria Oprogramowania, wykład 5

47

Adapter

Wersja z delegacją (kompozycja)

Target

request()

<<Interface>>

Client

-theTarget

1

1

Adaptee

specificRequest()

Adapter

request()

-AdapteeRef

1

1

background image

Inżynieria Oprogramowania, wykład 5

48

Adapter

Wersja z dziedziczeniem wielobazowym

background image

Inżynieria Oprogramowania, wykład 5

49

Adapter

class Adapter extends Target {
  private Do_Adapatacji da;
  public Adapter(Do_Adaptacji a) 

  {
    da = a;
  }
  public void request() {
    da.specificRequest();
  }
// ...
Do_Adaptacji a = new Do_Adaptacji();
Target t = new Adapter(a);

class Target {
  public void request() {
    //...
  }
}
class Do_Adaptacji {
  public void specificRequest()
    //...
  }
}

Przykład 

implementacyjny

background image

Inżynieria Oprogramowania, wykład 5

50

Most a Adapter

podobny do wzorca Adapter;

jest to także obiekt konwertujący jeden rodzaj 

interfejsu na inny;

różnice:

przeznaczeniem Adaptera jest dostosowanie 

interfejsu  klasy istniejącej do innej klasy;

Most odseparowuje interfejs od jego implementacji, 

co daje możliwość zmiany implementacji bez 

modyfikacji kodu wywołania w programie;

implementacja będzie wybrana lub zmieniona w 

trakcie wykonania;

background image

Inżynieria Oprogramowania, wykład 5

51

Kompozyt (Composite)

System złożony z podsystemów o strukturze 

drzewiastej ( reprezentacja związku „całość-

część”);

Wspólny interfejs dla klas węzłów i liści – 

ujednolicone widzenie kontenerów i obiektów 

składowanych;

Łatwo rozszerzalny o nowe podsystemy 

implementujące (określony interfejs);

Przykłady:

Przykład w bibliotekach Javy: kontenery (Panel, 

JComponent, …);

background image

Inżynieria Oprogramowania, wykład 5

52

Kompozyt (Composite)

Uczestnicy wzorca

Component 

•Definiuje interfejsy: dla klasy Client oraz dla węzłów i liści 

składowych;

•Implementuje domyślne zachowanie;

Leaf 

•Definiuje zachowanie „prymitywów”;
•Nie ma potomków;

Composite 

•Implementuje zachowanie złożonych obiektów;
•Posiada potomków;

Client

•współpracuje z obiektami kompozycji poprzez interfejs 

Component;

background image

Inżynieria Oprogramowania, wykład 5

53

Kompozyt (Composite)

background image

Inżynieria Oprogramowania, wykład 5

54

Kompozyt (Composite)

Struktura węzłów i liści:

// Component
class Graphic {
 void 

Draw

(); 

 void 

AddChild

(Graphic g);

 void 

RemoveChild

(Graphic g);

 Graphic 

GetChild

(int i);

 int 

ChildCount

(); 

}

Przykład 

implementacyjny

// Leaf
class Rectangle extends 

Graphic {
 void 

Draw

(){   

  g.drawRectangle(x, y, w, h); 

 }; 
 ... }

// Composit
class Group extends Graphic {
 void 

Draw

(){   

  for(int i=0;         

  i<GraphicGroup.size(); i++) 

{((Graphic)GraphicGroup.elementAt(i)).

Draw(); } }

 ... }

Operacje 

nadmiarowe w 

klasie liści 

(Leaf)

background image

Inżynieria Oprogramowania, wykład 5

55

Dekorator

Podstawowe zachowanie klasy musi być czasami 

rozszerzone o dodatkowe operacje lub cechy;

Funkcjonalność uzupełniająca umieszczana jest w 

osobnych klasach Decorator;

Stosowany zamiast dziedziczenia, które mogłoby 

stworzyć zbyt wiele mało elastycznych klas;

Dekorator agreguje w sobie dekorowane obiekty i 

dziedziczy z tej samej nadklasy, co te obiekty;

Dynamiczna zmiana klasy nadrzędnej;

Utworzenie klasy poprzez dodanie nowego zachowania;

Przekazanie klasy rozszerzonej do konstruktora Dekoratora;

Przykład:

w bibliotekach Javy: klasy strumieni (BufferedInputStream, …);

background image

Inżynieria Oprogramowania, wykład 5

56

Dekorator

background image

Inżynieria Oprogramowania, wykład 5

57

Dekorator

JPanel jp = new JPanel();
getContentPane().add( jp );
jp.add( new 

JButton

(”Bazowy-A”));

jp.add( new 

Decorator

( new 

JButton

(”Rozszerzony-A”)) );

jp.add( new 

Decorator

( new 

JButton

(”Rozszerzony-B”)) );

jp.add( new 

Decorator

( new 

JButton

(”Rozszerzony-C”)) );

public class 

Decorator

 extends 

JComponent

 {

  

JComponent

 comp;

  public 

Decorator

JComponent

 jc ) {

    setLayout( new BorderedLayout() );
    add( "Center", jc )
    comp = this;
    ... // np. obsługa zdarzeń
  } }

Przykład 

implementacyjny

background image

Inżynieria Oprogramowania, wykład 5

58

Waga Piórkowa (flyweight)

Zastąpienie wielu obiektów jednym współdzielonym z opisem 

stanu zubożonym w porównaniu z pierwotnym obiektem;

Zamiast przechowywać wewnątrz atrybuty stanu, obiekty 

dostają wartości z zewnątrz jako parametry wywołania 

metod; 

Zalety:

Ograniczenie liczby tworzonych instancji obiektów;

Przesunięcie części danych z obiektu do przekazywanych 

parametrów metod;

Wady:

Zwiększony koszt wywoływania metod obiektów;

Uzyskuje się przyspieszenie programów operujących na 

wielu niezbyt złożonych obiektach;

Przykład: zbiory obiektów „znaków literowych”; 

background image

Inżynieria Oprogramowania, wykład 5

59

Waga Piórkowa (flyweight)

background image

Inżynieria Oprogramowania, wykład 5

60

Pośrednik (proxy)

Punkt kontroli dostępu do rzeczywistego obiektu 

-ogranicza (ukrywa) dostęp do obiektu (podobnie jak 

Dekorator); 

Odsunięcie w czasie tworzenia rzeczywistego obiektu;

Działania wykonywane są na Pośredniku, który działa 

na właściwej klasie o tym samym interfejsie; 

Stosowany, gdy obiekt docelowy jest złożony i np. 

potrzebuje wiele czasu na wczytanie (patrz sieć);

Przykład:

W bibliotekach Javy: ziarna "enterprise" (Enterprise JavaBeans) 

i komunikacja z bazą danych;

background image

Inżynieria Oprogramowania, wykład 5

61

Pośrednik (proxy)

Subject

Wspólny interfejs implementowany przez obiekt Proxy i 

rzeczywisty obiekt, udostępniany obiektom typu Client;

RealSubject

Definicja rzeczywistego obiektu;

Proxy

Zarządza dostępem do rzeczywistego obiektu, może zajmować 

się jego tworzeniem i usuwaniem; 

Client

Wykorzystuje funkcjonalność zaimplementowaną w 

rzeczywistych obiektach; 

Obiekty typu Client nie posługują się referencjami do obiektów 

rzeczywistych;

background image

Inżynieria Oprogramowania, wykład 5

62

Pośrednik (proxy)

background image

Inżynieria Oprogramowania, wykład 5

63

Wzorce strukturalne

Podsumowanie:

Fasada – prosty interfejs złożonego (pod-)systemu;

Adapter – dostosowanie interfejsów różnych klas;

Most – odseparowanie interfejsu od implementacji;

Kompozyt – elementy struktury drzewiastej;

Dekorator – dynamiczne rozszerzenie obiektu;

Waga Piórkowa – lekkie instancje obiektów;

Proxy – aktualna reprezentacja obiektu docelowego;

background image

Inżynieria Oprogramowania, wykład 5

64

Wzorce operacyjne (czynnościowe)

background image

Inżynieria Oprogramowania, wykład 5

65

Wzorce operacyjne (czynnościowe)

W celu definiowania komunikacji pomiędzy 

obiektami;

Pomagają kontrolować przepływ danych w 

złożonym programie;

Przykłady:

Iterator,

Łańcuch Odpowiedzialności,

Stan,

Mediator,

Obserwator,

Strategia;

background image

Inżynieria Oprogramowania, wykład 5

66

Iterator

Upraszcza przemieszczanie po kolekcji danych 

(np. liście), z wykorzystaniem standardowego 

interfejsu;

Nie wymaga znajomości wewnętrznej struktury 

kolekcji danych;

Umożliwia równoczesne przeglądanie kilku 

kolekcji;

Przykład:

W bibliotekach Javy: iterator w kolekcjach z pakietu 

java.util;

background image

Inżynieria Oprogramowania, wykład 5

67

Iterator

background image

Inżynieria Oprogramowania, wykład 5

68

Łańcuch Odpowiedzialności (chain of

responsibility)

Zestaw klas obsługuje żądanie w określonej 

kolejności;

Żądanie jest przekazywane pomiędzy klasami 

w określonym łańcuchu;

Czasami ostatni obiekt łańcucha obsługuje 

wszystkie żądania;

Przykład:

Realizacja w Javie: Frame -> Panel -> Component; 

background image

Inżynieria Oprogramowania, wykład 5

69

Łańcuch Odpowiedzialności (chain of

responsibility)

background image

Inżynieria Oprogramowania, wykład 5

70

Łańcuch Odpowiedzialności (chain of

responsibility)

public interface Chain
{
  public void addChain( Chain c );
  public void sendToChain( String msg );
  public Chain getChain();
}

Przykład 

implementacyjny

background image

Inżynieria Oprogramowania, wykład 5

71

Stan (state)

Tworzy obiekty pochodne z bazowej klasy State 

dla każdego stanu, w którym może znaleźć się 

aplikacja; 

Przełączanie pomiędzy obiektami stanu, gdy 

zmieni się stan aplikacji;

Wraz ze zmianą stanu i tym samym obiektu 

może zmienić się zachowanie obiektu (inne 

implementacje metod);

Eliminuje złożone instrukcje warunkowe (np. 

switch) w metodach obiektu;

Wada: powstaje wiele małych klas;

Zaleta: upraszcza program;

background image

Inżynieria Oprogramowania, wykład 5

72

Stan (state)

background image

Inżynieria Oprogramowania, wykład 5

73

Mediator

Mediatora stanowi „zarządcę obiektów”;

Wprowadza luźniejsze powiązania pomiędzy 

klasami – obiekty znają Mediatora a nie 

koniecznie inne obiekty;

Zmiany stanu obiektów są za jego 

pośrednictwem (odpowiednich metod) 

propagowane do zainteresowanych obiektów;

Często jest specjalizowany dla jednego 

projektu;

background image

Inżynieria Oprogramowania, wykład 5

74

Mediator

background image

Inżynieria Oprogramowania, wykład 5

75

Obserwator (Observer - Listener)

Ciągłe odpytywanie o stan obiektu prowadzi do 

znacznego spadku wydajności aplikacji;

Obserwator (Observer) przechowuje informację o 

stanie lub reaguje na zmianę stanu innych obiektów;

Luźne powiązanie z określonym obiektem;

Może być kilku obserwatorów jednego obiektu: relacja 

obiektów 1:N;

Wybrany obiekt powiadamia zainteresowanych o 

zmianie swojego stanu;

Przykłady użycia:

obsługa zdarzeń w okienkach,

synchronizacja modelu z widokiem;

background image

Inżynieria Oprogramowania, wykład 5

76

Obserwator (Observer - Listener)

Uczestnicy

Subject

•Posiada referencje do obiektów Observer;
•Interfejs operacji dołączania i odłączania obiektów Observer;

Observer

•Definiuje interfejs metody aktualizującej;

Concrete Subject

•Przechowuje stan interesujący konkretny obiekt Observator;
•wysyła powiadomienia obiektom Observer;

Concrete Observer

•przechowuje referencję do Concrete Subject;
•aktualizuje swój stan razem ze stanem obiektu Concrete 

Subject;

background image

Inżynieria Oprogramowania, wykład 5

77

Obserwator (Observer - Listener)

interface Observer {
  public void update( Oservable obs, Object arg );
}

Przykład 

implementacyjny

background image

Inżynieria Oprogramowania, wykład 5

78

Strategia (Strategy)

Potrzeba kilku wariantów algorytmu;

Wybór określonego wariantu poprzez powołanie 

obiektu pochodnego do zdefiniowanego interfejsu 

 bazowego lub klasy abstrakcyjnej;

Każda wersja algorytmu jest implementowana w 

osobnej klasie;

Zalety:

algorytm może używać danych, których klient nie zna;

hermetyzacja algorytmów w oddzielnych klasach 

pozwala na ich modyfikację niezależnie od kontekstu;

to rozwiązanie zastępuje instrukcje wyboru lub 

warunkowe;

background image

Inżynieria Oprogramowania, wykład 5

79

Strategia (Strategy)

Client

background image

Inżynieria Oprogramowania, wykład 5

80

Wzorce operacyjne (czynnościowe)

Podsumowanie:

Iterator – sekwencyjny dostęp do elementów 

kolekcji;

Łańcuch Odpowiedzialności – sposób przekazywania 

wywołań w łańcuchu obiektów; 

Stan – zmiana zachowania (metod) ze zmianą stanu;

Mediator – pośredniczy w komunikacji obiektów;

Obserwator – rejestrowanie i informowanie o 

zmianach;

Strategia – enkapsulacja algorytmu w klasie;

background image

Inżynieria Oprogramowania, wykład 5

81

Wzorce - podsumowanie

Zastosowanie w wybranych 

problemach

background image

Inżynieria Oprogramowania, wykład 5

82

Wzorce - podsumowanie

Konstruowanie obiektu poprzez jawne określenie klasy:

Fabryka abstrakcji, Metoda fabrykująca, Prototyp

Zależność od platformy programowo-sprzętowej:

Fabryka abstrakcji, Most

Zależność od reprezentacji lub implementacji obiektu:

Fabryka abstrakcji, Most, Memento, Pośrednik

Zależność od wersji algorytmu:

Budowniczy, Iterator, Strategia, Szablon metod, Wizytator

Zależność od określonych operacji:

Łańcuch odpowiedzialności

Rozszerzanie funkcjonalności (przez klasy potomne):

Most, Łańcuch odpowiedzialności, Kompozyt, Dekorator, Obserwator, 

Strategia

Brak możliwości lub niewygodna modyfikacja klasy:

Adapter, Dekorator, Wizytator

background image

Inżynieria Oprogramowania, wykład 5

83

Wzorce warstw - przykład

prezentacji

logiki

integracji

background image

Inżynieria Oprogramowania, wykład 5

84

Pojęcie wzorca


Document Outline