Decorator (dekorator)

Podobne dokumenty
Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Programowanie obiektowe

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Programowanie w języku Java WYKŁAD

Zaawansowane programowanie w C++ (PCP)

Prototype (prototyp) Cel: Przykład: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp.

(wybrane) Wzorce projektowe. Programowanie Obiektowe Mateusz Cicheński

Builder (budowniczy) Cel: Przykład:

(wybrane) Wzorce projektowe. Programowanie Obiektowe Mateusz Cicheński

Programowanie obiektowe i zdarzeniowe

Dokumentacja do API Javy.

Projektowanie obiektowe Wzorce projektowe. Gang of Four Wzorce rozszerzeń

Java: interfejsy i klasy wewnętrzne

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Projektowanie obiektowe oprogramowania Wykład 5 wzorce strukturalne Wiktor Zychla 2016

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Aplikacje w środowisku Java

Kurs WWW. Paweł Rajba.

Abstract Factory (fabryka abstrakcyjna)

Polimorfizm. dr Jarosław Skaruz

Wzorce projektowe. dr inż. Marcin Pietroo

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Programowanie obiektowe

JAVA. Strumienie wejścia i wyjścia. Pliki - zapis i odczyt

Template method (metoda szablonowa)

PHP 5 język obiektowy

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Strumienie i serializacja

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Enkapsulacja, dziedziczenie, polimorfizm

MAS dr. Inż. Mariusz Trzaska. Realizacja różnych modeli dziedziczenia w obiektowych językach programowania

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017

Wykład 7: Pakiety i Interfejsy

Klasy abstrakcyjne, interfejsy i polimorfizm

Testowanie oprogramowania Wzorce projektowe

Problemy projektowania obiektowego. Czy podobne problemy można rozwiązywac w podobny sposób?

Programowanie obiektowe

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Klasy abstrakcyjne i interfejsy

Programowanie obiektowe

1 Klasa File. 2 Writer. Programowanie w j zyku Java - Adam Krechowicz. Klasa File zapewnia podstawowe operacje na plikach

Podstawy programowania obiektowego

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Technologia Programowania 2016/2017 Wykład 4

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

WSNHiD, Programowanie 2, Lab. 3. Trwałość danych

Aplikacje RMI Lab4

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Wywoływanie metod zdalnych

Programowanie obiektowe

Aplikacje RMI. Budowa aplikacji rozproszonych. Część 2.

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Programowanie obiektowe

Współbieżność w środowisku Java

Technologia Programowania 2016/2017 Wykład 5

Programowanie obiektowe

Wypożyczalnia VIDEO. Technologie obiektowe

Remote Method Invocation 17 listopada 2010

UML a kod. C++, Java i C#

Programowanie obiektowe i zdarzeniowe

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Podejście obiektowe do budowy systemów rozproszonych

Podstawy programowania III

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.

Projektowanie oprogramowania: wzorce architektoniczne i projektowe

Command (action, transaction, polecenie)

Programowanie obiektowe

Wywoływanie metod zdalnych

Programowanie obiektowe

Aplikacje RMI

problem w określonym kontekście siły istotę jego rozwiązania

Programowane refleksyjne i serializacja

1) Wzorzec projektowy Adapter. Zastosowanie:

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

Dziedziczenie. Tomasz Borzyszkowski

Programowanie obiektowe

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Wzorce projektowe. Wstęp

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Tworzenie i wykorzystanie usług sieciowych

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

KLASY, INTERFEJSY, ITP

Technologie i usługi internetowe cz. 2

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Platformy Programistyczne Wykład z Javy dla zaawansowanych

Programowanie 2. Język C++. Wykład 3.

Diagramy klas. dr Jarosław Skaruz

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

1 Atrybuty i metody klasowe


Programowanie obiektowe

Programowanie obiektowe

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

STRUMIENIE DANYCH, SERIALIZACJA OBIEKTÓW

Transkrypt:

