Wzorce projektowe. Marcin Orchel. AGH University of Science and Technology in Poland 1 / 95

Wielkość: px
Rozpocząć pokaz od strony:

Download "Wzorce projektowe. Marcin Orchel. AGH University of Science and Technology in Poland 1 / 95"

Transkrypt

1 Wzorce projektowe Marcin Orchel AGH University of Science and Technology in Poland 1 / 95

2 Agenda Agenda 2 / 95

3 1 Diagramy UML 2 Wzorce konstrukcyjne 3 Wzorce strukturalne Agenda 3 / 95

4 Diagramy UML Diagramy UML 4 / 95

5 Wprowadzenie do diagramów klas UML diagram klas, ang. class diagram podstawowymi elementami diagramu są klasy, diagram strukturalny zależność, ang. dependency to relacja podkreślająca, że pojedynczy element modelu wymaga innych elementów modelu do specyfikacji lub implementacji, zależny od generalizacja, ang. generalization uogólnienie, dziedziczenie asocjacja, ang. association powiązanie między obiektami danych klas, strzałka obok nazwy oznacza kierunek asocjacji, powiązanie początku z końcem agregacja, ang. aggregation typ asocjacji, całość-część, jedna instancja jest używana do grupowania razem zbioru instancji kompozycja, ang. composition typ asocjacji, silniejsza forma agregacji, obiekt całość jest odpowiedzialny za istnienie i zapis obiektu części, część musi być zawarta maksymalnie w jednym obiekcie całość w danym czasie. Jeśli obiekt całość jest usuwany, to wszystkie instancje części też są usuwane. komentarz, ang. comment inaczej note symbol Diagramy UML 5 / 95

6 Wprowadzenie do diagramów klas UML cd. Zależność vs asocjacja: asocjacja prawie zawsze oznacza, że jeden obiekt posiada drugi obiekt jako atrybut, natomiast zależność oznacza zazwyczaj, że obiekt akceptuje inny obiekt jako parametr do metody, instancjonuje go, albo używa tego obiektu, ten pierwszy obiekt jest zależny od drugiego. Jeśli mamy do czynienia z asocjacją to ze względu na poźniejsze użycie tego obiektu będziemy mieli do czynienia z zależnością. agregacja vs kompozycja, w kompozycji obiekt część nie może istnieć bez obiektu całość - death relationship Diagramy UML 6 / 95

7 Schemat przykładowego diagramu klas UML Class1 +Public attribute -Private attribute #Protected attribute Package +Public operation(parameter1) dependency Abstract class 2 +Public attribute -Private attribute #Protected attribute Package +Public abstract operation(parameter1) Aggregation Class2 +Public attribute -Private attribute #Protected attribute Package +Public operation(parameter1) Class3 +Public attribute -Private attribute #Protected attribute Package +Public operation(parameter1) Association Class4 +Public attribute -Private attribute #Protected attribute Package +Public operation(parameter1) Composition Class5 +Public attribute -Private attribute #Protected attribute Package +Public operation(parameter1) Note Diagramy UML 7 / 95

8 Wzorce konstrukcyjne Wzorce konstrukcyjne 8 / 95

9 Singleton (ang. singleton) gwarantuje, że klasa będzie miała tylko jeden egzemplarz, i zapewnia globalny dostęp do niego w matematyce niezmienny zbiór z jednym elementem public static <T> Set<T> Collections.singleton(T o) public static <T> List<T> Collections.singletonList(T o) public static <K,V> Map<K,V> Collections.singletonMap(K key, V value) java.lang.runtime#getruntime() java.lang.system#getsecuritymanager() Wzorce konstrukcyjne 9 / 95

10 Schemat wzorca singleton Singleton static uniqueinstance singletondata static instance() singletonoperation() getsingletondata() return uniqueinstance Wzorce konstrukcyjne 10 / 95

11 Metoda wytwórcza (ang. factory method) Określa interfejs do tworzenia obiektów, przy czym umożliwia podklasom wyznaczenie klasy danego obiektu. Metoda wytwórcza umożliwia klasom przekazanie procesu tworzenia egzemplarzy podklasom. przykłady z jdk NumberFormat.getInstance() Wzorce konstrukcyjne 11 / 95

12 Schemat wzorca metody wytwórczej Product Creator +factorymethod() +anoperation() product=factorymethod() ConcreteProduct ConcreteCreator +factorymethod() return new ConcreteProduct() Wzorce konstrukcyjne 12 / 95

