Template method (metoda szablonowa)

Podobne dokumenty
Enkapsulacja, dziedziczenie, polimorfizm

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


Klasy abstrakcyjne i interfejsy

Dziedziczenie. dr Jarosław Skaruz

Kurs WWW. Paweł Rajba.

Builder (budowniczy) Cel: Przykład:

Dokumentacja do API Javy.

Programowanie obiektowe

Technologie i usługi internetowe cz. 2

Wykład 6: Dziedziczenie

Polimorfizm. dr Jarosław Skaruz

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

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Dziedziczenie. Tomasz Borzyszkowski

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

Podstawy programowania III

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

Programowanie obiektowe

Klasy abstrakcyjne, interfejsy i polimorfizm

Metody Metody, parametry, zwracanie wartości

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

.NET Klasy, obiekty. ciąg dalszy

Programowanie obiektowe

Technologia Programowania 2016/2017 Wykład 5

Zaawansowane programowanie obiektowe - wykład 5

PHP 5 język obiektowy

Abstrakcyjny typ danych

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Aplikacje w środowisku Java

JAVA W SUPER EXPRESOWEJ PIGUŁCE

KLASY, INTERFEJSY, ITP

Programowanie obiektowe

Klasy cd. Struktury Interfejsy Wyjątki

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Abstract Factory (fabryka abstrakcyjna)

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

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Wykład 7: Pakiety i Interfejsy

Java: interfejsy i klasy wewnętrzne

Klasy i obiekty cz II

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

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

PARADYGMATY PROGRAMOWANIA Wykład 2

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

Projektowanie obiektowe. Roman Simiński Polimorfizm

Programowanie obiektowe

Programowanie w Javie wykład 8 Interfejsy

Programowanie obiektowe i zdarzeniowe

Aplikacje w środowisku Java

Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h

C++ Przeładowanie operatorów i wzorce w klasach

Programowanie obiektowe

Platformy Programistyczne Wykład z Javy dla zaawansowanych

Diagramy klas. dr Jarosław Skaruz

Java Język programowania

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

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

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

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

Programowanie obiektowe

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Decorator (dekorator)

Java SE Laboratorium nr 2. Temat: Obiektowość

PARADYGMATY PROGRAMOWANIA Wykład 4

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

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

TEMAT : KLASY DZIEDZICZENIE

Modelowanie obiektowe

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Podstawy Programowania Obiektowego

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński


Zaawansowane programowanie w C++ (PCP)

Definiowanie własnych klas

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Programowanie obiektowe. Wykład 03. Maciej Wołoszyn 17 marca Polimorfizm oraz wczesne i późne wiazanie

Multimedia JAVA. Historia

Programowanie obiektowe

Szablony funkcji i klas (templates)

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Podstawy Języka Java

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

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

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

Wzorce projektowe. dr inż. Marcin Pietroo

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

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

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

Podstawy programowania obiektowego

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

0.1 Hierarchia klas Diagram Krótkie wyjaśnienie

Programowanie obiektowe - 1.

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

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

