• Nie Znaleziono Wyników

kompozyt

N/A
N/A
Protected

Academic year: 2021

Share "kompozyt"

Copied!
20
0
0

Pełen tekst

(1)

Wzorce projektowe

Wzorce projektowe

Wybrane wzorce strukturalne: Kompozyt

Wybrane wzorce strukturalne: Kompozyt

Projektowanie i programowanie

Projektowanie i programowanie

obiektowe

obiektowe

Roman Simiński

roman.siminski@us.edu.pl

roman@siminskionline.pl

programowanie.siminskionline.pl

(2)

Kompozyt

Kompozyt

Composite Pattern

(3)

Kompozyt – koncepcja

Kompozyt – koncepcja

Obiekty graficzne proste

p2 k5 t1 p1 k4 k3 k1 k2 p3 w1

k1.rysuj();

k2.rysuj();

k3.rysuj();

k4.rysuj();

k5.rysuj();

p1.rysuj();

p2.rysuj();

p3.rysuj();

w1.rysuj();

p2.rysuj();

k1.rysuj();

k2.rysuj();

k3.rysuj();

k4.rysuj();

k5.rysuj();

p1.rysuj();

p2.rysuj();

p3.rysuj();

w1.rysuj();

p2.rysuj();

(4)

Kompozyt – koncepcja

Kompozyt – koncepcja

Obiekty graficzne proste

Obiekty graficzne złożone

p2 k5 t1 p1 k4 k3 k1 k2 p3 w1 okno dach ściany

ściany.rysuj();

dach.rysuj();

ściany.rysuj();

dach.rysuj();

(5)

Kompozyt – koncepcja

Kompozyt – koncepcja

Obiekty graficzne złożone

Obiekty graficzne złożone

okno

dach ściany

ściany.rysuj();

dach.rysuj();

okno.rysuj();

ściany.rysuj();

dach.rysuj();

okno.rysuj();

dom

dom.rysuj();

dom.rysuj();

(6)

Kompozyt

Kompozyt

Wzorzec Kompozyt pozwala nam na wykonywanie operacji na pewnym

obiekcie złożonym w taki sam sposób jak na obiekcie prostym.

Operując na obiekcie złożonym odnosimy wrażenie, że operujemy na obiekcie

prostym.

Obiekt złożony dzięki dziedziczeniu nabywa cech obiektu prostego, a dzięki

kompozycji staje się właścicielem podobiektów prostych.

(7)

Kompozyt, schemat UML

Kompozyt, schemat UML

ElementAbstrakcyjny

+operacja()

Kompozyt

+elementy: List<ElementAbstrakcyjny>

+dodaj( ElementAbstrakcyjny e )

+operacja()

Element

+operacja()

operacja()

{

foreach e in elementy

e.operacja();

}

(8)

Kompozyt, schemat UML, przykład

Kompozyt, schemat UML, przykład

ElementRysunku

+rysuj()

Kompozyt

+elementy: List<ElementRysunku>

+dodaj( ElementRysunku e )

+rysuj()

Kwadrat

+rysuj()

rysuj()