13 Metoda wytwórcza public abstract class MazeGame { public MazeGame() { Room room1 = makeroom(); Room room2 = makeroom(); room1.connect(room2); abstract protected Room makeroom(); public class MagicMazeGame extends MazeGame protected Room makeroom() { return new MagicRoom(); Wzorce konstrukcyjne 13 / 95

14 Metoda wytwórcza public class OrdinaryMazeGame extends MazeGame protected Room makeroom() { return new OrdinaryRoom(); MazeGame ordinarygame = new OrdinaryMazeGame(); MazeGame magicgame = new MagicMazeGame(); Wzorce konstrukcyjne 14 / 95

15 Fabryka abstrakcyjna (ang. abstract factory) udostępnia interfejs do tworzenia rodzin powiązanych ze sobą lub zależnych od siebie obiektów bez określania ich konkretnych klas Wzorce konstrukcyjne 15 / 95

16 Schemat fabryki abstrakcyjnej «interface» AbstractFactory «import» Client CreateProductA() CreateProductB() ConcreteFactory2 ConcreteFactory1 «interface» AbstractProductA «import» «import» CreateProductA() CreateProductA() CreateProductB() CreateProductB() «instantiate» ProductA1 ProductA2 «instantiate» «instantiate» «interface» AbstractProductB ProductB1 ProductB2 «instantiate» Wzorce konstrukcyjne 16 / 95

17 Fabryka abstrakcyjna abstract class GUIFactory { public static GUIFactory getfactory() { int sys = readfromconfigfile("os_type"); if (sys == 0) { return new WinFactory(); else { return new OSXFactory(); public abstract Button createbutton(); class WinFactory extends GUIFactory { public Button createbutton() { return new WinButton(); Wzorce konstrukcyjne 17 / 95

18 Fabryka abstrakcyjna class OSXFactory extends GUIFactory { public Button createbutton() { return new OSXButton(); abstract class Button { public abstract void paint(); class WinButton extends Button { public void paint() { System.out.println("Przycisk WinButton"); class OSXButton extends Button { public void paint() { System.out.println("Przycisk OSXButton"); Wzorce konstrukcyjne 18 / 95

19 Fabryka abstrakcyjna public class Application { public static void main(string[] args) { GUIFactory factory = GUIFactory.getFactory(); Button button = factory.createbutton(); button.paint(); // Wyświetlony zostanie tekst: // "Przycisk WinButton" // lub: // "Przycisk OSXButton" Wzorce konstrukcyjne 19 / 95

20 Metoda wytwórcza vs fabryka abstrakcyjna w metodzie wytwórczej klasa tworząca posiada tylko jedną metodę do tworzenia jednego rodzaju obiektów, natomiast w fabryce abstrakcyjnej mamy wiele metod do tworzenia różnych rodzajów obiektów nazwa metoda wytwórcza wskazuje na metodę, a fabryka na obiekt Wzorce konstrukcyjne 20 / 95

21 Budowniczy (ang. builder) oddziela tworzenie złożonego obiektu od jego reprezentacji, dzięki temu ten sam proces konstrukcji może prowadzić do powstawania różnych reprezentacji. Wzorce konstrukcyjne 21 / 95

22 Schemat budowniczego Director builder : Builder construct() Builder buildpart() ConcreteBuilder buildpart() getresult() : Product this.builder.buildpart(); << create >> Product Rysunek 5: Źródło: wikipedia Wzorce konstrukcyjne 22 / 95

23 Budowniczy /** "Produkt" */ class Pizza { 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; Wzorce konstrukcyjne 23 / 95

24 Budowniczy /** "Abstrakcyjny budowniczy" */ abstract class PizzaBuilder { protected Pizza pizza; public Pizza getpizza() { return pizza; public void createnewpizzaproduct() { pizza = new Pizza(); public abstract void builddough(); public abstract void buildsauce(); public abstract void buildtopping(); Wzorce konstrukcyjne 24 / 95

25 Budowniczy /** "Konkretny budowniczy" */ class HawaiianPizzaBuilder extends PizzaBuilder { public void builddough() { pizza.setdough("cross"); public void buildsauce() { pizza.setsauce("mild"); public void buildtopping() { pizza.settopping("ham+pineapple"); /** "Konkretny budowniczy" */ class SpicyPizzaBuilder extends PizzaBuilder { public void builddough() { pizza.setdough("pan baked"); public void buildsauce() { pizza.setsauce("hot"); public void buildtopping() { pizza.settopping("pepperoni+salami"); Wzorce konstrukcyjne 25 / 95

26 Budowniczy /** "Nadzorca" */ class Waiter { private PizzaBuilder pizzabuilder; public void setpizzabuilder(pizzabuilder pb) { pizzabuilder = pb; public Pizza getpizza() { return pizzabuilder.getpizza(); public void constructpizza() { pizzabuilder.createnewpizzaproduct(); pizzabuilder.builddough(); pizzabuilder.buildsauce(); pizzabuilder.buildtopping(); Wzorce konstrukcyjne 26 / 95

27 Budowniczy /** Klient zamawiający pizzę. */ class BuilderExample { 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.constructpizza(); Pizza pizza = waiter.getpizza(); Wzorce konstrukcyjne 27 / 95

28 Budowniczy vs fabryka abstrakcyjna budowniczy rozdziela tworzenie obiektu na części, fabryka abstrakcyjna skupia się na tworzeniu rodziny obiektów we wzorcu budowniczy nadzorca najpierw konstruuje wszystkie części, i później zwraca produkt, fabryka abstrakcyjna nie tworzy części, tylko bezpośrednio produkt. Wzorce konstrukcyjne 28 / 95

29 Prototyp (ang. prototype) określa na podstawie prototypowego egzemplarza rodzaje tworzonych obiektów i generuje nowe obiekty przez kopiowanie tego prototypu Wzorce konstrukcyjne 29 / 95

30 Schemat prototypu «interface» I Prototype clone() «import» Client operation() Object p = prototype.clone(); ConcretePrototype1 ConcretePrototype2 clone() clone() return copy of self return copy of self Rysunek 6: Źródło: wikipedia Wzorce konstrukcyjne 30 / 95

31 Prototyp /** Prototype Class **/ public class Cookie implements Cloneable { public Object clone() { try { Cookie copy = (Cookie)super.clone(); //In an actual implementation of this pattern you might now change references to //the expensive to produce parts from the copies that are held inside the prototype. return copy; catch(clonenotsupportedexception e) { e.printstacktrace(); return null; Wzorce konstrukcyjne 31 / 95

32 Prototyp /** Concrete Prototypes to clone **/ public class CoconutCookie extends Cookie { /** Client Class**/ public class CookieMachine { private Cookie cookie;//could have been a private Cloneable cookie; public CookieMachine(Cookie cookie) { this.cookie = cookie; public Cookie makecookie() { return (Cookie)cookie.clone(); public static void main(string args[]) { Cookie tempcookie = null; Cookie prot = new CoconutCookie(); CookieMachine cm = new CookieMachine(prot); for (int i=0; i<100; i++) tempcookie = cm.makecookie(); Wzorce konstrukcyjne 32 / 95

33 Prototyp vs metoda wytwórcza prototyp nie tworzy od nowa obiektów, tylko kopiuje siebie, nie ma produktu Wzorce konstrukcyjne 33 / 95

34 Wzorce strukturalne Wzorce strukturalne 34 / 95

35 Adapter (ang. adapter) Przekształca interfejs klasy na inny, oczekiwany przez klienta. Adapter umożliwia współdziałanie klasom, które z uwagi na niezgodne interfejsy standardowo nie mogą współpracować ze sobą. przykłady z jdk: java.util.arrays#aslist(), java.io.inputstreamreader(inputstream) (zwraca Reader), java.io.outputstreamwriter(outputstream) (zwraca Writer) adapter obiektowy: adapter zawiera instancję klasy, którą adaptuje adapter klasowy: wielokrotne dziedziczenie Wzorce strukturalne 35 / 95

36 Schemat adaptera klasowego Client Target +request() Adaptee +specificrequest() Adapter +request() specificrequest() Wzorce strukturalne 36 / 95

37 Schemat adaptera obiektowego Client Target +request() Adaptee +specificrequest() Adapter +request() adaptee.specificrequest() Wzorce strukturalne 37 / 95

38 Adapter class LegacyLine { public void draw(int x1, int y1, int x2, int y2) { System.out.println("line from (" + x1 +, + y1 + ") to (" + x2 +, + y2 + ) ); class LegacyRectangle { public void draw(int x, int y, int w, int h) { System.out.println("rectangle at (" + x +, + y + ") with width " + w + " and height " + h); interface Shape { void draw(int x1, int y1, int x2, int y2); Wzorce strukturalne 38 / 95

39 Adapter class Line implements Shape { private LegacyLine adaptee = new LegacyLine(); public void draw(int x1, int y1, int x2, int y2) { adaptee.draw(x1, y1, x2, y2); class Rectangle implements Shape { private LegacyRectangle adaptee = new LegacyRectangle(); public void draw(int x1, int y1, int x2, int y2) { adaptee.draw( Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), Math.abs(y2 - y1) ); Wzorce strukturalne 39 / 95

40 Adapter public class AdapterDemo { public static void main(string[] args) { Shape[] shapes = { new Line(), new Rectangle() ; // A begin and end point from a graphical editor int x1 = 10, y1 = 20; int x2 = 30, y2 = 60; for (Shape shape : shapes) shape.draw(x1, y1, x2, y2); Wzorce strukturalne 40 / 95

41 Most (ang. bridge) oddziela abstrakcję od jej implementacji, dzięki czemu można modyfikować te dwa elementy niezależnie od siebie Wzorce strukturalne 41 / 95

42 Schemat mostu Client Abstraction +operation() Implementor +operationimp() imp->operationimp(); RefinedAbstraction ConcreteImplementorA +operationimp() ConcreteImplementorB +operationimp() Wzorce strukturalne 42 / 95

43 Most /** "Implementor" */ interface DrawingAPI { public void drawcircle(double x, double y, double radius); /** "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); Wzorce strukturalne 43 / 95

44 Most /** "Abstraction" */ abstract class Shape { protected DrawingAPI drawingapi; protected Shape(DrawingAPI drawingapi){ this.drawingapi = drawingapi; public abstract void draw(); // low-level public abstract void resizebypercentage(double pct); // high-level Wzorce strukturalne 44 / 95

45 Most /** "Refined Abstraction" */ class CircleShape extends Shape { private double x, y, radius; public CircleShape(double x, double y, double radius, DrawingAPI drawingapi) { super(drawingapi); this.x = x; this.y = y; this.radius = radius; // 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 *= (1.0 + pct/100.0); Wzorce strukturalne 45 / 95

46 Most /** "Client" */ class BridgePattern { public static void main(string[] args) { Shape[] shapes = new Shape[] { new CircleShape(1, 2, 3, new DrawingAPI1()), new CircleShape(5, 7, 11, new DrawingAPI2()) ; for (Shape shape : shapes) { shape.resizebypercentage(2.5); shape.draw(); Wzorce strukturalne 46 / 95

47 Kompozyt (ang. composite) Składa obiekty w struktury drzewiaste odzwierciedlające hierarchię typu część-całość. Wzorzec ten umożliwia klientom traktowanie poszczególnych obiektów i ich złożeń w taki sam sposób. przykład z jdk: java.awt.container#add(component) Wzorce strukturalne 47 / 95

48 Wzorce strukturalne Rysunek 10: Źródło: wikipedia 48 / 95 Schemat kompozytu Component + operation() 0..* child Leaf + operation() Composite + operation() + add() + remove() + getchild() 1 parent

49 Kompozyt /** "Component" */ interface Graphic { //Prints the graphic. public void print(); /** "Composite" */ import java.util.list; import java.util.arraylist; class CompositeGraphic implements Graphic { //Collection of child graphics. private List<Graphic> childgraphics = new ArrayList<Graphic>(); //Prints the graphic. public void print() { for (Graphic graphic : childgraphics) { graphic.print(); Wzorce strukturalne 49 / 95

50 Kompozyt //Adds the graphic to the composition. public void add(graphic graphic) { childgraphics.add(graphic); //Removes the graphic from the composition. public void remove(graphic graphic) { childgraphics.remove(graphic); /** "Leaf" */ class Ellipse implements Graphic { //Prints the graphic. public void print() { System.out.println("Ellipse"); Wzorce strukturalne 50 / 95

51 Kompozyt /** Client */ public class Program { public static void main(string[] args) { //Initialize four ellipses Ellipse ellipse1 = new Ellipse(); Ellipse ellipse2 = new Ellipse(); Ellipse ellipse3 = new Ellipse(); Ellipse ellipse4 = new Ellipse(); //Initialize three composite graphics CompositeGraphic graphic = new CompositeGraphic(); CompositeGraphic graphic1 = new CompositeGraphic(); CompositeGraphic graphic2 = new CompositeGraphic(); //Composes the graphics graphic1.add(ellipse1); graphic1.add(ellipse2); graphic1.add(ellipse3); Wzorce strukturalne 51 / 95

52 Kompozyt graphic2.add(ellipse4); graphic.add(graphic1); graphic.add(graphic2); //Prints the complete graphic (four times the string "Ellipse"). graphic.print(); Wzorce strukturalne 52 / 95

53 Dekorator (ang. decorator) Dynamicznie dołącza dodatkowe obowiązki do obiektu. Wzorzec ten udostępnia alternatywny elastyczny sposób tworzenia podklas o wzbogaconych funkcjach. Przykłady z jdk wszystkie podklasy java.io.inputstream, OutputStream, Reader and Writer mają konstruktor, który przyjmuje instancję tego samego typu. java.util.collections, metody checkedxxx(), synchronizedxxx() i unmodifiablexxx(). Wzorce strukturalne 53 / 95

54 Schemat dekoratora Component +operation() ConcreteComponent +operation() Decorator +operation() component.operation(); ConcreteDecoratorA +addedstate +operation() ConcreteDecoratorB +operation() +addedbehavior() super.operation(); addedbehavior(); Wzorce strukturalne 54 / 95

55 Dekorator // The Window interface class public interface Window { public void draw(); // Draws the Window public String getdescription(); // Returns a description of the Window // Extension of a simple Window without any scrollbars class SimpleWindow implements Window { public void draw() { // Draw window public String getdescription() { return "simple window"; Wzorce strukturalne 55 / 95

56 Dekorator // abstract decorator class - note that it implements Window abstract class WindowDecorator implements Window { protected Window windowtobedecorated; // the Window being decorated public WindowDecorator (Window windowtobedecorated) { this.windowtobedecorated = windowtobedecorated; public void draw() { windowtobedecorated.draw(); //Delegation public String getdescription() { return windowtobedecorated.getdescription(); //Delegation Wzorce strukturalne 56 / 95

57 Dekorator // The first concrete decorator which adds vertical scrollbar functionality class VerticalScrollBarDecorator extends WindowDecorator { public VerticalScrollBarDecorator (Window windowtobedecorated) { public void draw() { super.draw(); drawverticalscrollbar(); private void drawverticalscrollbar() { // Draw the vertical public String getdescription() { return super.getdescription() + ", including vertical scrollbars"; Wzorce strukturalne 57 / 95

58 Dekorator // The second concrete decorator which adds horizontal scrollbar functionality class HorizontalScrollBarDecorator extends WindowDecorator { public HorizontalScrollBarDecorator (Window windowtobedecorated) { public void draw() { super.draw(); drawhorizontalscrollbar(); private void drawhorizontalscrollbar() { // Draw the horizontal public String getdescription() { return super.getdescription() + ", including horizontal scrollbars"; Wzorce strukturalne 58 / 95

59 Dekorator public class DecoratedWindowTest { public static void main(string[] args) { // Create a decorated Window with horizontal and vertical scrollbars Window decoratedwindow = new HorizontalScrollBarDecorator ( new VerticalScrollBarDecorator (new SimpleWindow())); // Print the Window s description System.out.println(decoratedWindow.getDescription()); Wzorce strukturalne 59 / 95

60 Dekorator public abstract class DataVectorDecorator implements DataVector { protected DataVector datavectortobedecorated; public DataVectorDecorator(DataVector datavector) { assert datavector!= null; this.datavectortobedecorated = datavector; Wzorce strukturalne 60 / 95

61 Dekorator public <T> T getdecorator(class<t> clazz) { if (clazz.equals(this.getclass())) { return (T) this; else { return datavectortobedecorated.getdecorator(clazz); Wzorce strukturalne 61 / 95

62 public boolean isdecorator() { return public DataVector getdatavectorwithoutdecorator() { return datavectortobedecorated.getdatavectorwithoutdecorator(); Wzorce strukturalne 62 / 95

63 Dekorator DataVectorCiDecorator decorator = datavector.getdecorator(datavectorcidecorator.class); if (decorator!= null) { decorator.setci(1.0); else { DataVectorCiDecorator datavectorcidecorator = new DataVectorCiDecorator(dataVector, 1.0); newdatamatrix.getdatavectors().set(i, datavectorcidecorator); Wzorce strukturalne 63 / 95

64 Dekorator vs dziedziczenie W przypadku podklas może powstawać wiele podklas z różnym zestawem atrybutów. Można byłoby zgrupować wszystkie atrybuty w jednej klasie i używać ich wybiórczo, ale związane byłoby to z kosztem pamięciowym nieużywanych atrybutów. Zamiast tworzenia dużej ilości podklas, można dynamicznie dołączać potrzebną funkcjonalność. Wzorce strukturalne 64 / 95

65 Fasada (ang. facade) Udostępnia jednolity interfejs dla zbioru interfejsów z podsystemu. Fasada określa interfejs wyższego poziomu ułatwiający korzystanie z podsystemów. Wzorce strukturalne 65 / 95

66 Schemat fasady Rysunek 12: Źródło: wikipedia Wzorce strukturalne 66 / 95

67 Fasada /* Complex parts */ class CPU { public void freeze() {... public void jump(long position) {... public void execute() {... class Memory { public void load(long position, byte[] data) {... class HardDrive { public byte[] read(long lba, int size) {... Wzorce strukturalne 67 / 95

68 Fasada /* Facade */ class ComputerFacade { private CPU processor; private Memory ram; private HardDrive hd; public ComputerFacade() { this.processor = new CPU(); this.ram = new Memory(); this.hd = new HardDrive(); public void start() { processor.freeze(); ram.load(boot_address, hd.read(boot_sector, SECTOR_SIZE)); processor.jump(boot_address); processor.execute(); Wzorce strukturalne 68 / 95

69 Fasada /* Client */ class You { public static void main(string[] args) { ComputerFacade computer = new ComputerFacade(); computer.start(); Wzorce strukturalne 69 / 95

70 Pyłek (ang. flyweight) wykorzystuje współdzielenie do wydajnej obsługi dużej liczby małych obiektów Wzorce strukturalne 70 / 95

71 Schemat pyłka FlyweightFactory +GetFlyweight(key) Flyweight +Operation(extrinsicState) if (flyweight(key) exists) { return existing flyweight; else { create new flyweight; add it to pool of flyweights; return the new flyweight; Client ConcreteFlyweight +IntrinsicState +Operation(extrinsicState) UnsharedConcreteFlyweight +allstate +Operation(extrinsicState) Wzorce strukturalne 71 / 95

72 Pyłek import java.util.list; import java.util.map; import java.util.vector; import java.util.concurrent.concurrenthashmap; // Instances of CoffeeFlavour will be the Flyweights class CoffeeFlavour { private final String name; CoffeeFlavour(String newflavor) { this.name = public String tostring() { return name; Wzorce strukturalne 72 / 95

73 Pyłek // Menu acts as a factory and cache for CoffeeFlavour flyweight objects class Menu { private Map<String, CoffeeFlavour> flavours = new ConcurrentHashMap<String, CoffeeFlavour>(); CoffeeFlavour lookup(string flavorname) { if (!flavours.containskey(flavorname)) flavours.put(flavorname, new CoffeeFlavour(flavorName)); return flavours.get(flavorname); int totalcoffeeflavoursmade() { return flavours.size(); Wzorce strukturalne 73 / 95

74 Pyłek class Order { private final int tablenumber; private final CoffeeFlavour flavour; Order(int tablenumber, CoffeeFlavour flavor) { this.tablenumber = tablenumber; this.flavour = flavor; void serve() { System.out.println("Serving " + flavour + " to table " + tablenumber); Wzorce strukturalne 74 / 95

75 Pyłek public class CoffeeShop { private final List<Order> orders = new Vector<Order>(); private final Menu menu = new Menu(); void takeorder(string flavourname, int table) { CoffeeFlavour flavour = menu.lookup(flavourname); Order order = new Order(table, flavour); orders.add(order); void service() { for (Order order : orders) order.serve(); String report() { return "\ntotal CoffeeFlavour objects made: " + menu.totalcoffeeflavoursmade(); Wzorce strukturalne 75 / 95

76 Pyłek public static void main(string[] args) { CoffeeShop shop = new CoffeeShop(); shop.takeorder("cappuccino", 2); shop.takeorder("frappe", 1); shop.takeorder("espresso", 1); shop.takeorder("frappe", 897); shop.takeorder("cappuccino", 97); shop.takeorder("frappe", 3); shop.takeorder("espresso", 3); shop.takeorder("cappuccino", 3); shop.takeorder("espresso", 96); shop.takeorder("frappe", 552); shop.takeorder("cappuccino", 121); shop.takeorder("espresso", 121); shop.service(); System.out.println(shop.report()); Wzorce strukturalne 76 / 95

77 Pyłek zamiast tworzyć do każdego zamówienia obiekty CoffeeFlavour, tworzymy tylko określoną liczbę obiektów CofeeFlavour Wzorce strukturalne 77 / 95

78 Pełnomocnik (ang. proxy) udostępnia zastępnik lub reprezentanta innego obiektu w celu kontrolowania dostępu do niego Wzorce strukturalne 78 / 95

79 Schemat pełnomocnika Subject request() RealSubject request() realsubject Proxy request() realsubject.request(); Wzorce strukturalne 79 / 95

80 Pełnomocnik interface Image { public void displayimage(); //on System A class RealImage implements Image { private String filename = null; /** * Constructor filename */ public RealImage(final String filename) { this.filename = filename; loadimagefromdisk(); Wzorce strukturalne 80 / 95

81 Pełnomocnik /** * Loads the image from the disk */ private void loadimagefromdisk() { System.out.println("Loading " + filename); /** * Displays the image */ public void displayimage() { System.out.println("Displaying " + filename); Wzorce strukturalne 81 / 95

82 Pełnomocnik //on System B class ProxyImage implements Image { private RealImage image = null; private String filename = null; /** * Constructor filename */ public ProxyImage(final String filename) { this.filename = filename; Wzorce strukturalne 82 / 95

83 Pełnomocnik /** * Displays the image */ public void displayimage() { if (image == null) { image = new RealImage(filename); image.displayimage(); Wzorce strukturalne 83 / 95

84 Pełnomocnik class ProxyExample { /** * Test method */ public static void main(string[] args) { final Image IMAGE1 = new ProxyImage("HiRes_10MB_Photo1"); final Image IMAGE2 = new ProxyImage("HiRes_10MB_Photo2"); IMAGE1.displayImage(); // loading necessary IMAGE1.displayImage(); // loading unnecessary IMAGE2.displayImage(); // loading necessary IMAGE2.displayImage(); // loading unnecessary IMAGE1.displayImage(); // loading unnecessary Wzorce strukturalne 84 / 95

85 Bliźniak (ang. twin) cel: symulacja wielokrotnego dziedziczenia w językach, które go nie posiadają Wzorce strukturalne 85 / 95

86 Schemat wielokrotnego dziedziczenia Wzorce strukturalne 86 / 95

87 Schemat bliźniaka Wzorce strukturalne 87 / 95

88 Bliźniak public class Gameboard extends Canvas { public int width, height; public GameItem firstitem;... Wzorce strukturalne 88 / 95

89 Bliźniak public abstract class GameItem { Gameboard board; int posx, posy; GameItem next; public abstract void draw(); // M1 public abstract void click (MouseEvent e); public abstract boolean intersects (GameItem other); public abstract void collidewith (GameItem other); public void check() { GameItem x; for (x = board.firstitem; x!= null; x = x.next) if (intersects(x)) collidewith(x); Wzorce strukturalne 89 / 95

90 Bliźniak public static BallItem newball (int posx, int posy, int radius) {//method of GameBoard BallItem ballitem = new BallItem(posX, posy, radius); BallThread ballthread = new BallThread(); ballitem.twin = ballthread; ballthread.twin = ballitem; return ballitem; Wzorce strukturalne 90 / 95

91 Bliźniak public class BallItem extends GameItem { BallThread twin; int radius; int dx, dy; boolean suspended; public void draw() { // M1 board.getgraphics().drawoval(posx-radius, posy-radius, 2*radius, 2*radius); public void move() { posx += dx; posy += dy; public void click() { if (suspended) twin.resume(); else twin.suspend(); suspended =! suspended; Wzorce strukturalne 91 / 95

92 Bliźniak public boolean intersects (GameItem other) { if (other instanceof Wall) return posx - radius <= other.posx && other.posx <= posx + radius posy - radius <= other.posy && other.posy <= posy + radius; else return false; public void collidewith (GameItem other) { Wall wall = (Wall) other; if (wall.isvertical) dx = - dx; else dy = - dy; Wzorce strukturalne 92 / 95

93 Bliźniak public class BallThread extends Thread { BallItem twin; public void run() { while (true) { twin.draw(); /*erase*/ twin.move(); twin.draw(); Wzorce strukturalne 93 / 95

94 Inne wzorce konstrukcyjne leniwa inicjalizacja, ang. lazy initialization opóźnienie tworzenia obiektu, obliczania wartości aż do momentu zapotrzebowania na nie multiton jest to singleton, ale rozszerzony o mapę nazwanych obiektów jako pary klucz-wartość, zapewniona jest jedna instancja na dany klucz pula obiektów ang. object pool pula obiektów, które są trzymane w gotowości do użycia inicjalizacja przy pozyskaniu zasobu, ang. resource acquisition is initialization technika łączy przejęcie i zwolnienie zasobu z inicjowaniem i usuwaniem zmiennych, czas używania zasobu jest czasem życia obiektu, zasób jest alokowany podczas tworzenia obiektu przez konstruktor, a zwalniany podczas usuwania obiektu w destruktorze Wzorce strukturalne 94 / 95

95 Inne wzorce strukturalne front controller istnieje jeden, centralny obiekt (np. serwlet), który zarządza wszystkimi żądaniami przychodzącymi od klienta, przykładowo centralna nawigacja w aplikacjach webowych, zarządzanie sesją, caching, filtracja wejścia, wzorzec MVC marker informacja w czasie działania programu o obiektach w postaci metadanych. Realizacja: klasa implementuje interfejs marker i metody które wykorzystują obiekty tej klasy testują istnienie tego interfejsu, przykład interfejs Serializable, metoda writeobject() sprawdza czy jest implementowany ten interfejs. wzorzec modułu implementacja modułów w języku, który je nie wspiera, np. wykorzystując wzorzec singleton, pakiety w Javie Wzorce strukturalne 95 / 95

Wzorce projektowe. Marcin Orchel. AGH University of Science and Technology in Poland 1 / 84

Wzorce projektowe. Marcin Orchel. AGH University of Science and Technology in Poland 1 / 84 Wzorce projektowe Marcin Orchel AGH University of Science and Technology in Poland 1 / 84 1 Diagramy UML 2 Wzorce konstrukcyjne 3 Wzorce strukturalne Agenda 2 / 84 Wprowadzenie do diagramów klas UML diagram

Bardziej szczegółowo

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

(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

Bardziej szczegółowo

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

(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

Bardziej szczegółowo

Wzorce projektowe. dr inż. Marcin Pietroo

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.

Bardziej szczegółowo

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 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

Bardziej szczegółowo

Abstract Factory (fabryka abstrakcyjna)

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

Bardziej szczegółowo

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 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

Bardziej szczegółowo

Wzorce oprogramowania Gof. zastosowane w modelu obiektowym

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)

Bardziej szczegółowo

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

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

Bardziej szczegółowo

Testowanie oprogramowania Wzorce projektowe

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

Bardziej szczegółowo

Programowanie obiektowe

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

Bardziej szczegółowo

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Bardziej szczegółowo

Technologia Programowania 2016/2017 Wykład 5

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

Bardziej szczegółowo

Projektowanie oprogramowania: wzorce architektoniczne i 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

Bardziej szczegółowo

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

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ół

Bardziej szczegółowo

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

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

Bardziej szczegółowo

Zaawansowane programowanie w C++ (PCP)

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

Bardziej szczegółowo

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) 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

Bardziej szczegółowo

Wzorce projektowe cz. II. Wzorce projektowe cz. II 1/35

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

Bardziej szczegółowo

Programowanie i projektowanie obiektowe

Programowanie i projektowanie obiektowe Programowanie i projektowanie obiektowe Powiązania i tworzenie obiektów Paweł Daniluk Wydział Fizyki Jesień 2014 P. Daniluk (Wydział Fizyki) PO w. IV Jesień 2014 1 / 27 Powiązania Jeden do jeden Przez

Bardziej szczegółowo

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

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

Bardziej szczegółowo

Technologia Programowania 2016/2017 Wykład 4

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

Bardziej szczegółowo

Wzorce projektowe. Wstęp

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

Bardziej szczegółowo

Projektowanie obiektowe Wzorce projektowe

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

Bardziej szczegółowo

Programowanie w języku Java WYKŁAD

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

Bardziej szczegółowo

Dokumentacja do API Javy.

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

Bardziej szczegółowo

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

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

Bardziej szczegółowo

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? 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

Bardziej szczegółowo

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

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

Bardziej szczegółowo

Wzorce projektowe cz. I. Wzorce projektowe cz. I 1/33

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

Bardziej szczegółowo

Decorator (dekorator)

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

Bardziej szczegółowo

Builder (budowniczy) Cel: Przykład:

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

Bardziej szczegółowo

1 Atrybuty i metody klasowe

1 Atrybuty i metody klasowe 1 Atrybuty i metody klasowe Składowe klasowe (statyczne) Każdy obiekt klasy posiada własny zestaw atrybutów. Metody używają atrybutów odpowiedniego obiektu. Czasem potrzeba atrybutów wspólnych dla wszystkich

Bardziej szczegółowo

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016 Wykład 9 28 kwiecień 2016 Java Collections Framework (w C++ Standard Template Library) Kolekcja (kontener) Obiekt grupujacy/przechowuj acy jakieś elementy (obiekty lub wartości). Przykładami kolekcji sa

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Wykład 2: Wstęp do języka Java 3/4/2013 S.Deniziak: Programowanie obiektowe - Java 1 Cechy języka Java Wszystko jest obiektem Nie ma zmiennych globalnych Nie ma funkcji globalnych

Bardziej szczegółowo

Wykład 7: Pakiety i Interfejsy

Wykład 7: Pakiety i Interfejsy Wykład 7: Pakiety i Interfejsy Plik Źródłowy w Javie Składa się z: instrukcji pakietu (pojedyncza, opcjonalna) instrukcji importujących (wielokrotne, opcjonalne) deklaracji klasy publicznej (pojedyncza,

Bardziej szczegółowo

PHP 5 język obiektowy

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

Bardziej szczegółowo

Wprowadzenie do programowania aplikacji mobilnych

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

Bardziej szczegółowo

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object Java: kilka brakujących szczegółów i uniwersalna nadklasa Object Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU Konstrukcja obiektów Niszczenie obiektów i zwalnianie zasobów

Bardziej szczegółowo

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 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

Bardziej szczegółowo

KLASY, INTERFEJSY, ITP

KLASY, INTERFEJSY, ITP KLASY, INTERFEJSY, ITP ZAGADNIENIA: Klasy, modyfkatory dostępu, pakiety. Zmienne i metody statyczne. Klasy abstrakcyjne, dziedziczenie. Interfejsy. Komentarze i javadoc, http://th-www.if.uj.edu.pl/zfs/ciesla/

Bardziej szczegółowo

Polimorfizm. dr Jarosław Skaruz

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

Bardziej szczegółowo

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

Współbieżność w środowisku Java Współbieżność w środowisku Java Wątki i ich synchronizacja Zagadnienia Tworzenie wątków Stany wątków i ich zmiana Demony Synchronizacja wątków wzajemne wykluczanie oczekiwanie na zmiennych warunkowych

Bardziej szczegółowo

Wywoływanie metod zdalnych

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

Bardziej szczegółowo

Przykład -

Przykład - Polimorfizm Przykład - http://rpodhajny.wordpress.com klasa bazowa A, oraz klasy pochodne B1, B2,, Bn (dziedziczące po klasie bazowej). niektóre klasy pochodne chcą mieć możliwość skorzystania z metody

Bardziej szczegółowo

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

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,

Bardziej szczegółowo

Wzorce projektowe. dr inż. Marcin Pietroo

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

Bardziej szczegółowo

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017 Wykład 13 14 czerwiec 2017 Java vs cpp - podobieństwa Podobny sposób definiowania klas. Występowanie typów podstawowych: boolean, char, byte, short, int, long, float, double. Podobna zasada definiowania

Bardziej szczegółowo

Modelowanie obiektowe

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

Bardziej szczegółowo

WZORCE PROJEKTOWE (I) (DESIGN PATTERNS)

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

Bardziej szczegółowo

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 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,

Bardziej szczegółowo

Klasy abstrakcyjne, interfejsy i polimorfizm

Klasy abstrakcyjne, interfejsy i polimorfizm Programowanie obiektowe 12 kwietnia 2011 Organizacyjne Klasówka będzie 20 IV 2011. Sale jeszcze są pertraktowane. Materiał do wyjątków włącznie. Można mieć swoje materiały nieelektroniczne. Wywołanie z

Bardziej szczegółowo

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 2

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

Bardziej szczegółowo

Diagram stanów Laboratorium 9

Diagram stanów Laboratorium 9 Diagram stanów Laboratorium 9 Zofia Kruczkiewicz Zofia Kruczkiewicz lab_inp002017_9 1 Modelowanie zachowania obiektu za pomocą diagramu stanów. Opracowanie diagramu stanów dla obiektu wybranej klasy, reprezentującego

Bardziej szczegółowo

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. 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

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Wykład 5 Marcin Młotkowski 23 marca 2017 Plan wykładu 1 2 3 4 5 Marcin Młotkowski Programowanie obiektowe 2 / 50 Historia Początkowe założenia Projekt OAK Sterowanie urządzeniami

Bardziej szczegółowo

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 5

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 5 Instrukcja 5 Laboratorium 7 Identyfikacja klas reprezentujących logikę biznesową projektowanego oprogramowania, definicja atrybutów i operacji klas oraz związków między klasami - na podstawie analizy scenariuszy

Bardziej szczegółowo

Wywoływanie metod zdalnych

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

Bardziej szczegółowo

Programowanie obiektowe

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

Bardziej szczegółowo

Kurs programowania. Wykład 9. Wojciech Macyna

Kurs programowania. Wykład 9. Wojciech Macyna Wykład 9 Java Collections Framework (w C++ Standard Template Library) Kolekcja (kontener) Obiekt grupujacy/przechowuj acy jakieś elementy (obiekty lub wartości). Przykładami kolekcji sa zbiór, lista czy

Bardziej szczegółowo

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

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

Bardziej szczegółowo

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie Języki Programowania II Wykład 3 Java podstawy Przypomnienie Analiza, projektowanie, programowanie, testowanie, wdrażanie Iteracyjnie nie kaskadowo Przypadki użycia = opowiastki o używaniu systemu = wymagania

Bardziej szczegółowo

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

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

Bardziej szczegółowo

Projektowanie obiektowe Wzorce projektowe. Gang of Four Wzorce odpowiedzialności

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

Bardziej szczegółowo

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

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

Bardziej szczegółowo

Wstęp do ruby dla programistów javy

Wstęp do ruby dla programistów javy czyli dlaczego java ssie Akademickie Stowarzyszenie Informatyczne 26 lutego 2011 Podstawowe cechy Ruby vs Java Wieloparadygmatowy Imperatywny Typowanie Silne Dynamiczne Otwarte klasy Interpretowany Wszystko

Bardziej szczegółowo

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

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

Bardziej szczegółowo

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

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java Aplikacje Internetowe Podstawy języka Java Najprostsza aplikacja class Hello { public static void main(string[] args) { System.out.println("Hello World!"); Komponenty Javy JRE Java Runtime Environment

Bardziej szczegółowo

Aplikacje RMI Lab4

Aplikacje RMI   Lab4 Aplikacje RMI https://docs.oracle.com/javase/tutorial/rmi/overview.html Lab4 Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych 1 1. Koncepcja budowy aplikacji RMI (aplikacja rozproszonych

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Przygotował: Jacek Sroka 1 Programowanie obiektowe Wykład 3 Java podstawy Przygotował: Jacek Sroka 2 Przypomnienie Analiza, projektowanie, programowanie, testowanie, wdrażanie Iteracyjnie nie kaskadowo

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Wykład 3: Tworzenie i usuwanie obiektów 3/10/2013 S.Deniziak: Programowanie obiektowe - Java 1 Deklaracje pól klasy class Klasa1 { int i; Klasa2 k = new Klasa2(); char c= x ; byte

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Przygotował: Jacek Sroka 1 Programowanie obiektowe Wykład 4 Java podstawy c.d. (w tym pakiety, polimorfizm, modyfikatory, klasy abstrakcyjne, interfejsy) Przygotował: Jacek Sroka 2 Kolokwium planujemy

Bardziej szczegółowo

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

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych Obiekty reprezentują pewne pojęcia, przedmioty, elementy rzeczywistości. Obiekty udostępniają swoje usługi: metody operacje,

Bardziej szczegółowo

Programowanie zorientowane obiektowo. Mateusz Kołecki

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ć

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Podstawowe cechy i możliwości języka Scala mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 2017 1 / 32 mgr inż. Krzysztof Szwarc Programowanie obiektowe Informacje

Bardziej szczegółowo

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

Bardziej szczegółowo

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1 Obiektowe programowanie rozproszone Java RMI Krzysztof Banaś Systemy rozproszone 1 Java RMI Mechanizm zdalnego wywołania metod Javy (RMI Remote Method Invocation) posiada kilka charakterystycznych cech,

Bardziej szczegółowo

Kurs WWW. Paweł Rajba. pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/

Kurs WWW. Paweł Rajba. pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/ Paweł Rajba pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/ Spis treści Wprowadzenie Automatyczne ładowanie klas Składowe klasy, widoczność składowych Konstruktory i tworzenie obiektów Destruktory i

Bardziej szczegółowo

Wzorce logiki dziedziny

Wzorce logiki dziedziny Wzorce logiki dziedziny 1. Wzorce logiki dziedziny skrypt transakcji (Transaction Script), brama tabeli (Table Data Gateway), model dziedziny (Domain model), strategia (Strategy), moduł tabeli (Table Module),

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Metody statyczne i klasowe Paweł Daniluk Wydział Fizyki Jesień 2013 P. Daniluk (Wydział Fizyki) PO w. VI Jesień 2013 1 / 23 W poprzednich odcinkach... Klasy kategorie obiektów Przynależność

Bardziej szczegółowo

Wzorce projektowe ArrayList. Aplikacja i zdarzenia. Paweł Chodkiewicz

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

Bardziej szczegółowo

Wzorce projektowe Wykład 7 część 1

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

Bardziej szczegółowo

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

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna Język JAVA podstawy Wykład 4, część 1 1 Język JAVA podstawy Plan wykładu: 1. Podstawy modelowania obiektowego 2. Konstruktory 3. Dziedziczenie, związki pomiędzy klasami, UML 4. Polimorfizm 5. Klasy abstrakcyjne

Bardziej szczegółowo

Java: interfejsy i klasy wewnętrzne

Java: interfejsy i klasy wewnętrzne Java: interfejsy i klasy wewnętrzne Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak 1 INTERFEJSY Interfejs to opis co klasa implementująca dany interfejs powinna robić, ale bez określania

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Wykład 2 Marcin Młotkowski 4 marca 2015 Plan wykładu 1 2 3 4 5 Marcin Młotkowski Programowanie obiektowe 2 / 47 Krótki opis C Obiektowy, z kontrolą typów; automatyczne odśmiecanie;

Bardziej szczegółowo

Wypożyczalnia VIDEO. Technologie obiektowe

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

Bardziej szczegółowo

Tworzenie i wykorzystanie usług

Tworzenie i wykorzystanie usług Strona 1 Co to jest usługa w systemie Android? Usługi HTTP Obsługa wywołania HTTP GET Obsługa wywołania HTTP POST Obsługa wieloczęściowego wywołania HTTP POST Usługi lokalne Usługi zdalne Tworzenie usługi

Bardziej szczegółowo

Wykład 4: Klasy i Metody

Wykład 4: Klasy i Metody Wykład 4: Klasy i Metody Klasa Podstawa języka. Każde pojęcie które chcemy opisać w języku musi być zawarte w definicji klasy. Klasa definiuje nowy typ danych, których wartościami są obiekty: klasa to

Bardziej szczegółowo

Remote Method Invocation 17 listopada 2010

Remote Method Invocation 17 listopada 2010 Podejście obiektowe do budowy systemów rozproszonych interfejs (w języku Java), wywiedziony z Remote obiekt aplikacja klienckak interfejs serwer stub szkielet sieć Mechanizm RMI umożliwia tworzenie obiektów

Bardziej szczegółowo

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

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

Bardziej szczegółowo

Laboratorium 8 Diagramy aktywności

Laboratorium 8 Diagramy aktywności Laboratorium 8 Diagramy aktywności Zofia Kruczkiewicz Zofia Kruczkiewicz Lab_INP002017_8 1 Modelowanie zachowania obiektów za pomocą diagramów aktywności. Modelowanie zachowania obiektów za pomocą diagramów

Bardziej szczegółowo

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1 interfejs (w języku Java), wywiedziony z Remote obiekt Podejście obiektowe do budowy systemów rozproszonych aplikacja kliencka interfejs serwer stub szkielet sieć Mechanizm RMI umożliwia tworzenie obiektów

Bardziej szczegółowo

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

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run(). Wątki Streszczenie Celem wykładu jest wprowadzenie do obsługi wątków w Javie. Czas wykładu 45 minut. Definiowanie wątków jako klas potomnych Thread Nadpisanie metody run(). class Watek extends Thread public

Bardziej szczegółowo

Podejście obiektowe do budowy systemów rozproszonych

Podejście obiektowe do budowy systemów rozproszonych Podejście obiektowe do budowy systemów rozproszonych interfejs (w języku Java), wywiedziony z Remote obiekt aplikacja kliencka interfejs serwer stub szkielet sieć Dariusz Wawrzyniak (IIPP) 1 Mechanizm

Bardziej szczegółowo

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych mluckner@mini.pw.edu.pl http://www.mini.pw.edu.pl/~lucknerm Programy w Javie składają się z pakietów Pakiety zawierają definicje

Bardziej szczegółowo

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016 Wykład 1 3 marca 2016 Słowa kluczowe języka Java abstract, break, case, catch, class, const, continue, default, do, else, enum, extends, final, finally, for, goto, if, implements, import, instanceof, interface,

Bardziej szczegółowo

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

Język JAVA podstawy. Wykład 4, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna Język JAVA podstawy Wykład 4, część 3 1 Język JAVA podstawy Plan wykładu: 1. Podstawy modelowania obiektowego 2. Konstruktory 3. Dziedziczenie, związki pomiędzy klasami, UML 4. Polimorfizm 5. Klasy abstrakcyjne

Bardziej szczegółowo

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone Plan wykładu CORBA Wprowadzenie Architektura CORBA IDL język definicji interfejsów ORB Object Request Broker Usługi i POA Aplikacje CORBA tworzenie serwera tworzenie klienta Aplikacje rozproszone Cechy

Bardziej szczegółowo

Podstawy Języka Java

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

Bardziej szczegółowo

Programowanie obiektowe

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

Bardziej szczegółowo