Transkrypt:

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 bez naruszania ogólnej struktury. Przykład: abstract class Game { public final void run() { initialize(); while(!gameover()) { makemoves(); paintscreen(); onend();...

class MyGame extends Game {......... protected void initialize() { System.out.println("Przygotowanie do gry"); protected boolean gameover() { return player.lives <= 0; protected void makemoves() { player.move(); for(monster m : monster) m.move(); protected void paintscreen() { world.draw(); protected void onend() { System.out.println("Game Over"); 2/11

3/11 Zastosowanie: Aby niezmienne części algorytmu zaimplementować raz, natomiast klasom potomnym zostawić implementację zachowań, które mogą się zmieniać. Aby podobne zachowanie kilku klas przenieść do jednej klasy bazowej (w celu uniknięcia powtarzania kodu). Odnajdujemy różnice w zachowaniu poszczególnych klas, przenosimy je do osobnych metod, a następnie zachowanie wspólne umieszczamy w metodzie szablonowej, wywołującej tamte. Aby kontrolować, co może być rozszerzane przez dziedziczenie. Szkielet algorytmu pozostaje niezmienny, klasom potomnym pozwalamy dodawać swoją funkcjonalność jedynie w określonym punktach algorytmu (hook operations).

4/11 Struktura: Składniki: AbstractClass klasa abstrakcyjna deklaruje abstrakcyjne operacje podstawowe implementuje metodę szablonową, definiującą szkielet algorytmu, która korzysta (między innymi) z operacji podstawowych ConcreteClass klasa konkretna implementuje operacje podstawowe, definiując specyficzne dla danej klasy kroki algorytmu

5/11 Zależności: Konkretna klasa pozostawia klasie abstrakcyjnej definicję niezmiennych elementów algorytmu class abstract AbstractClass { public void algorytm() { int ile = kroki(); double suma = 0.0; for(int i = 0; i < ile; ++i) suma += krok(i); krokostatni(suma); abstract int kroki(); abstract double krok(int i); abstract void krokostatni(double i); class ConcreteClass extends AbstractClass{ int kroki() { return (int)(100*math.random()); double krok(int i) { return i; void krokostatni(double d) { System.out.println(d);

6/11 Konsekwencje: Podstawowa technika wielokrotnego wykorzystania kodu. Ważne zwłaszcza w bibliotekach, gdyż jest sposobem na parametryzację zachowań klas bibliotecznych. Prowadzi do odwrotnej interakcji (zwanej czasem zasadą Hollywoodu Don t call us, we ll call you ) klasa bazowa wywołuje metody z klas potomnych, nie na odwrót. // klasycznie: abstract class Bazowa { public void funkcja() { // bazowe działanie class Potomna extends Bazowa { public void funkcja() { super.funkcja(); // dodatkowe działanie

// z metodą szablonową: abstract class Bazowa { public void funkcjaszablonowa() { // bazowe działanie funkcjadodatkowa(); protected void funkcjadodatkowa() { class Potomna extends Bazowa { protected void funkcjadodatkowa() { // dodatkowe działanie Operacje podstawowe są wywoływane przez metodę szablonową, a definiowane przez klasę potomną. Można podzielić je na dwa rodzaje: te, które klasa potomna musi nadpisać (konkretyzują działanie algorytmu) i te, które może nadpisać (stanowią miejsce wstawienia opcjonalnych działań). Ten drugi typ metod (hook operations) powinien zawierać jakieś działanie domyślne (często: nic nie rób ). 7/11

abstract class Bazowa { public final void algorithm() { beforealgorithm(); //... // przygotowanie środowiska //... result = doalgorithm(data); //... // kończenie działań //... afteralgorithm(result); protected abstract int doalgorithm(int data); protected void beforealgorithm() { protected void afteralgorithm(int result) { 8/11

abstract class Story { public final void tell() { System.out.println(bohater() + " wyrusza na " + "wyprawę, aby zdobyć " + cel() + ". Na jego" + " drodze staje " + wróg() + ". " + bohater() + " jest bliski przegranej, ale pomaga mu " + przyjaciel() + ". Dzięki wspólnemu wysiłkowi " + wróg() + " zostaje pokonany i " + bohater() + " zdobywa " + cel() + "."); public abstract String bohater(); public abstract String cel(); public abstract String wróg(); public abstract String przyjaciel(); class MyStory extends Story { public String bohater() { return "Książę"; public String cel() { return "magiczny miecz"; public String wróg() { return "smok"; public String przyjaciel() { return "wiedźma";... new MyStory().tell() 9/11

10/11 Implementacja: 1. Modyfikatory dostępu. Operacje podstawowe to metody chronione (protected) będą mogły być wołane jedynie przez metodę szablonową. Mogą być abstrakcyjne (abstract), wtedy klasa potomna musi dostarczyć ich implementację. Metoda szablonowa nie powinna być przesłaniana, zatem jest finalna (final). abstract class Bazowa { public final void metodaszablonowa() { krok1(); krok2(); protected abstract void krok1(); protected void krok2() { // domyślna implementacja 2. Dobrze jest minimalizować liczbę operacji podstawowych a w każdym razie tych, które klasa potomna musi przesłaniać. 3. Wybór konwencji nazewniczej dodawanie prefiksów do nazw operacji podstawowych i metod do przesłonięcie.

11/11 Powiązania: Factory Method są często wywoływane właśnie przez metody szablonowe. Strategy template methods wykorzystują dziedziczenie, by zróżnicować fragmenty algorytmu, Strategia wykorzystuje delegację, by zmienić cały algorytm.