1/10 Decorator (dekorator) Cel: Dołącza dynamicznie nową funkcjonalność do obiektu elastyczna alternatywa dziedziczenia. Przykład: interface iplik { void zapisz(string tekst); String odczytaj(); class Plik implements iplik { public void zapisz(string tekst) { public String odczytaj() { return

class PlikSzyfrowany extends Plik { public void zapisz(string tekst) { public String odczytaj() { class PlikSkompresowany extends Plik { public void zapisz(string tekst) { public String odczytaj() { class PlikSzyfrowanySkompresowany extends Plik { public void zapisz(string tekst) { public String odczytaj() { Zastosowanie: Aby dynamicznie dodać funkcjonalność pojedynczym obiektom, w sposób przeźroczysty, czyli bez wpływania na inne obiekty; aby móc później tę funkcjonalność usunąć; gdy dziedziczenie jest niepraktyczne, np. dostępne jest wiele niezależnych rozszerzeń, próba zapisania wszystkich ich kombinacji stworzyłaby ogromną liczbę klas (lub, z różnych powodów, nie możemy dziedziczyć z danej klasy). 2/10

Struktura: Składniki: Component definiuje interfejs obiektów, które mają być dekorowane. ConcreteComponent - obiekt, który będzie dekorowany. Decorator zawiera referencję do Componentu i ma interfejs zgodny z Componentem. ConcreteDecorator dodaje funkcjonalność do swego komponentu. 3/10

4/10 Zależności: Dekorator odsyła żądanie do swego Komponentu, swoje dodatkowe operacje wykonując przed lub po odesłaniu.

5/10 interface iplik { void zapisz(string tekst); String odczytaj(); class Plik implements iplik { public void zapisz(string tekst) { public String odczytaj() { abstract class Dekorator implements iplik { protected iplik komp; public Dekorator(iPlik komponent) { this.komp = komponent; public void zapisz(string tekst) { komp.zapisz(tekst); public String odczytaj() { return komp.odczytaj();

6/10 class DekoratorSzyfrowanie extends Dekorator { public DekoratorSzyfrowanie(iPlik komponent) { super(komponent); public void zapisz(string tekst) { super.zapisz(szyfruj(tekst)); public String odczytaj() { return odszyfruj(super.odczytaj()); public String szyfruj(string tekst) { public String odszyfruj(string tekst) { class DekoratorKompresja extends Dekorator { public DekoratorKompresja(iPlik komponent) { super(komponent); public void zapisz(string tekst) { public String odczytaj() {

7/10 // Client: iplik plik = new DekoratorKompresja( new DekratorSzyfrowanie( new Plik("./dane.txt"))); plik.zapisz("ala ma kota"); plik.zamknij(); Konsekwencje: 1. Rozwiązanie bardziej elastyczne, niż dziedziczenie. Można dodawać i usuwać funkcjonalność dynamicznie (a także dowolnie łączyć funkcjonalności), bez tworzenia nowych klas. 2. Nie musimy projektować dużej, konfigurowalnej klasy, tylko małą, prostą, do której opcje zostaną dodane później. Definiowanie nowej funkcjonalności jest proste klasy dekoratorów są niezależne od siebie i każdy odpowiada tylko za jedną funkcjonalność. Możliwe jest również dekorowanie klas potomnych. 3. Skutkuje systemem złożonym z dużej liczby drobnych, podobnych obiektów (różniących się nie stanem, a sposobem połączenia). Może być to trudne w utrzymaniu.

8/10 Implementacja: 1. Interfejs dekoratora musi pasować do interfejsu komponentów, które ma dekorować. abstract class Dekorator implements iplik { protected iplik komp; public Dekorator(iPlik komponent) { this.komp = komponent; 2. Bez abstrakcyjnej klasy dekoratora np. gdy mamy dodać tylko jedną funkcjonalność. Tak przeważnie będzie, gdy dodajemy coś do już istniejącej hierarchii. 3. Klasa Komponent powinna być lekka, gdyż dziedziczą z niej wszystkie dekoratory. Powinna zatem jedynie definiować interfejs, a nie przechowywać dane. interface iplik { void zapisz(string tekst); String odczytaj();

9/10 4. Dekorator jest niewidoczny dla Komponentu (nie wie, w jaki sposób jest udekorowany). 5. Dostęp do udekorowanego obiektu przez interfejs Component, ale możliwe jest też rozszerzenie interfejsu, np. w IO Javy dekoratory dodają własne metody. abstract class OutputStream { public void write(byte[] b) { class FileOutputStream extends OutputStream { public FileOutputStream(File file) { class ObjectOutputStream extends OutputStream { public void writeobject(object obj) { public void writeintt(int val) {

10/10 // Client: ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream("plik.tmp")); oos.writeint(12345); oos.writeobject("today"); oos.writeobject(new Date()); oos.close(); Powiązania: Dekorator zmienia działanie obiektu, natomiast Adapter interfejs. Proxy z kolei zmienia sposób dostępu do obiektu. Composite Dekorator może być traktowany jako zubożony Kompozyt (tylko jeden komponent), ale podstawowym celem Dekoratora nie jest agregacja, a dodanie funkcjonalności. Dekorator to niejako powłoka obiektu, która zmienia jego zachowanie, alternatywą jest zmiana jądra wzorce Bridge, czy Strategy będą lepsze, gdy komponent jest być ciężki. Udekorowany obiekt może być posłużyć jako Prototyp.