{

foreach e in elementy

e.rysuj();

Trójkąt

+rysuj()

Prostokąt

+rysuj()

(9)

Przykładowa implementacja

Przykładowa implementacja

kompozytu

kompozytu

w języku Java

w języku Java

(10)

Element abstrakcyjny lub podstawowy interfejs, klasa elementu

Element abstrakcyjny lub podstawowy interfejs, klasa elementu

abstract class JednostkaWzorcowa

{

public JednostkaWzorcowa( String nazwa, String typ ) {

this.nazwa = nazwa;

this.typ = typ;

}

public abstract void wypiszInfo();

protected String nazwa;

protected String typ;

}

class JednostkaPodstawowa extends JednostkaWzorcowa

{

public JednostkaPodstawowa( String nazwa, String typ ) {

super( nazwa, typ );

}

@Override

public void wypiszInfo() {

System.out.println( typ + ": " + nazwa );

}

}

abstract class

JednostkaWzorcowa

{

public

JednostkaWzorcowa

( String nazwa, String typ ) {

this.nazwa = nazwa;

this.typ = typ;

}

public abstract void wypiszInfo();

protected String nazwa;

protected String typ;

}

class

JednostkaPodstawowa

extends

JednostkaWzorcowa

{

public

JednostkaPodstawowa

( String nazwa, String typ ) {

super( nazwa, typ );

}

@Override

public void wypiszInfo() {

System.out.println( typ + ": " + nazwa );

}

(11)

Klasa kompozytu

Klasa kompozytu

class JednostkaOrganizacyjna extends JednostkaWzorcowa

{

public JednostkaOrganizacyjna( String nazwa, String typ )

{

super( nazwa, typ );

}

public void dodaj( JednostkaWzorcowa j )

{

skladowe.add( j );

}

protected ArrayList<JednostkaWzorcowa> skladowe = new ArrayList();

@Override

public void wypiszInfo()

{

System.out.println( typ + ": " + nazwa + ", zawiera: ");

for( JednostkaWzorcowa j : skladowe )

j.wypiszInfo();

}

}

class

JednostkaOrganizacyjna

extends

JednostkaWzorcowa

{

public JednostkaOrganizacyjna( String nazwa, String typ )

{

super( nazwa, typ );

}

public void dodaj( JednostkaWzorcowa j )

{

skladowe

.add( j );

}

protected ArrayList<

JednostkaWzorcowa

>

skladowe

= new ArrayList();

@Override

public void wypiszInfo()

{

System.out.println( typ + ": " + nazwa + ", zawiera: ");

for( JednostkaWzorcowa j :

skladowe

)

j.wypiszInfo();

}

(12)

Wykorzystanie

Wykorzystanie

// Otworzenie kompozytu miasta

JednostkaOrganizacyjna kato = new JednostkaOrganizacyjna( "Katowice", "miasto" ); // Dodanie dzielnic-elementów do miasta

kato.dodaj( new JednostkaPodstawowa( "Szopienice", "dzielnica" ) ); kato.dodaj( new JednostkaPodstawowa( "Bogucice", "dzielnica" ) ); // Otworzenie kompozytu miasta

JednostkaOrganizacyjna sosno = new JednostkaOrganizacyjna("Sosnowiec", "miasto"); // Dodanie dzielnic-elementów do miasta

sosno.dodaj( new JednostkaPodstawowa( "Pogoń", "dzielnica" ) ); sosno.dodaj( new JednostkaPodstawowa( "Niwka", "dzielnica" ) ); // Otworzenie kompozytu województwo

JednostkaOrganizacyjna slaskie = new JednostkaOrganizacyjna("Śląskie", "województwo" ); // Dodanie miast-kompozytów do kompozytu województwa

slaskie.dodaj( kato ); slaskie.dodaj( sosno );

// Aktywowanie usługi jednakowej dla wszystkich elementów i kompozytów slaskie.wypiszInfo();

// Otworzenie kompozytu miasta

JednostkaOrganizacyjna kato = new JednostkaOrganizacyjna( "Katowice", "miasto" );

// Dodanie dzielnic-elementów do miasta

kato.dodaj( new JednostkaPodstawowa( "Szopienice", "dzielnica" ) ); kato.dodaj( new JednostkaPodstawowa( "Bogucice", "dzielnica" ) );

// Otworzenie kompozytu miasta

JednostkaOrganizacyjna sosno = new JednostkaOrganizacyjna("Sosnowiec", "miasto");

// Dodanie dzielnic-elementów do miasta

sosno.dodaj( new JednostkaPodstawowa( "Pogoń", "dzielnica" ) ); sosno.dodaj( new JednostkaPodstawowa( "Niwka", "dzielnica" ) );

// Otworzenie kompozytu województwo

JednostkaOrganizacyjna slaskie = new JednostkaOrganizacyjna("Śląskie", "województwo" );

// Dodanie miast-kompozytów do kompozytu województwa

slaskie.dodaj( kato ); slaskie.dodaj( sosno );

// Aktywowanie usługi jednakowej dla wszystkich elementów i kompozytów

(13)

Wykorzystanie, rezultat

Wykorzystanie, rezultat

// Otworzenie kompozytu miasta

JednostkaOrganizacyjna kato = new JednostkaOrganizacyjna( "Katowice", "miasto" ); // Dodanie dzielnic-elementów do miasta

kato.dodaj( new JednostkaPodstawowa( "Szopienice", "dzielnica" ) ); kato.dodaj( new JednostkaPodstawowa( "Bogucice", "dzielnica" ) ); // Otworzenie kompozytu miasta

JednostkaOrganizacyjna sosno = new JednostkaOrganizacyjna("Sosnowiec", "miasto"); // Dodanie dzielnic-elementów do miasta

sosno.dodaj( new JednostkaPodstawowa( "Pogoń", "dzielnica" ) ); sosno.dodaj( new JednostkaPodstawowa( "Niwka", "dzielnica" ) ); // Otworzenie kompozytu województwo

JednostkaOrganizacyjna slaskie = new JednostkaOrganizacyjna("Śląskie", "województwo" ); // Dodanie miast-kompozytów do kompozytu województwa

slaskie.dodaj( kato ); slaskie.dodaj( sosno );

// Aktywowanie usługi jednakowej dla wszystkich elementów i kompozytów slaskie.wypiszInfo();

// Otworzenie kompozytu miasta

JednostkaOrganizacyjna kato = new JednostkaOrganizacyjna( "Katowice", "miasto" );

// Dodanie dzielnic-elementów do miasta

kato.dodaj( new JednostkaPodstawowa( "Szopienice", "dzielnica" ) ); kato.dodaj( new JednostkaPodstawowa( "Bogucice", "dzielnica" ) );

// Otworzenie kompozytu miasta

JednostkaOrganizacyjna sosno = new JednostkaOrganizacyjna("Sosnowiec", "miasto");

// Dodanie dzielnic-elementów do miasta

sosno.dodaj( new JednostkaPodstawowa( "Pogoń", "dzielnica" ) ); sosno.dodaj( new JednostkaPodstawowa( "Niwka", "dzielnica" ) );

// Otworzenie kompozytu województwo

JednostkaOrganizacyjna slaskie = new JednostkaOrganizacyjna("Śląskie", "województwo" );

// Dodanie miast-kompozytów do kompozytu województwa

slaskie.dodaj( kato ); slaskie.dodaj( sosno );

// Aktywowanie usługi jednakowej dla wszystkich elementów i kompozytów

slaskie.wypiszInfo();

województwo: Śląskie, zawiera:

miasto: Katowice, zawiera:

dzielnica: Szopienice

dzielnica: Bogucice

miasto: Sosnowiec, zawiera:

dzielnica: Pogoń

(14)

Wzorzec kompozyt tworzy drzewo

Wzorzec kompozyt tworzy drzewo

Śląskie

Katowice

Sosnowiec

Szopienice

Bogucice

Niwka

Pogoń

(15)

Kompozyt w literaturze i źródłach internetowych

Kompozyt w literaturze i źródłach internetowych

Client – operuje na danych zawartych we wzorcu.

Component – klasa abstrakcyjna albo interfejs który określa pożądane

zachowania.

Leaf – klasa obiektu terminalnego, taki obiekt nie ma potomków (obiektów

składowych). Dziedziczy z klasy Component lub implementujące interfejs

Component.

Composite – klasa obiektu kompozytu, grupuje obiekty dziedziczące z klasy

(16)

Kompozyt w literaturze i źródłach internetowych

(17)

Kompozyt w literaturze i źródłach internetowych

Kompozyt w literaturze i źródłach internetowych

(18)

Klasa kompozytu, remanent w przykładzie

Klasa kompozytu, remanent w przykładzie

class JednostkaOrganizacyjna extends JednostkaWzorcowa

{

public JednostkaOrganizacyjna( String nazwa, String typ )

{

super( nazwa, typ );

}

public void dodaj( JednostkaWzorcowa j )

{

skladowe.add( j );

}

protected ArrayList<JednostkaWzorcowa> skladowe = new ArrayList();

@Override

public void wypiszInfo()

{

System.out.println( typ + ": " + nazwa + ", zawiera: ");

for( JednostkaWzorcowa j : skladowe )

j.wypiszInfo();

}

. . .

class

JednostkaOrganizacyjna

extends

JednostkaWzorcowa

{

public JednostkaOrganizacyjna( String nazwa, String typ )

{

super( nazwa, typ );

}

public void dodaj( JednostkaWzorcowa j )

{

skladowe

.add( j );

}

protected ArrayList<

JednostkaWzorcowa

>

skladowe

= new ArrayList();

@Override

public void wypiszInfo()

{

System.out.println( typ + ": " + nazwa + ", zawiera: ");

for( JednostkaWzorcowa j :

skladowe

)

j.wypiszInfo();

}

. . .

(19)

Klasa kompozytu

Klasa kompozytu

. . .

public void usun( JednostkaWzorcowa j )

{

skladowe.remove( j );

}

public void wyczysc()

{

skladowe.clear();

}

public ArrayList<JednostkaWzorcowa> podajSkladowe()

{

return skladowe;

}

}

. . .

public void usun( JednostkaWzorcowa j )

{

skladowe

.remove( j );

}

public void wyczysc()

{

skladowe

.clear();

}

public ArrayList<JednostkaWzorcowa> podajSkladowe()

{

return

skladowe

;

}

(20)

Czy komponent ma być pojemnikiem?

Czy komponent ma być pojemnikiem?

https://www.javaworld.com/article/2074564/learn-java/a-look-at-the-composite-design-pattern.html

Ciekawy artykuł:

Cytaty

Powiązane dokumenty

Jednak dopiero w 2002 roku udało się zidentyfikować receptory smakowe odpowiedzialne za jego odczuwanie i umami oficjalnie dołączył do grona smaków podstawowych.. Z

[r]

[r]

[r]

BEHAVIOR=SCROLL powoduje, że tekst porusza się od jednego brzegu strony w kierunku drugiego, znika za nim i wypływa ponownie zza pierwszego brzegu. BEHAVIOR=SLIDE powoduje, że

Mechanizmy reakcji organicznych 2007 Wydawnictwo

Taki mały, taki chudy, nie miał domu ani budy, Więc go wzięłam, przygarnęłam, no i jest... Razem ze mną kundel bury penetruje

Dla chętnych- można przesłać nagrany filmik z ćwiczeń domowych, albo