Metodyka projektowania obiektowego
|
|
- Paweł Drozd
- 8 lat temu
- Przeglądów:
Transkrypt
1 Metodyka projektowania obiektowego Zajęcia 4 Wzorce projektowe PW
2 Treść Wprowadzenie: historia, motywacja Katalog wzorców na podstawie klasycznej pozycji Design Patterns, Elements of Reusable OO Software Wzorce kreacyjne Wzorce strukturalne Wzorce behawioralne Podobieństwa wzorców Podsumowanie i wnioski Ćwiczenia 2
3 Motywacja Powtórne wykorzystanie sprawdzonych rozwiązań? Oczywiście! Przecież: Typowe problemy można rozwiązywać w powtarzalny sposób. Sposoby rozwiązania można przedstawić na tyle abstrakcyjnie, aby były możliwe do wykorzystania w różnych kontekstach. Znajomość katalogu typowych rozwiązań powinna przyspieszyć rozwiązanie konkretnego problemu, a wynik będzie do pewnego stopnia sprawdzony. Motto: dobre projekty mają pewne cechy wspólne. 3
4 Wzorce w programowaniu Wzorce w inżynierii oprogramowania: wzorce implementacyjne poziom języka programowania algorytmy sposoby rozwiązywania problemów obliczeniowych wzorce projektowe interakcja między klasami wzorce architektoniczne sposób integracji komponentów wzorce analityczne poziom opisu rzeczywistości katalog przypadków użycia poziom modelowania 4
5 Dawno, dawno temu... Egipcjanie, Hindusi, Tybetańczycy, Chińczycy, Grecy, Rzymianie,... 5
6 Historia: 1977 Wzorzec opisuje problem, który powtarza się wielokrotnie w danym środowisku, oraz podaje istotę jego rozwiązania w taki sposób, aby można było je zastosować miliony razy bez potrzeby powtarzania tej samej pracy Christopher Alexander A pattern language Wzorzec projektowy = zestaw sprawdzonych koncepcji architektonicznych służących konstruowaniu środowiska mieszkalnego i środowiska pracy zarówno dla jednostek jak i dla społeczności. 6
7 Historia: 1987,,Alexander zaproponował, aby domy i biura projektowali ich przyszli użytkownicy. Uważa on, ze ci ludzie najlepiej wiedzą, czego oczekują od określonej budowli. Zgadzamy się z tym i uważamy, że dotyczy to również programów komputerowych. Użytkownicy powinni sami pisać programy dla siebie.",,język wzorców prowadzi projektanta, dostarczając mu działających rozwiązań wszystkich problemów, które mogą powstać w trakcie projektowania. JW to sekwencja fragmentów wiedzy zapisanych w określonym stylu i uporządkowana tak, że naprowadza projektanta na właściwe pytania i odpowiedzi we właściwym czasie." Kent Beck, Ward Cunningham,,Using Pattern Languages for Object-Oriented Programs" 7
8 Historia, 1994 Wzorzec projektowy identyfikuje i opisuje pewną abstrakcję, której poziom znajduje się powyżej poziomu abstrakcji pojedynczej klasy, instancji lub komponentu. E. Gamma, R. Helm, R. Johnson, J. Vlissides Ponad 30 wznowień w ciągu 10 lat! 8
9 Wzorce projektowe Wzorce dostarczają gotowych rozwiązań, przez co przyspieszają proces produkcji oprogramowania. Wzorce projektowe stanowią abstrakcyjny opis zależności pomiędzy klasami. Ich wykorzystanie prowadzi do pewnej standaryzacji kodu. Standardowy kod jest pewniejszy, efektywniejszy i łatwiej go zrozumieć. Przez swą ogólność wzorce mogą też zwrócić uwagę na słabości projektu i dostarczyć gotowych rozwiązań problemów, które mogą nie być oczywiste we wczesnym jego stadium (rozszerzanie funkcjonalności, zmiana skali, itp.) Opis wzorców jest też szkołą dobrego programowania. 9
10 Treść Wprowadzenie: historia, motywacja Katalog wzorców na podstawie klasycznej pozycji Design Patterns, Elements of Reusable OO Software Wzorce kreacyjne Wzorce strukturalne Wzorce behawioralne Podobieństwa wzorców Podsumowanie i wnioski Ćwiczenia 10
11 Standardowy opis WP (1) Zaproponowany w DP opis WP zawiera rozdziały: Nazwa wzorca projektowego oraz Klasyfikacja Każdy wzorzec powinien posiadać opisową oraz unikalną nazwę, która pomaga w jego rozpoznaniu oraz odwoływaniu się do niego. Wzorzec powinien zostać zakwalifikowany zgodnie z pewnym schematem, np. takim, jak ten zaproponowany w DP. Klasyfikacja ułatwia stosowanie wzorca. Intencja Opis celu, który stoi za wzorcem oraz powody jakimi się należy kierować podczas jego wyboru. Inne nazwy wzorca Wzorzec może mieć więcej niż jedną nazwę, co powinno zostać udokumentowane. 11
12 Standardowy opis WP (2) Motywacja Scenariusz zawierający problem powiązany z kontekstem, w który wzorzec może być stosowany. Stosowalność Przedstawienie sytuacji, w której wzorzec jest użyteczny reprezentujące jego część związaną z kontekstem. Struktura Graficzna reprezentacja wzorca: zwykle jako schematy UML dotyczące klas oraz interakcji między nimi. Elementy Lista klas i obiektów stosowanych w tym wzorcu oraz opis ich znaczenia. 12
13 Standardowy opis WP (3) Powiązania Opis wzajemnej interakcji klas i obiektów wykorzystywanych we wzorcu. Konsekwencje Przedstawienie korzyści, skutków ubocznych oraz innych kosztów, które powoduje zastosowanie wzorca. Implementacja Prezentacja implementacji wzorca w wybranym języku. Przedstawienie technik stosowanych podczas praktycznego wykorzystania wzorca, sugestia najlepszej drogi do udanej implementacji. 13
14 Standardowy opis WP (4) Przykładowy kod Ilustracja jak wzorzec może zostać zastosowany w jednym z języków programowania. Przykłady zastosowania Znane przykłady zastosowania wzorca w rzeczywistych programach. Związane wzorce Odniesienie wzorca do innych, z którymi się wiąże przez wspólne stosowanie, lub wymienną stosowalność oraz przedstawienie różnic w stosunku do podobnych wzorców. 14
15 Systematyka (DP, 1994) Wzorce kreacyjne abstrakcyjne metody tworzenia obiektów uniezależnienie systemu od sposobu tworzenia obiektów Wzorce strukturalne sposób wiązania obiektów w struktury właściwe wykorzystanie dziedziczenia i kompozycji Wzorce behawioralne algorytmy i przydział odpowiedzialności opis przepływu kontroli i interakcji 15
16 Katalog wzorców projektowych W DP opisano 23 wzorce: 5 kreacyjnych: Abstract Factory, Builder, Factory Method, Prototype, Singleton 7 strukturalnych: Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy 11 behawioralnych: Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template Method, Visitor Katalogi wzorców (np. Portland Pattern Repository są ciągle uzupełniane. Przykład: AbstractFactoryPattern 16
17 Treść Wprowadzenie: historia, motywacja Katalog wzorców na podstawie klasycznej pozycji Design Patterns, Elements of Reusable OO Software Wzorce kreacyjne Wzorce strukturalne Wzorce behawioralne Podobieństwa wzorców Podsumowanie i wnioski Ćwiczenia 17
18 Wzorce kreacyjne Abstract Factory (fabryka abstrakcyjna) sposób enkapsulacji grupy fabryk wytwarzających podobne obiekty. Zwykle interfejs implementowany przez konkretne fabryki. Klient nie troszczy się o konkretny rodzaj obiektu, bo używa interfejsów do komunikacji z produktami. (Co zrobić?) Builder (budowniczy) zawiera algorytm tworzenia skomplikowanych obiektów tak, aby klient mógł po prostu zażądać określonego obiektu. Builder jest interfejsem i jednocześnie oddziela proces tworzenia obiektu od jego reprezentacji, aby można było tworzyć podobne obiekty według określonego wzoru. (Jak to zrobić?) Factory Method (metoda wytwórcza) sposób delegacji tworzenia obiektu do podklas tak, aby to one mogły decydować, co dokładnie jest tworzone. Prototype (prototyp) metoda tworzenia obiektów przez klonowanie pewnego obiektu prototypowego. Singleton metoda zapewnienia istnienia pojedynczej instancji danej klasy. 18
19 Singleton: Nazwa: Singleton Cel: zapewnienie, że wewnątrz danej aplikacji istnieje dokładnie jedna instancja tej klasy. Utworzenie tej instancji i umożliwienie dostępu do niej. Motywacja i stosowalność: czasem potrzebna jest wyłącznie jedna instancja obiektu, którą wywołuje wiele różnych części aplikacji. W takich przypadkach tworzenie obiektu, a następnie niszczenie go (lub pozostawianie do zniszczenia przez gc) jest marnotrawstwem zasobów. 19
20 Singleton: struktura, uczestnicy, powiązania Singleton jest odpowiedzialny za tworzenie instancji własnej klasy ogranicza dostęp do konstruktora do własnej klasy i podklas (prywatny lub chroniony konstruktor) definiuje statyczną metodę getinstance() udostępniającą instancję klasy 20
21 Singleton: implementacje: C++ class singleton { private: singleton() { singleton(const singleton &); singleton& operator=(const singleton&); public: string method() { return "sample method"; ~singleton() { static singleton& getinstance() { static singleton instance; return instance; ; 21
22 Singleton: implementacje: Java public final class Singleton { private final static Singleton singleinstance = new Singleton(); public static Singleton getinstance() { return singleinstance; private Singleton() { public final class Singleton { public final static Singleton singleinstance = new Singleton(); private Singleton() { 22
23 Singleton: implementacje: Java public class Singleton { private static class Instance { static final Singleton instance = new Singleton(); private Singleton() { public static Singleton getinstance() { return Instance.instance; 23
24 Singleton: konsekwencje Singleton przejmuje odpowiedzialność za tworzenie instancji własnej klasy Klient nie zarządza instancją klasy; otrzymuje ją na żądanie Singleton może zarządzać także swoimi podklasami Singleton można łatwo rozszerzyć do puli obiektów Singleton zachowuje się podobnie do zmiennej globalnej (antywzorzec!) może powodować zwiększenie liczby powiązań w systemie 24
25 Abstract Factory: Nazwa: Abstract Factory Cel: hermetyzacja tworzenia obiektów. Motywacja i stosowalność: tworzenie rodzin powiązanych lub zależnych obiektów, udostępnianie biblioteki klas poprzez interfejs, odseparowanie sposobu tworzenia obiektów od sposobu ich używania, ukrywanie specyficznych dla danej platformy szczegółów, zwiększenie rozszerzalności 25
26 Abstract Factory: struktura 26 wikimedia.org
27 Abstract Factory: uczestnicy Abstract Factory: definicja interfejsu do tworzenia obiektów implementujących Abstract Product Abstract Poduct: definicja interfejsu, który muszą implementować obiekty tworzone przez fabryki Concrete Factory: implementacja Abstract Factory dostarczająca własnych metod do tworzenia obiektów implementujących interfejsy Abstract Product ConcreteProduct: konkretna implementacja Abstract Product 27
28 Abstract Factory: przykład (1) 28 apwebco.com
29 Abstract Factory: przykład (2) // Factories // Abstract: public interface FinancialToolsFactory { public TaxProcessor createtaxprocessor(); public ShipFeeProcessor createshipfeeprocessor(); 29 apwebco.com
30 Abstract Factory: przykład (3) // Concrete 1 public class CanadaFinancialToolsFactory implements FinancialToolsFactory { public TaxProcessor createtaxprocessor() { return new CanadaTaxProcessor(); public ShipFeeProcessor createshipfeeprocessor() { return new CanadaShipFeeProcessor(); 30 apwebco.com
31 Abstract Factory: przykład (4) // Concrete 2 public class EuropeFinancialToolsFactory implements FinancialToolsFactory { public TaxProcessor createtaxprocessor() { return new EuropeTaxProcessor(); public ShipFeeProcessor createshipfeeprocessor() { return new EuropeShipFeeProcessor(); 31 apwebco.com
32 Abstract Factory: przykład (5) // Products public interface ShipFeeProcessor { void calculateshipfee(order order); public interfacetaxprocessor { void calculatetaxes(order order); 32 apwebco.com
33 Abstract Factory: przykład (6) // Products: Concrete public class EuropeShipFeeProcessor implements ShipFeeProcessor { public void calculateshipfee(order order) { // insert here Europe specific ship fee calculation public class CanadaShipFeeProcessor implements ShipFeeProcessor { public void calculateshipfee(order order) { // insert here Canada specific ship fee calculation 33 apwebco.com
34 Abstract Factory: przykład (7) // Products: Concrete public class EuropeTaxProcessor implements TaxProcessor { public void calculatetaxes(order order) { // insert here Europe specific taxt calculation public class CanadaTaxProcessor implements TaxProcessor { public void calculatetaxes(order order) { // insert here Canada specific taxt calculation 34 apwebco.com
35 Abstract Factory: przykład (8) // Client... Customer customer = new Customer(); Order order = new Order(); OrderProcessor orderprocessor = null; FinancialToolsFactory Factory = null; if (countrycode == "EU") { Factory = new EuropeFinancialToolsFactory(); else if (countrycode == "CA") { Factory = new CanadaFinancialToolsFactory(); orderprocessor = new OrderProcessor(Factory); orderprocessor.processorder(order); apwebco.com
36 Abstract Factory: konsekwencje Elastyczna konfiguracja rodzaju tworzonych obiektów Uniezależnienie klienta od sposobu tworzenia obiektów Uniezależnienie klienta od konkretnej implementacji obiektów Utrudnienie dodawania kolejnych typów produktów (gdyż wymaga poprawiania wszystkich fabryk) 36
37 Builder: Nazwa: Builder Cel: odseparowanie procesu konstrukcji złożonych obiektów od ich reprezentacji: ten sam proces konstrukcji może tworzyć różne reprezentacje. Motywacja i stosowalność: tworzenie obiektów przez określanie ich typu i zawartości, odseparowanie procesu tworzenia złożonego obiektu od szczegółów tworzenia skłdowych, oddzielenie kodu tworzącego od reprezentacji 37
38 Builder: struktura 38 wikimedia.org
39 Builder: uczestnicy Poduct: typ tworzonych obiektów Builder: definicja interfejsu do tworzenia obiektów implementujących Product Director: zna algorytm realizacji struktury, wykorzystuje obiekty Builder do konstrukcji części i składa te części w całość Concrete Builder: implementacja Abstract Builder dostarczająca własnych metod do tworzenia obiektów Product 39
40 Builder: przykład (1) // Product class Pizza { private String dough = ""; private String sauce = ""; private String topping = ""; public void setdough (String dough) { this.dough = dough; public void setsauce (String sauce) { this.sauce = sauce; public void settopping (String topping) { this.topping = topping; public String tostring() { return dough + "+" + topping + "+" + sauce; 40 wikipedia.org
41 Builder: przykład (2) // Abstract Builder abstract class PizzaBuilder { protected Pizza pizza; Składniki algorytmu public Pizza getpizza() { return pizza; public void createnewpizzaproduct() { pizza = new Pizza(); public abstract void builddough(); public abstract void buildsauce(); public abstract void buildtopping(); 41 wikipedia.org
42 Builder: przykład (3) // Director class Waiter { private PizzaBuilder pizzabuilder; Algorytm public void setpizzabuilder (PizzaBuilder pb) { pizzabuilder = pb; public Pizza getpizza() { return pizzabuilder.getpizza(); public void constructpizza() { pizzabuilder.createnewpizzaproduct(); pizzabuilder.builddough(); pizzabuilder.buildsauce(); pizzabuilder.buildtopping(); 42 wikipedia.org
43 Builder: przykład (4) // Client class BuilderDemo { public static void main(string[] args) { Waiter waiter = new Waiter(); PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder(); PizzaBuilder spicy_pizzabuilder = new SpicyPizzaBuilder(); waiter.setpizzabuilder ( hawaiian_pizzabuilder ); //waiter.setpizzabuilder ( spicy_pizzabuilder ); waiter.constructpizza(); Pizza pizza = waiter.getpizza(); System.out.println( pizza ); 43 wikipedia.org
44 Builder: przykład (5) // ConcreteBuilder1 class HawaiianPizzaBuilder extends PizzaBuilder { public void builddough() { pizza.setdough("cross"); public void buildsauce() { pizza.setsauce("mild"); public void buildtopping() { pizza.settopping("ham+pineapple"); // ConcreteBuilder2 class SpicyPizzaBuilder extends PizzaBuilder { public void builddough() { pizza.setdough("pan baked"); public void buildsauce() { pizza.setsauce("hot"); public void buildtopping() { pizza.settopping("pepperoni+salami"); 44 wikipedia.org
45 Builder: konsekwencje Elastyczna konfiguracja rodzaju tworzonych obiektów Uniezależnienie klienta od sposobu tworzenia obiektów Uniezależnienie klienta od konkretnej implementacji obiektów 45
46 Builder a AbstractFactory Builder zawiera logikę tworzenia obiektu: opisuje, w jaki sposób tworzymy obiekt, ale chodzi o konkretny obiekt AbstractFactory odwleka decyzję o typie tworzonego obiektu do momentu wykonania, specyfikowany jest tylko interfejs tworzonego obiektu Builder: jak to zrobić? AbstractFactory: co zrobić? 46
47 Treść Wprowadzenie: historia, motywacja Katalog wzorców na podstawie klasycznej pozycji Design Patterns, Elements of Reusable OO Software Wzorce kreacyjne Wzorce strukturalne Wzorce behawioralne Podobieństwa wzorców Podsumowanie i wnioski Ćwiczenia 47
48 Wzorce strukturalne Adapter (adapter) dopasowuje obiekt/klasę do wymagań klienta: adaptowany obiekt posiada oczekiwane możliwości, ale ma nieodpowiedni interfejs. Bridge (most) oddzielenie abstrakcji od sposobu implementacji tej abstrakcji przez zastosowanie kompozycji i dziedziczenia Composite (kompozyt) traktowanie kolekcji w taki sam sposób, jak jej składowych Decorator (dekorator) umożliwienie dynamicznego modyfikowania właściwości obiektów (a nie klas) Facade (fasada) uproszczenie dostępu do złożonego fragmentu kodu (uproszczenie interfejsu) Flyweight pozwala oszczędzić zasoby przez efektywne (wspólne) przechowywanie podobnych obiektów. Proxy (pośrednik) pośredni dostęp do obiektu (zdalnego, dużego współdzielonego, wrażliwego). 48
49 Bridge: cel Oddzielenie (abstrakcji) interfejsu i implementacji w dwóch ortogonalnych hierarchiach, aby mogły ewoluować niezależnie od siebie Podział implementacji w hierarchi 49
50 Bridge: struktura 50
51 Bridge: uczestnicy Abstraction definiuje zewnętrzny interfejs Implementor przechowuje implementację, nie jest spokrewniony z Abstraction RefinedAbstraction rozszerza Abstraction zawiera uchwyt do Implementora, który jest inicjowany jako ConcreteImplementor, ale używany jako Implementor ConcreteImplementor implementuje Implementor 51
52 Bridge: przykład (1) // Abstraction abstract class Shape { abstract void Draw(); abstract void ResizeByPercentage(double pct); protected DrawingAPI drawingapi; // low-level // high-level // Implementor interface DrawingAPI { void DrawCircle(double x, double y, double radius); 52 wikipedia.org
53 Bridge: przykład (2) // ConcreteImplementor 1/2 class DrawingAPI1 implements DrawingAPI { public void DrawCircle(double x, double y, double radius) { System.out.printf("API1.circle at [%f,%f] radius %f\n", x, y, radius); // ConcreteImplementor 2/2 class DrawingAPI2 implements DrawingAPI { public void DrawCircle(double x, double y, double radius) { System.out.printf("API2.circle at [%f,%f] radius %f\n", x, y, radius); 53 wikipedia.org
54 Bridge: przykład (3) // Refined Abstraction class CircleShape extends Shape { private double x, y, radius; public CircleShape(double x, double y, double radius, DrawingAPI drawingapi) { this.x = x; this.y = y; this.radius = radius; this.drawingapi = drawingapi; // low-level i.e. Implementation specific public void Draw() { drawingapi.drawcircle(x, y, radius); // high-level i.e. Abstraction specific public void ResizeByPercentage(double pct) { radius *= pct; 54 wikipedia.org
55 Bridge: przykład (4) // Client class BridgeDemo { public static void main(string[] args) { Shape[] shapes = new Shape[2]; shapes[0] = new CircleShape(1, 2, 3, new DrawingAPI1()); shapes[1] = new CircleShape(5, 7, 11, new DrawingAPI2()); for (Shape shape : shapes) { shape.resizebypercentage(2.5); shape.draw(); 55 wikipedia.org
56 Bridge: konsekwencje Ortogonalizacja hierarchii Abstraction i Implementor powoduje, że mogą one być rozszerzane niezależnie Implementacja może być współdzielona przez wiele abstrakcji Detale implementacji są ukrywane przed obiektami Client 56
57 Flyweight: cel Współdzielenie obiektów w celu zmniejszenia zapotrzebowania na pamięć Tworzenie instancji na żądanie Wydzielenie z obiektu stanu wewnętrznego (współdzielonego) i zewnętrznego (specyficznego) 57
58 Flyweight: struktura, powiązania FlyweightFactory getflyweight(key : String) +flyweights Flyweight operation(extrinsicstate) if (flyweights[key] exists) { return existing flyweight; else { create new one; add to pool; return the new one; ConcreteFlyweight operation(extrinsicstate) UnsharedConcreteFlyweight operation(extrinsicstate) Client 58
59 Flyweight: uczestnicy Flyweight definiuje interfejs do przyjmowania i odtwarzania stanu zewnętrznego obiektu Concrete Flyweight przechowuje stan wewnętrzny (współdzielony) jest niezależny od kontekstu (z wyjątkiem stanu zewnętrznego) Flyweight Factory tworzy i przechowuje obiekty Flyweight Client otrzymuje obiekty Flyweight za pośrednictwem Flyweight Factory 59
60 Flyweight: przykład (1) interface GraphicObject { // The Flyweight public void printatposition( int x, int y ); class GraphicChar implements GraphicObject { // ConcreteFlyweight1 char c; String fontface; public GraphicChar(char c, String fontface) { this.c = c; this.fontface = fontface; public void printatposition(int x, int y) { System.out.printf("Printing '%c' in '%s' at position %d:%d.\n", c, fontface, x, y); 60
61 Flyweight: przykład (2) class Picture implements GraphicObject { // ConcreteFlyweight2 String filename; int width,height; public Picture( String filename, int width, int height ) { this.filename= filename; this.width = width; this.height = height; public void printatposition(int x, int y) { System.out.printf( "Printing '%s' scaled to %dx%d at position %d:%d.\n", filename, width, height, x, y ); 61
62 Flyweight: przykład (3) class GraphicObjectFactory { HashMap<String, GraphicObject> pool = new HashMap<String, GraphicObject>(); public int getnum() { return pool.size(); public String tostring() {// for testing... public GraphicObject get(character c, String fontface) { GraphicObject go; String key = "C: " + c.tostring() + "@" + fontface; if ((go = pool.get(key)) == null) { go = new GraphicChar(c, fontface); pool.put(key, go ); return go;... 62
63 Flyweight: przykład (4)... public GraphicObject get(string filename, int width, int height) { GraphicObject go; String key = "P: " + filename + "@" + width + "x" + height; if ((go = pool.get(key)) == null) { go = new Picture(fileName,width,height); pool.put(key, go ); return go; 63
64 Flyweight: przykład (5) class FlyWeightExample { public static void main(string[] args) { GraphicObjectFactory gof = new GraphicObjectFactory(); ArrayList<GraphicObject> document = new ArrayList<GraphicObject>(); document.add( gof.get("smile.jpg", 100, 100) ); document.add( gof.get(' ', "Times") );... int x=0, y=0; for (GraphicObject c : document) { c.printatposition( x++, y); 64
65 Flyweight: konsekwencje Zmniejszenie wymagań pamięciowych programu zmniejszenie ogólnej liczby obiektów zmniejszenie rozmiaru stanu obiektów stan zewnętrzny może być przechowywany lub wyliczany Wzrost złożoności obliczeniowej dodatkowy nakład na zarządzanie stanem zewnętrznym 65
66 Treść Wprowadzenie: historia, motywacja Katalog wzorców na podstawie klasycznej pozycji Design Patterns, Elements of Reusable OO Software Wzorce kreacyjne Wzorce strukturalne Wzorce behawioralne Podobieństwa wzorców Podsumowanie i wnioski Ćwiczenia 66
67 Wzorce behawioralne (1) Chain of Responsibility (łańcuch odpowiedzialności) oddzielenie (uniezależnienie) nadawcy i odbiorcy zdarzenia. Zarządzanie kolejnością (strukturą) przekazywania żądań. Command (polecenie) realizacja obiektu-polecenia Interpreter realizacja gramatyk specjalizowanych języków i interpreterów tych języków. Iterator nawigacja po kolekcji obiektów bez znajomości wewnętrznej struktury tej kolekcji. Mediator pośrednik między dużą liczbą klas. Obiekt (jedyny) znający wszystkie klasy systemu. Zmniejsza powiązania między klasami. Memento zachowywanie stanu obiektu w celu późniejszego odtworzenia. 67
68 Wzorce behawioralne (2) Observer (obserwator) zarządzanie jednostronną komunikacją pomiędzy obiektem obserwowanym i (dynamicznie zmienną) listą obiektów obserwujących. State (stan) reprezentacja stanu/zachowania obiektu przez wewnętrzny składnik, który może się dynamicznie zmieniać. Strategy (strategia) delegacja definicji algorytmu do klas rozszerzających interfejs. Template Method (szablon metody) definiowanie szablonu metody w klasie pierwotnej; detale są definiowane w klasach pochodnych Visitor (odwiedzający) odseparowanie algorytmów od struktur danych przez abstrakcję zarówno tych struktur (z punktu widzenia algorytmów), jak i algorytmów (z p. widzenia struktur). 68
69 Command: cel Rozprzęgnięcie obiektów wykonujących operacje i operacji Hermetyzacja operacji w postaci obiektów (polecenie i argumenty) Umożliwienie parametryzacji klientów obiektami poleceń Wsparcie dla poleceń odwracalnych 69
70 Command: struktura Client Invoker Command execute() Receiver action() ConcreteCommand state execute() receiver->action() 70
71 Command: interakcje client : Client invoker : Invoker command : Command new Command() receiver : Receiver storecommand(command) configure(receiver) execute( ) action( ) 71
72 Command: uczestnicy Command definicja interfejsu obiektu reprezentującego polecenie Concrete Command jest powiązany z właściwym obiektem Receiver implementuje akcję w postaci metody execute() Client tworzy Concrete Command Invoker ustala odbiorcę akcji każdego obiektu Command wywołuje metodę execute() obiektu Command Receiver jest przedmiotem akcji wykonanej przez Command 72
73 Command: przykład (1) class ExitAction extends AbstractAction { private Component target; public ExitAction(String name, Icon icon, Component t){ putvalue(action.name, name); putvalue(action.small_icon, icon); putvalue(action.short_description, name + " the program"); target = t; public void actionperformed(actionevent evt) { int answer = JoptionPane.showConfirmDialog( target, "Are you sure you want to exit? ", "Confirmation", JoptionPane.YES_NO_OPTION ); if( answer == JoptionPane.YES_NO_OPTION) System.exit(0); 73
74 Command: przykład (2) class SubmitAction extends AbstractAction { private Component target; public SubmitAction(String name, Icon icon, Component t){ putvalue(action.name, name); putvalue(action.small_icon, icon); putvalue(action.short_description, name + " the program"); target = t; public void actionperformed(actionevent evt) { JOptionPane.showMessageDialog(target, "submit action clicked "); 74
75 Command: przykład (3)... Action ea = new ExitAction("Exit", null, this); Action sa = new SubmitAction("Submit", null, this);... JPopupMenu pop = new JPopupMenu("PopMenu"); pop.add(sa); pop.add(ea);... JButton subbtn = new JButton(sa); JButton exitbtn = new Jbutton(ea);... 75
76 Command: konsekwencje Usunięcie powiązania między nadawcą i przedmiotem polecenia Łatwe dodawanie kolejnych obiektów Command Możliwość manipulacji obiektami Command polecenia złożone: wzorzec Composite Polecenia mogą być odwracalne zapamiętanie stanu przez ConcreteCommand wykorzystanie wzorca Memento 76
77 Memento: cel zachowanie (w celu późniejszego odtworzenia) stanu obiektu, zasada hermetyzacji nie powinna być naruszana 77
78 Memento: struktura 78
79 Memento: uczestnicy StatefullComponent potrafi przekazać swój aktualny stan i odtworzyć go na podstawie dostarczonej informacji StateHolder (Memento) przechowuje stan obiektu StatefullComponent 79
80 Memento: przykład class Memento { int num; Memento(int c) { num = c; int getnum() { return num; java.util.list<integer> list; java.util.list<memento> undo;... list.add(i, new Integer(num)); undo.add(i, new Memento(num)); 80
81 Memento: konsekwencje zachowanie hermetyzacji obiektu StatefullComponent uproszczenie klienta ewentualnie podwójny interfejs obiektu StateHolder potencjalny wzrost zapotrzebowania na pamięć 81
82 State: cel wykorzystanie dziedziczenia do elastycznej definicji zachowania obiektu obiekt zmienia swoje zachowanie, gdy zmienia swój wewnętrzny stan: pozorna zmiana klasy obiektu 82
83 State: struktura Client Context +currentstate State request() 1 handle() currentstate->handle() ConcreteStateA handle() ConcreteStateB handle() Klient kontaktuje się z konkretnymi implementacjami State poprzez Context, który odwołuje się do tych obiektów przez ich nadklasę. 83
84 State: uczestnicy Context posiada referencję (typu State) do obiektu reprezentującego bieżący stan State definiuje interfejs pozwalający hermetyzować zachowanie związane z każdym stanem Concrete State definiuje własną implementację określającą zachowanie specyficzne dla tego stanu 84
85 State: przykład (1) abstract class Connection { // State public abstract void open(); public abstract void close(); public abstract void log(); class Accounting extends Connection { // Concrete1 public void open() { System.out.println("open database for accounting"); public void close() { System.out.println("close the database"); public void log() { System.out.println("log activities"); //... 85
86 State: przykład (2) class Sales extends Connection { // Concrete2 public void open() { System.out.println("open database for sales"); public void close() { System.out.println("close the database"); public void log() { System.out.println("log activities"); public void update() { // 86
87 State: przykład class Management extends Connection { // Concrete3 public void open() { System.out.println("open database for management"); public void close() { System.out.println("close the database"); public void log() { System.out.println("log activities"); //... 87
88 State: przykład class Controller { public static Accounting acct; public static Sales sales; public static Management manage; private static Connection current; Controller() { acct = new Accounting(); sales = new Sales(); manage = new Management();... 88
89 89 State: przykład... public void makeaccountingconnection() { current = acct; public void makesalesconnection() { current = sales; public void makemanagementconnection() { current = manage; public void open() { current.open(); public void close() { current.close(); public void log() { current.log();
90 State: konsekwencje Kod związany ze jednym stanem jest zapisany w jednym obiekcie uproszczenie i uealastycznienie kodu Zachowanie obiektu nie jest zaszyte w jego implementacji i może się zmieniać w trakcie wykonania programu Łatwo jest dodawać nowe typy zachowań (kolejne podklasy klasy Stan) Zabezpieczenie przed stanem niespójnym możliwość współdzielenia obiektów State obiekty State zwykle definiują tylko zachowanie obiekty State zwykle są bezstanowe (stan może być przechowywany w obiekcie Context) 90
91 ChainOfResponsibility: cel Usunięcie powiązania pomiędzy nadawcą i odbiorcą żądania Umożliwienie wielu obiektom obsługi żądania 91
92 ChainOfResponsibility: struktura Client Handler handlerequest() +successor ConcreteHandler1 handlerequest() ConcreteHandler2 handlerequest() Obiekty Handler tworzą najczęściej listę jednokierunkową (łańcuch), wzdłuż której są przekazywane żądania. 92
93 ChainOfResponsibility: uczestnicy Handler definiuje interfejs do obsługi żądań Concrete Handler obsługuje jeden rodzaj żądania, pozostałe przekazuje do następnika w łańcuchu posiada referencję typu Handler do następnika Client inicjuje przetwarzanie, przekazując żądanie do pierwszego obiektu Handler w łańcuchu 93
94 ChainOfResponsibility: konsekwencje Ograniczone powiązania Klient i każdy obiekt Handler nie wiedzą, który z pozostałych obiektów Handler obsługuje dany typ żądania nadawca i odbiorca żądania nie mają o sobie żadnej wiedzy Możliwość elastycznego przydziału odpowiedzialności do obiektów Handler Ułatwione testowanie Brak gwarancji obsłużenia żądania 94
95 Chain of Responsibility: przykład 1 Filter dofilter() Inbox +filterchain Filter1 +next Filter2 +next Filter3 filter(msg : Message) dofilter() dofilter() dofilter() filterchain.dofilter() if (! iseligible()) next.dofilter() Obiekt Inbox wywołuje pierwszy obiekt Filter w łańcuchu. Kolejne filtry przekazują sobie sterowanie 95
96 Chain of Responsibility: przykład 2 Inbox filters : Set filter(msg : Message) for (f : filters) { if (f.dofilter()) { break; Filter dofilter() Filter1 Filter2 Filter3 dofilter() dofilter() dofilter() Obiekt Inbox wywołuje kolejno obiekty Filter. 96
97 Decorator: cel Umożliwienie dynamicznego dodawania funkcjonalności do obiektu Stworzenie elastycznej alternatywy dla tworzenia podklas 97
98 Decorator: struktura Klient wysyła komunikat do obiektu Decorator, który przekazuje go obiektowi ConcreteComponent oraz wykonuje dodatkowe operacje ( dekoracje ) 98
99 Decorator: uczestnicy AComponent definiuje wspólny interfejs obiektów, które można dekorować ConcreteComponent realizuje podstawową funkcjonalność obiektu Decorator posiada referencję typu Component i do tego obiektu deleguje komunikaty rozszerza funkcjonalność obiektu ConcreteComponent 99
100 Decorator: interakcje 100 javaworld.com
101 Decorator: java.io URL url = new URL( args[0] ); BufferedReader ulrin = new BufferedReader( new InputStreamReader( url.openstream()));... Filereader fr = new FileReader(args[1]); BufferedReader filein = new BufferedReader( fr ); LineNumberReader lin = new LineNumberReader( filein );... FileReader filein= new FileReader( args[2] ); StreamTokenizer in= new StreamTokenizer( filein ); 101
102 Decorator: java.io 102 javaworld.com
103 Decorator: java.swing JBorderLabel label1 = new JBorderLabel("JLabel Subclass"); BorderDecorator label2 = new BorderDecorator(new JLabel("Decorated JLabel")); BorderDecorator checkbox1 = new BorderDecorator(new JCheckBox("Decorated JCheckBox")); 103 onjava.com
104 Decorator: konsekwencje Większa elastyczność w przydziale odpowiedzialności niż w przypadku dziedziczenia Możliwość dodawania funkcjonalności w trakcie wykonywania programu, gdy jest ona potrzebna Tożsamość obiektu z którym komunikuje się klient może się zmieniać wskutek dekoracji Łatwiejsze testowanie poszczególnych dekoratorów 104
105 Visitor: cel Reprezentacja operacji do wykonania na elementach heterogenicznej struktury Realizacja operacji w sposób specyficzny dla typu odwiedzanego elementu Umożliwienie tworzenia nowych operacji bez konieczności modyfikacji klas wewnątrz struktury 105
106 Visitor: struktura Client Visitor visit(concreteelementa) visit(concreteelementb) ConcreteVisitor١ visit(concreteelementa) visit(concreteelementb) ConcreteVisitor٢ visit(concreteelementa) visit(concreteelementb) ObjectStructure foreach() Element accept(visitor) ConcreteElementA accept(visitor) operationa() ConcreteElementB accept(visitor) operationb() visitor->visit(this) visitor->visit(this) 106
107 Visitor: interakcje : ObjectStructure : ConcreteElementA : ConcreteElementB : ConcreteVisitor١ accept() visit() operationa( ) accept() visit() operationb( ) 107
108 Visitor: interakcje class ConcreteElementA extends Element { //... public void accept(avisitor v) { v.visitconcreteelementa(this); //... public void operationa() { //... class ConcreteVisitor1 extends Visitor { public void visitconcreteelementa( ConcreteElementA e ) { e.operationa(); 108
109 Visitor: uczestnicy Visitor definiuje przeciążone metody dla każdego obiektu ConcreteElement do odwiedzenia Element definiuje metodę accept() przyjmującą obiekt Visitor jako parametr Object Structure posiada iterator pozwalający na dostęp do każdego elementu struktury 109
110 Visitor: przykład (1) interface Expression { // Element void accept(expressionvisitor v); class IntExp implements Expression { // ConcreteElementA int value; IntExp( int v ) { value = v; public void accept(expressionvisitor v) { v.visitintexp(this); 110
111 Visitor: przykład (2) class AddExp implements Expression { // ConcreteElementB Expression e1, e2; AddExp( Expression e1, Expression e2 ) { this.e1 = e1; this.e2 = e2; public void accept(expressionvisitor v) { v.visitaddexp(this); 111
112 Visitor: przykład (3) class MulExp implements Expression { // ConcreteElementC Expression e1, e2; MulExp( Expression e1, Expression e2 ) { this.e1 = e1; this.e2 = e2; public void accept(expressionvisitor v) { v.visitmulexp(this); 112
113 Visitor: przykład (4) class ExpressionPrinter implements ExpressionVisitor { // ConcreteVisitor public void visitintexp(intexp e) { System.out.print(e.value); public void visitaddexp(addexp e) { e.e1.accept(this); System.out.print(" + "); e.e2.accept(this); public void visitmulexp(mulexp e) { e.e1.accept(this); System.out.print(" * "); e.e2.accept(this); 113
114 Visitor: przykład (5) public class VisitorDemo { // Client public static void main( String [] args ) { IntExp i1= new IntExp( 1 ); IntExp i2= new IntExp( 2 ); IntExp i3= new IntExp( 3 ); AddExp ae= new AddExp( i1, i2 ); MulExp me= new MulExp( ae, i3 ); ExpressionVisitor visitor = new ExpressionPrinter(); me.accept( visitor ); System.out.println( "" ); 114
115 Visitor: konsekwencje Możliwość odwiedzenia obiektów niespokrewnionych ze sobą Łatwe dodawanie nowych obiektów Visitor pod warunkiem, że akceptują postać metody visit Utrudnione dodawanie nowych typów Element konieczność modyfikacji klasy Visitor i jej podklas Możliwość zbierania informacji z elementów struktury w sposób dla nich specyficzny Naruszenie hermetyzacji obiektów Visitor i Element obiekty muszą odwoływać się do swoich publicznych metod 115
116 Treść Wprowadzenie: historia, motywacja Katalog wzorców na podstawie klasycznej pozycji Design Patterns, Elements of Reusable OO Software Wzorce kreacyjne Wzorce strukturalne Wzorce behawioralne Podobieństwa wzorców Podsumowanie i wnioski Ćwiczenia 116
117 Podsumowanie: podobieństwa i różnice Te wzorce używają relacji "zawiera" Adapter: opakuj obiekt tak, aby dopasowac jego interfejs Facade: opakuj skomplikowany system uproszczonym interfejsem Proxy: opakuj obiekt dodatkową funkcjonalnością 117
118 Podsumowanie: podobieństwa i różnice Te wzorce używają relacji "dziedziczy" Strategy: zdefiniuj interfejs algorytmu w klasie bazowej i implementuj w podklasach FactoryMethod: zdefiniuj w klasie bazowej metodę zróbobiekt i przeciążaj ją w klasach pochodnych Visitor: stwórz dwie hierarchie, które wzajemnie się obsługują 118
119 Podsumowanie: podobieństwa i różnice Te wzorce opakowują hierarchię dziedziczenia Builder: hierarchia "budowniczych" State: hierarchia możliwych zachowań Bridge: hierarchia abstrakcji + hierarchie implementacji Observer: hierarchia obserwatorów reagujących na zmiany stanu obiektu obserwowanego 119
120 Podsumowanie: podobieństwa i różnice Te wzorce reprezentują rekursywne opakowania Composite: traktuj tak samo obiekt i kolekcję Decorator: opakuj opakowanie opakowania Chain of Responsibility: przerzucaj się pracą do wykonania Interpreter: mapuj problem na język, ten na gramatykę, a ją na wzorzec Composite 120
121 Podsumowanie: podobieństwa i różnice Te wzorce udają, że wszystko jest obiektem Command: polecenie jest obiektem Iterator: iteracja jest interfejsem Mediator: struktura aplikacji jest obiektem Memento: stan obiektu jest obiektem Prototype: operator new można zastąpić metodą obiektu 121
122 Podsumowanie: podobieństwa i różnice Te wzorce nie pasują gdzie indziej Abstract Factory: hierarchia tworząca hierarchie Template Method: hierarchia metod MediatorFlyweight: oszczędzaj zasoby oddzielając to, co zmienne, od tego, co stałe. Singleton: kontroluj, ile czego masz 122
123 Treść Wprowadzenie: historia, motywacja Katalog wzorców na podstawie klasycznej pozycji Design Patterns, Elements of Reusable OO Software Wzorce kreacyjne Wzorce strukturalne Wzorce behawioralne Podobieństwa wzorców Podsumowanie i wnioski Ćwiczenia 123
124 Zakończenie Wzorce nie zostały wymyślone, a jedynie zkatalogowane przez GoF. Wzorce są efektem prac wielu osób. Wzorce są (prawie) gotowymi rozwiązaniami typowych problemów. Wzorce uczą dobrego programowania 124
Wzorce Bartosz projektowe. Jacek Starzyński, ZETiIS PW
Wzorce Bartosz projektowe Walter Jacek Starzyński, ZETiIS PW 1 Motywacja Motto: dobre projekty mają pewne cechy wspólne. Powtórne wykorzystanie sprawdzonych rozwiązań: Typowe problemy można rozwiązywać
Testowanie oprogramowania Wzorce projektowe
Testowanie oprogramowania Wzorce projektowe 1/66 Testowanie oprogramowania Wzorce projektowe dr inż. Grzegorz Michalski 17 listopada 2015 Testowanie oprogramowania Wzorce projektowe 2/66 Plan wykładu Agenda
Wzorce projektowe ArrayList. Aplikacja i zdarzenia. Paweł Chodkiewicz
Wzorce projektowe ArrayList DataGridView Aplikacja i zdarzenia Paweł Chodkiewicz Wzorzec uniwersalne rozwiązanie często powtarzających się problemów. Wzorzec opisuje problem, który powtarza się wielokrotnie
Problemy projektowania obiektowego. Czy podobne problemy można rozwiązywac w podobny sposób?
Problemy projektowania obiektowego Czy podobne problemy można rozwiązywac w podobny sposób? Czy te problemy można przedstawić w abstrakcyjny sposób, tak aby były pomocne w tworzeniu rozwiązań w różnych
problem w określonym kontekście siły istotę jego rozwiązania
Wzorzec projektowy Christopher Alexander: Wzorzec to sprawdzona koncepcja, która opisuje problem powtarzający się wielokrotnie w określonym kontekście, działające na niego siły, oraz podaje istotę jego
Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski
Adapter: opis Wzorce Strukturalne Tomasz Borzyszkowski Alternatywna nazwa: Wrapper (opakowanie) Rola obiektu Adapter: pełni wobec Klienta rolę otoczki, która umożliwia przetłumaczenie jego żądań na protokół
Programowanie obiektowe
Programowanie obiektowe Laboratorium 11 - przegląd wybranych wzorców mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 24 maja 2017 1 / 38 mgr inż. Krzysztof Szwarc Programowanie obiektowe Wzorce
Zaawansowane programowanie w C++ (PCP)
Zaawansowane programowanie w C++ (PCP) Wykład 4 - wzorce projektowe. dr inż. Robert Nowak - p. 1/18 Powtórzenie klasy autonomiczne tworzenie nowych typów: dziedziczenie i agregacja dziedziczenie: przedefiniowywanie
Analiza i projektowanie obiektowe 2016/2017. Wykład 11: Zaawansowane wzorce projektowe (1)
Analiza i projektowanie obiektowe 2016/2017 Wykład 11: Zaawansowane wzorce projektowe (1) Jacek Marciniak Wydział Matematyki i Informatyki Uniwersytet im. Adama Mickiewicza 1 Plan wykładu 1. Wzorce projektowe
Projektowanie oprogramowania: wzorce architektoniczne i projektowe
Projektowanie oprogramowania: wzorce architektoniczne i projektowe Ogólne zasady projektowania Nie staraj się zadziwić innych. Rzeczy oczywiste rób w sposób oczywisty. Nie rozmawiaj z nieznajomym. Projekt
Wzorce projektowe. dr inż. Marcin Pietroo
Wzorce projektowe dr inż. Marcin Pietroo Wzorce projektowe Wzorzec projektowy (ang. design pattern) w inżynierii oprogramowania, rozwiązanie często pojawiających się, powtarzalnych problemów projektowych.
Wprowadzenie do programowania aplikacji mobilnych
Wprowadzenie do programowania aplikacji mobilnych dr Przemysław Juszczuk dr Przemysław Juszczuk Trochę historii Idea wzorców projektowych wywodzi się jeszcze z wczesnych lat osiemdziesiątych ubiegłego
Technologia Programowania 2016/2017 Wykład 4
Technologia Programowania 2016/2017 Wykład 4 Wzorce projektowe GoF Jakub Lemiesz Wzorce GRASP a wzorce GoF Znamy 9 wzorców GRASP ogólne zasady Na GRASP opierają się klasyczne wzorce GoF Na wzorcach GoF
WZORCE PROJEKTOWE (I) (DESIGN PATTERNS)
WZORCE PROJEKTOWE (I) (DESIGN PATTERNS) Maciej Patan Motywacje W wielu dziedzinach nowoczesnej inżynierii napotykamy na następujące zagadnienia: Czy typowe zadania i problemy można rozwiązywać w powtarzalny
Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton
Dzisiejszy wykład Wzorce projektowe Visitor Client-Server Factory Singleton 1 Wzorzec projektowy Wzorzec nazwana generalizacja opisująca elementy i relacje rozwiązania powszechnie występującego problemu
(wybrane) Wzorce projektowe. Programowanie Obiektowe Mateusz Cicheński
(wybrane) Wzorce projektowe Programowanie Obiektowe Mateusz Cicheński Kreacyjne Fabryka abstrakcyjna (Abstract Factory) Budowniczy (Builder) Metoda wytwórcza (Factory Method) Prototyp (Prototype) Singleton
(wybrane) Wzorce projektowe. Programowanie Obiektowe Mateusz Cicheński
(wybrane) Wzorce projektowe Programowanie Obiektowe Mateusz Cicheński Kreacyjne Fabryka abstrakcyjna (Abstract Factory) Budowniczy (Builder) Metoda wytwórcza (Factory Method) Prototyp (Prototype) Singleton
Projektowanie obiektowe Wzorce projektowe
Projektowanie obiektowe Wzorce projektowe Gang of Four Kreacyjne wzorce projektowe (wzorce konstrukcyjne) 1 Roadmap Memento Factory Method Abstract Factory Prototype Builder 2 Wzorce konstrukcyjne wzorce
Wzorce oprogramowania Gof (cd) zastosowane w modelu obiektowym
Wzorce oprogramowania Gof (cd) (Gang of Four skrót odnoszący się do autorów ksiązki: Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software)
Technologia Programowania 2016/2017 Wykład 5
Technologia Programowania 2016/2017 Wykład 5 Wzorce GoF Jakub Lemiesz Wzorce GoF Kreacyjne Builder Singleton Simple Factory Factory Method Abstract Factory Prototype Strukturalne Adapter Decorator Proxy
Projektowanie obiektowe Wzorce projektowe. Wprowadzenie do wzorców projektowych
Projektowanie obiektowe Wzorce projektowe Wprowadzenie do wzorców projektowych 1 Zagadnienia Katalog wzorców projektowych wg Gang of Four Zasady projektowania obiektowego S O L I D MVC - Model-Widok-Kontroler
Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017
Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017 1 Wzorce podstawowe 1.1 Interface vs Abstract class class InterfaceAbstractClass
Wzorce projektowe cz. I. Wzorce projektowe cz. I 1/33
Wzorce projektowe cz. I Wzorce projektowe cz. I 1/33 Wzorce projektowe cz. I 2/33 Historia Wzorce projektowe: wywodzą się z wzorców projektowych w architekturze termin wzorca projektowego wprowadzony do
Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015
Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015 1 Wzorce podstawowe 1.1 Interface vs Abstract class class InterfaceAbstractClass
Wzorce projektowe Michał Węgorek
Wzorce projektowe Michał Węgorek Wzorce projektowe Plan prezentacji Co to jest i po co to jest? Podział Najczęściej spotykane wzorce Bibliografia Co to jest i po co to jest? Wzorzec projektowy (ang. Design
Wzorce projektowe. dr inż. Marcin Pietroo
Wzorce projektowe dr inż. Marcin Pietroo Adapter - strukturalny wzorzec projektowy, którego celem jest umożliwienie współpracy dwóm klasom o niekompatybilnych interfejsach - adapter przekształca interfejs
Projektowanie obiektowe oprogramowania Wykład 5 wzorce strukturalne Wiktor Zychla 2016
Projektowanie obiektowe oprogramowania Wykład 5 wzorce strukturalne Wiktor Zychla 2016 1 Wzorce strukturalne 1.1 Facade Motto: uproszczony interfejs dla podsystemu z wieloma interfejsami class SmtpFacade
Zaawansowane programowanie obiektowe - wykład 5
Zaawansowane programowanie obiektowe - wykład 5 dr Piotr Jastrzębski (czynnościowe) opisują zachowanie obiektów, komunikację pomiędzy nimi i ich odpowiedzialność. Interpreter Iterator (kursor) Łańcuch
Podstawy Programowania Obiektowego
Podstawy Programowania Obiektowego Wprowadzenie do programowania obiektowego. Pojęcie struktury i klasy. Spotkanie 03 Dr inż. Dariusz JĘDRZEJCZYK Tematyka wykładu Idea programowania obiektowego Definicja
Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.
1/8 Singleton Cel: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej. Przykład: Niekiedy ważne jest, aby tworzyć tylko jedną instancję jakiejś klasy. Globalne zmienne
Programowanie w języku Java WYKŁAD
Programowanie w języku Java WYKŁAD dr inż. Piotr Zabawa Certyfikowany Konsultant IBM/Rational e-mail: pzabawa@pk.edu.pl www: http://www.pk.edu.pl/~pzabawa 24.02.2014 WYKŁAD 1 Wzorce projektowe Znaczenie
Wzorce projektowe. dr inż. Marcin Pietroo
Wzorce projektowe dr inż. Marcin Pietroo Iterator czynnościowy wzorzec projektowy (obiektowy), którego celem jest zapewnienie sekwencyjnego dostępu do podobiektów zgrupowanych w większym obiekcie (np.
Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki
Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki Object-oriented programming Najpopularniejszy obecnie styl (paradygmat) programowania Rozwinięcie koncepcji programowania strukturalnego
Wzorce projektowe cz. II. Wzorce projektowe cz. II 1/35
Wzorce projektowe cz. II Wzorce projektowe cz. II 1/35 Wzorce projektowe cz. II 2/35 Iterator Przeznaczenie Wzorzec zapewnia sekwencyjny dostęp do elementów obiektu zagregowanego bez ujawniania jego reprezentacji
JAVA W SUPER EXPRESOWEJ PIGUŁCE
JAVA W SUPER EXPRESOWEJ PIGUŁCE Obiekt Obiekty programowe to zbiór własności i zachowań (zmiennych i metod). Podobnie jak w świecie rzeczywistym obiekty posiadają swój stan i zachowanie. Komunikat Wszystkie
Projektowanie obiektowe Wzorce projektowe. Gang of Four Wzorce odpowiedzialności
Projektowanie obiektowe Wzorce projektowe Gang of Four Wzorce odpowiedzialności 1 Roadmap Singleton Observer Mediator Proxy Flyweight 2 Wzorce odpowiedzialności Udostępniają techniki centralizacji, delegowania
Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne
Projektowanie obiektowe Roman Simiński roman.siminski@us.edu.pl www.siminskionline.pl Wzorce projektowe Wybrane wzorce strukturalne Fasada Facade Pattern 2 Wzorzec Fasada Facade Pattern koncepcja 3 Wzorzec
Wzorce projektowe i refaktoryzacja
Wzorce projektowe i refaktoryzacja Paweł Kozioł p.koziol@students.mimuw.edu.pl 18.01.2005 Moja praca magisterska Narzędzie dla środowiska Eclipse wspierające stosowanie wzorców projektowych J2EE Prowadzący:
Projektowanie obiektowe Wzorce projektowe. Gang of Four Wzorce rozszerzeń
Projektowanie obiektowe Wzorce projektowe Gang of Four Wzorce rozszerzeń 1 Roadmap Decorator Iterator Visitor 2 Wzorce rozszerzeń Mają na celu uczynić proces rozszerzania kodu bardziej czytelnym, prostym
Projektowanie obiektowe Wzorce projektowe. Gang of Four Strukturalne wzorce projektowe (Wzorce interfejsów)
Projektowanie obiektowe Wzorce projektowe Gang of Four Strukturalne wzorce projektowe (Wzorce interfejsów) 1 Roadmap Adapter Bridge Composite Facade 2 Pojęcia obiekt interfejs typ klasa 3 Co to jest delegacja?
Wypożyczalnia VIDEO. Technologie obiektowe
Wypożyczalnia VIDEO Jest to program do obsługi wypożyczalni i wypożyczeń klientów. Głównym zadaniem programu jest zarządzanie wypożyczeniami i drukowanie potwierdzenia wypożyczenia oraz naliczenie punktów
Programowanie obiektowe - 1.
Programowanie obiektowe - 1 Mariusz.Masewicz@cs.put.poznan.pl Programowanie obiektowe Programowanie obiektowe (ang. object-oriented programming) to metodologia tworzenia programów komputerowych, która
Wzorce oprogramowania Gof. zastosowane w modelu obiektowym
Wzorce oprogramowania Gof (Gang of Four skrót odnoszący się do autorów ksiązki: Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software)
Dokumentacja do API Javy.
Dokumentacja do API Javy http://java.sun.com/j2se/1.5.0/docs/api/ Klasy i obiekty Klasa jest to struktura zawierająca dane (pola), oraz funkcje operujące na tych danych (metody). Klasa jest rodzajem szablonu
Prototype (prototyp) Cel: Przykład: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp.
1/14 Prototype (prototyp) Cel: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp. Przykład: Edytor 3D klient tworzy obiekty różnych kształtów
Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska
Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego Iwona Kochaoska Programowanie Obiektowe Programowanie obiektowe (ang. object-oriented programming) - metodyka tworzenia programów komputerowych,
Wzorce projektowe Wykład 7 część 1
Wzorce projektowe Wykład 7 Zofia Kruczkiewicz 1 Wzorce projektowe 1. Identyfikacja wzorców projektowych 2. Przegląd wzorców projektowych 2.1. Wzorce kreacyjne 2.2. Wzorce strukturalne 2.3. Wzorce zachowania
Rysunkowy tutorial Możesz swobodnie dystrybuować ten plik jeśli pozostawisz go w nietkniętym stanie. Możesz także cytować jego fragmenty umieszczając w tekście odnośnik http://mbartyzel.blogspot.com Jak
Command (action, transaction, polecenie)
1/10 Command (action, transaction, polecenie) Cel: Obiekt funkcyjny. Pozwala operować żądaniem jako obiektem wysyłać jako parametr, buforować, kolejkować, składować (dzienniki lub undo). Przykład: class
Builder (budowniczy) Cel: Przykład:
1/8 Builder (budowniczy) Cel: Oddzielenie konstruowania złożonego obiektu od jego reprezentacji, tak aby ten sam proces konstrukcji mógł tworzyć różne reprezentacje. Przykład: 2/8 abstract class TableBuilder
Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej
Programowanie obiektowe Interfejsy Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski pwr.wroc.pl Interfejsy Autor: Paweł Rogaliński Instytut Informatyki,
Wzorce projektowe cz. III
Wzorce projektowe cz. III Prowadzący: Bartosz Walter Wzorce projektowe cz. III 1 Decorator: cel UmoŜliwienie dynamicznego dodawania funkcjonalności do obiektu Stworzenie elastycznej alternatywy dla tworzenia
Technologie i usługi internetowe cz. 2
Technologie i usługi internetowe cz. 2 Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 15 luty 2014 r. 1 Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to paradygmat programowania,
Wstęp [2/2] Wbrew częstemu przekonaniu, nie są one gotowymi rozwiązaniami, to tylko półprodukty rozwiązania.
Adrian Skalczuk Szymon Kosarzycki Spis Treści Wstęp [1/2] Wzorce projektowe są nieodłącznym przyjacielem programisty pozwalają pisać czystszy kod, łatwiejszy do zrozumienia przez innych i zapewniają pewien
Wzorce projektowe [ wstęp ]
Wzorce projektowe [ wstęp ] Motywacje definiowania wzorców projektowych Za twórcę uważany jest amerykański architekt Christopher Alexander Alexander, C., Ishikawa, S., Silverstein, M., The Timeless Way
Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 2
Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 2 Zofia Kruczkiewicz 1 Diagramy maszyn stanowych, wzorce projektowe 1. Modelowanie aktywności za pomocą diagramów sekwencji i aktywności porównanie
Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.
Proxy (pełnomocnik) Cel: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego. Zastosowanie: Wszędzie tam, gdzie oczekujemy bardziej zaawansowanego odwołania do obiektu, niż zwykły
Polimorfizm. dr Jarosław Skaruz
Polimorfizm dr Jarosław Skaruz http://jareks.ii.uph.edu.pl jaroslaw@skaruz.com O czym będzie? finalne składowe klasy abstrakcyjne interfejsy polimorfizm Finalne składowe Domyślnie wszystkie pola i metody
Komputerowe Systemy Przemysłowe: Modelowanie - UML. Arkadiusz Banasik arkadiusz.banasik@polsl.pl
Komputerowe Systemy Przemysłowe: Modelowanie - UML Arkadiusz Banasik arkadiusz.banasik@polsl.pl Plan prezentacji Wprowadzenie UML Diagram przypadków użycia Diagram klas Podsumowanie Wprowadzenie Języki
Modelowanie i Programowanie Obiektowe
Modelowanie i Programowanie Obiektowe Wykład I: Wstęp 20 październik 2012 Programowanie obiektowe Metodyka wytwarzania oprogramowania Metodyka Metodyka ustandaryzowane dla wybranego obszaru podejście do
JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.
JAVA Java jest wszechstronnym językiem programowania, zorientowanym obiektowo, dostarczającym możliwość uruchamiania apletów oraz samodzielnych aplikacji. Java nie jest typowym kompilatorem. Źródłowy kod
Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.
Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r. Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to
1) Wzorzec projektowy Adapter. Zastosowanie:
Projektowanie Systemów Komputerowych Laboratoria/Projekty Krzysztof Regulski AGH, WIMiIP WZORCE STRUKTURALNE PSK - projektowanie systemów komputerowych, notatki w Internecie, Beata Frączek, http://brasil.cel.agh.edu.pl/~09sbfraczek
Omówienie wzorców wykorzystywanych w Prism 5.0. Dominika Różycka
1 Omówienie wzorców wykorzystywanych w Prism 5.0 Dominika Różycka Czym jest wzorzec projektowy? 2 3 Wzorzec projektowy 1. Uniwersalne i sprawdzone w praktyce rozwiązanie często pojawiających się, powtarzalnych
Programowanie zorientowane obiektowo. Mateusz Kołecki
Programowanie zorientowane obiektowo Mateusz Kołecki Plan MVC Wstęp Separacja odpowiedzialnośći Antyprzykład Dobry przykład Wady/zalety MVC MVC to tylko początek - wzorce projektowe Dlaczego chcemy używać
Decorator (dekorator)
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
Program szkolenia: Wzorce projektowe i ich implementacja w C# oraz testowanie automatyczne
Program szkolenia: Wzorce projektowe i ich implementacja w C# oraz testowanie automatyczne Informacje ogólne Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Wzorce projektowe i ich implementacja
PHP 5 język obiektowy
PHP 5 język obiektowy Wprowadzenie Klasa w PHP jest traktowana jak zbiór, rodzaj różnych typów danych. Stanowi przepis jak stworzyć konkretne obiekty (instancje klasy), jest definicją obiektów. Klasa reprezentuje
Abstract Factory (fabryka abstrakcyjna)
1/9 Abstract Factory (fabryka abstrakcyjna) Cel: Zapewnienie interfejsu do tworzenia rodzin powiązanych obiektów bez specyfikacji konkretnej klasy. Przykład: Aplikacja do ustawiania mebli: osobne rodziny
Diagramy klas. dr Jarosław Skaruz http://ii3.uph.edu.pl/~jareks jaroslaw@skaruz.com
Diagramy klas dr Jarosław Skaruz http://ii3.uph.edu.pl/~jareks jaroslaw@skaruz.com O czym będzie? Notacja Ujęcie w różnych perspektywach Prezentacja atrybutów Operacje i metody Zależności Klasy aktywne,
Programowanie obiektowe
Programowanie obiektowe Wykład 7 Marcin Młotkowski 8 kwietnia 2015 Plan wykładu Z życia programisty, część 1 1 Z życia programisty, część 1 2 3 Z życia programisty, część 2 Model View Controller MVC w
UML [ Unified Modeling Language ]
UML [ Unified Modeling Language ] UML język formalny służący do opisu świata obiektów w analizie obiektowej oraz programowaniu obiektowym. W najnowszej wersji (2.4.x) języka UML wyróżnia się 13 diagramów
Programowanie obiektowe
Programowanie obiektowe IV. Interfejsy i klasy wewnętrzne Małgorzata Prolejko OBI JA16Z03 Plan Właściwości interfejsów. Interfejsy a klasy abstrakcyjne. Klonowanie obiektów. Klasy wewnętrzne. Dostęp do
Program szkolenia: Wzorce projektowe w C++
Program szkolenia: Wzorce projektowe w C++ Informacje: Nazwa: Wzorce projektowe w C++ Kod: CCPP-craft-C++ Patterns Kategoria: Craftsmanship dla programistów C i C ++ Grupa docelowa: developerzy Czas trwania:
Programowanie obiektowe
Wykład 12 Marcin Młotkowski 16 maja 2018 Plan wykładu 1 Analiza obiektowa Dziedziczenie Dziedziczenie a składanie 2 Marcin Młotkowski 482 / 537 Dziedziczenie Dziedziczenie a składanie Plan wykładu 1 Analiza
Podstawy Języka Java
Podstawy Języka Java Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to paradygmat programowania, w którym programy definiuje się za pomocą obiektów elementów łączących
Enkapsulacja, dziedziczenie, polimorfizm
17 grudnia 2008 Spis treści I Enkapsulacja 1 Enkapsulacja 2 Spis treści II Enkapsulacja 3 Czym jest interfejs Jak definuje się interfejs? Rozszerzanie interfejsu Implementacja interfejsu Częściowa implementacja
Wzorce projektowe. Wstęp
Wstęp Stworzenie programu łatwego w rozwijaniu i naprawie nie należy do łatwych zadań. Na różnych etapach prac można napotkać wiele niemiłych niespodzianek i przeciwności losu, głównie takich które sami
Wywoływanie metod zdalnych
Wywoływanie metod zdalnych model systemu Wywoływanie metod zdalnych aplikacja kliencka interfejs obiekt serwer Podejście obiektowe do budowy systemów rozproszonych proxy szkielet sieć Istota podejścia
Template method (metoda szablonowa)
1/11 Template method (metoda szablonowa) Cel: Definiuje szkielet algorytmu przy pomocy operacji podstawowych. Konkretyzacja poszczególnych kroków składowych pozostawiona klasom potomnym mogą być one zmieniane
METODY PROGRAMOWANIA
METODY PROGRAMOWANIA Wzorzec Repository 21 października 2017 Krzysztof Pawłowski kpawlowski@pjwstk.edu.pl Każdy wzorzec opisuje problem, który ciągle pojawia się w naszej dziedzinie, a następnie określa
WZORCE PROJEKTOWE. Software engineering has accepted as its charter How to program if you cannot. E. Djikstra
WZORCE PROJEKTOWE Software engineering has accepted as its charter How to program if you cannot. E. Djikstra 1 * Wykład 1 Wzorzec projektowy opis komunikujących się obiektów i klas dostosowanych do rozwiązania
UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.
UML a kod w C++ i Javie Projektowanie oprogramowania Dokumentowanie oprogramowania Diagramy przypadków użycia Przewoznik Zarzadzanie pojazdami Optymalizacja Uzytkownik Wydawanie opinii Zarzadzanie uzytkownikami
Polimorfizm, metody wirtualne i klasy abstrakcyjne
Programowanie obiektowe Polimorfizm, metody wirtualne i klasy abstrakcyjne Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski pwr.wroc.pl Polimorfizm,
Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.
Umiejętność czytania oraz tworzenia diagramów klas UML jest podstawą w przypadku zawodu programisty. Z takimi diagramami będziesz spotykał się w przeciągu całej swojej kariery. Diagramy klas UML są zawsze
Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016
Wykład 2 17 marca 2016 Dziedziczenie Klasy bazowe i potomne Dziedziczenie jest łatwym sposobem rozwijania oprogramowania. Majac klasę bazowa możemy ja uszczegółowić (dodać nowe pola i metody) nie przepisujac
Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7
Instrukcja 7 Laboratoria 9, 10 Opracowanie diagramów sekwencji dla wybranych przypadków użycia reprezentujących usługi oprogramowania wynikających również z wykonanych diagramów czynności; definicja operacji
Architektura Systemu. Architektura systemu umożliwia kontrolowanie iteracyjnego i przyrostowego procesu tworzenia systemu.
Architektura Systemu Architektura systemu umożliwia kontrolowanie iteracyjnego i przyrostowego procesu tworzenia systemu. Architektura jest zbiorem decyzji dotyczących: organizacji systemu komputerowego,
Technologia Programowania 2016/2017 Wykład 6
Technologia Programowania 2016/2017 Wykład 6 Mockito, wzorce GoF, MVC Jakub Lemiesz Lista zadań na laboratorium 2 / 48 Testowanie Tradycyjnie: testy jednostkowe, integracyjne, systemowe, testy akceptacyjne
Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6
Instrukcja 6 Laboratorium 8 Opracowanie diagramów sekwencji dla wybranych przypadków użycia reprezentujących usługi oprogramowania wynikających również z wykonanych diagramów czynności; definicja operacji
Technologie obiektowe
WYKŁAD dr inż. Paweł Jarosz Instytut Informatyki Politechnika Krakowska mail: pjarosz@pk.edu.pl LABORATORIUM dr inż. Paweł Jarosz (3 grupy) mgr inż. Piotr Szuster (3 grupy) warunki zaliczenia Obecność
Wzorce projektowe cz. II
Wzorce projektowe cz. II Prowadzący: Bartosz Walter Wzorce projektowe cz. II 1 Factory Method: cel Zdefiniowanie interfejsu do tworzenia obiektów UmoŜliwienie przekazania odpowiedzialności za tworzenie
Modelowanie obiektowe
Modelowanie obiektowe ZPO 2018/2019 Dr inż. W. Cichalewski Materiały wykonane przez W. Tylman Diagramy klas Diagramy klas Zawiera informacje o statycznych związkach między elementami (klasami) Są ściśle
Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016
Wstęp - wykład 0 22 lutego 2016 Historia Simula 67 język zaprojektowany do zastosowan symulacyjnych; Smalltalk 80 pierwszy język w pełni obiektowy; Dodawanie obiektowości do języków imperatywnych: Pascal
Java - tablice, konstruktory, dziedziczenie i hermetyzacja
Java - tablice, konstruktory, dziedziczenie i hermetyzacja Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU zmienne tablicowe konstruktory klas dziedziczenie hermetyzacja
WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy
WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy Pojęcie klasy Program napisany w języku Java składa się ze zbioru klas. Każda klasa zawiera
Iteracyjno-rozwojowy proces tworzenia oprogramowania Wykład 3 część 1
Iteracyjno-rozwojowy proces tworzenia oprogramowania Wykład 3 część 1 Zofia Kruczkiewicz 1 Zunifikowany iteracyjno- przyrostowy proces tworzenia oprogramowania kiedy? Przepływ działań Modelowanie przedsiębiorstwa
Wywoływanie metod zdalnych
Wywoływanie metod zdalnych Podejście obiektowe do budowy systemów rozproszonych Wywoływanie metod zdalnych model systemu obiekt aplikacja kliencka interfejs serwer proxy szkielet sieć Istota podejścia
Projektowanie Zorientowane na Dziedzinę. ang. Domain Driven Design
Projektowanie Zorientowane na Dziedzinę ang. Domain Driven Design 2 Projektowanie Stan posiadania Przypadki użycia Model dziedziny Operacje systemowe Kontrakty dla operacji systemowych Problemy do rozwiązania