Design Patterns g of v 4

52
1 Design Patterns

description

design matters

Transcript of Design Patterns g of v 4

Dia 1

1

Design PatternsThomas More 2e jaar Toegepaste InformaticaOvererving1InhoudInleidingVoorbeeld SingletonVoetbalspelDesign uitdaging 1: ObserverDesign uitdaging 2: StrategyDesign uitdaging 3: DecoratorDesign uitdaging 4:

2Thomas More 2e jaar Toegepaste InformaticaOvererving2InleidingGOF Design Patterns

GRASPatternsGeneral Responsibility Assignment Software Patterns

Entreprise Patterns3Wat zijn patterns?Er is niet n juiste oplossingVeelvoorkomende problemen: een pattern is een goede oplossingBest practices: goede oplossingen voor veel voorkomende problemenCommunicatiemiddel: tussen ontwerpers en programmeurs gemakkelijk om te weten waarover men spreekt.Vb. Design Patterns, Enterprise Patterns, GRASP

4Naam: communicatiemiddelProbleem: beschrijving van het probleem dat het oplostOplossing: beschrijving van hoe het probleem wordt opgelostGevolgen: gevolgen van het toepassen van het patroonPatterns: eigenschappen5Patterns - VoordelenOnderhoudbaarheid: standaardpatroon direct gekendHerbruikbaarheid: een hele oplossing wordt herbruiktProgrammeertaalonafhankelijk: breed toepasbaar, onafhankelijk van enige programmeertaal

6GOF Design patternsUitgevonden door the Gang Of Four Erich Gamma, Richard Helm, Ralph Johnson en John VlissidesDesign Patterns - Elements of Reusable Object-Oriented Software3 types:CreationalMechanismen om objecten van klassen aan te makenStructural Over relaties tussen entiteiten en hoe deze samenwerkenBehavioralIvm de communicatie tussen entiteiten

GOF Design patterns

Singleton (object creational)Probleem: Hoe kan je ervoor zorgen dat er maar n instantie van een klasse wordt aangemaakt?Oplossing: Geef de klasse een private instantie van zichzelf en een private constructor. Je kan enkel aan de private instantie door middel van een publieke methode. Deze methode maakt de instantie aan indien ze gelijk is aan null, en geeft vervolgens deze enige instantie door.9public final class President {

private static President president;

private President() { System.out.println("Er wordt een singleton-object aangemaakt."); }

public static President getInstance() { if (president == null) { president = new President(); } return president; }}Singleton - voorbeeld10Singleton - voorbeeldPresident eerste, tweede;eerste = President.getInstance();tweede = President.getInstance();

If (eerste==tweede){ System.out.println("De twee singletonvariabelen verwijzen naar hetzelfde object.");}else { System.out.println("Dit kan in principe niet.");}11Design patterns - andereSingleton is het meest eenvoudige design pattern, maar niet het enige

Me: So! Have you ever heard of a book called Design Patterns? Them: Oh, yeah, um, we had to, uh, study that back in my software engineering class. I use them all the time. Me: Can you name any of the patterns they covered? Them: I loved the Singleton pattern! Me: OK. Were there any others? Them: Uh, I think there was one called the Visitater. Me: Oooh, that's right! The one that visits potatoes. I use it all the time. Next!!!

I actually use this as a weeder question now. If they claim expertise at Design Patterns, and they can ONLY name the Singleton pattern, then they will ONLY work at some other company. 12Design patterns - andereObserver (Object Behavioral)Strategy (Object Behavioral)Decorator (Object Structural)Builder (Object Creational)

13Toepassing: VoetbalspelGegeven: Klassendiagram Design uitdagingenToepassing van design patterns

14Klassen in het voetbalspelPlayer de speler die voetbaltTeam een verzameling spelersBall wordt tijdens het spel gebruikt door de spelersPlayGround locatie waar de match plaatsvindt Referee persoon die het spel controleertGame definieert een voetbalspel dat bestaat uit 2 teams, 1 ball, 3 referees, 1 playground enz.GameEngine om een aantal spellen te kunnen simulerenTeamStrategy om de strategie van het team tijdens een spel te bepalen

KlassendiagramFunctionaliteitenWat moet de gebruiker bijvoorbeeld allemaal kunnen?team(s) uitkiezenspeler(s) aan team toevoegen/verwijderen stadion uitkiezenspel spelen Doelstellingen voetbalspelImplementeren van verschillende design patterns in het voetbalspel met als doelstellingen:Begrijpen hoe het design pattern werktWaarom het interessant is om te gebruikenZelf een patroon te kunnen implementerenDesign uitdagingenBall Wanneer de positie van ball wijzigt moeten al de spelers (player) en de scheidsrechter (referee) meteen op de hoogte gebracht worden. Team en TeamStrategy De gebruiker kan tijdens het spel de strategie van zijn team wijzigen (vb. van aanvallen naar verdedigen)Player Elke speler in een team heeft nog bijkomende verantwoordelijkheden zoals spits, verdediger, doelman enz. die tijdens het spel kunnen toegekend worden.PlayGround Elke playground heeft een bepaald oppervlak, publiek, etc en elke playground ziet er anders uit.

Design uitdagingenWe bekijken of en hoe we deze uitdagingen kunnen oplossen m.b.v. design patterns.

Hiertoe proberen we eerst het probleem te generaliseren. Daarna zoeken we naar een mogelijke oplossing in de lijst van design patterns.

Vervolgens passen we deze toe in onze applicatieDesign pattern 1Specifieke uitdaging: Hoe zorg ik ervoor dat wanneer de positie van de bal wijzigt alle betrokkenen (spelers, scheidsrechters, ) automatisch op de hoogte worden gebracht zodat ze hier vervolgens gepast op kunnen reageren? Generalisatie: Wanneer een object wijzigt moet iedereen die hier afhankelijk van is, automatisch verwittigd en gepdated worden.

We vinden in de lijst van design patterns volgend kandidaat pattern terug:

Observer: A way of notifying change to a number of classes. Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

Design pattern 1Observer pattern - algemeen

Klassendiagram observer patternDetails observer pattern:Subject: verantwoordelijk voor bijhouden van lijst van observers, kan observers toevoegen en verwijderenAttach voeg observer toeDetach verwijder observerNotify verwittig observer van wijziging door update functie in observer op te roepen ConcreteSubject bevat de toestand waarin de observers genteresseerd zijn. Stuurt notificatie naar al de observers door de notify functie (zie Subject klasse) op te roepen.GetState Geeft toestand van subject terug

Observer pattern - algemeenDetails observer pattern (vervolg):Observer abstracte klasse, definieert een updating interface voor al de observers zodat deze een update notificatie van subject kunnen ontvangen. Update abstracte functie, zal overridden worden door concrete observers ConcreteObserver houdt een referentie naar subject bij om de toestand van subject te kunnen opvragen wanneer hij een notificatie ontvangtUpdate (overriden) Wanneer subject deze functie oproept, roept de concreteObserver de GetState functie van subject op om zo informatie over zijn toestand te verkrijgen.

Observer pattern - algemeen

Observer pattern - Voetbalspelpublic class Ball{private ArrayList observers = new ArrayList();public void attachObserver(IObserver obs){observers.add(obs);}public void detachObserver(Iobserver obs){observers.remove(obs);}public void notifyObservers(){for(IObserver o:observers){o.update();}}...Observer pattern - Voetbalspelpublic class Football extends Ball{ private Position position; public Position getPosition() { return position; }

public void setPosition(Position myPosition) { this.position = myPosition; notifyObservers(); } Observer pattern - Voetbalspelpublic abstract class IObserver{ public abstract void update();}

Of

public abstract interface IObserver{ public abstract void update();}

Observer pattern - Voetbalspelpublic class Player extends Iobserver{private String name; private Football ball; @Override public void update() { String playerstring = "Speler " + getName() + " loopt naar de bal die zich op volgende positie bevindt: "; playerstring += getBall().getPosition().getX() + ", "; playerstring += getBall().getPosition().getY() + ", "; playerstring += getBall().getPosition().getZ(); System.out.println(playerstring); } }Observer pattern - Voetbalspelpublic class Referee extends Iobserver{private String name; private Football ball; @Override public void update() { //doe hier iets als bal van positie verandert String refstring = "Scheidsrechter " + getName() + " kijkt in de richting van de bal zich op volgende positie bevindt: ";

refstring += getBall().getPosition().getX() + ", "; refstring += getBall().getPosition().getY() + ", "; refstring += getBall().getPosition().getZ(); System.out.println(refstring); } Observer pattern - VoetbalspelObserver pattern - opdrachtMaak opdracht projectoefening 2014-2015 design patterns deel 1Zie toledo32Design pattern 2Specifieke uitdaging De spelers in een team kunnen op verschillende wijze hun spel spelen: aanvallend of verdedigend of Afhankelijk van de gekozen strategie zal een team het spel anders spelen. Hoe kan ik op een eenvoudige wijze tijdens het spel de strategie van mijn team wijzigen?(vb. van aanvallen naar verdedigen)

Generalisatie: We moeten een bepaalde werkwijze (algoritme) onafhankelijk maken van diegene die het gebruiken.

We vinden in de lijst van design patterns volgend kandidaat pattern terug:

Strategy: Encapsulates an algorithm inside a class. Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it. Design pattern 2Klassendiagram strategy pattern

Strategy pattern - algemeenStrategy abstracte klasse voor het algoritme/strategie waarvan al de concrete algoritmes overerven. Het voorziet een gemeenschappelijke interface voor al de concrete algoritmes/strategien. Al de abstracte functies uit de Strategy klasse moeten door de ConcreteStrategy klassen overridden worden.ConcreteStrategy In deze klasse implementeren we het algoritme.Context kan geconfigureerd worden met 1 of meerdere ConcreteStrategies. Het gebruikt deze ConcreteStrategy via de interface die vastgelegd is in Strategy.Strategy pattern - algemeen

Strategy pattern - Voetbalspelpublic abstract class TeamStrategy{public abstract void play();}

Of

public interface TeamStrategy { public void play();}Strategy pattern - Voetbalspelpublic class AttackStrategy extends TeamStrategy { @Override public void play(){ System.out.println(Speelt in aanvalsmodus"); }}

public class DefendStrategy extends TeamStrategy{ @Override public void play(){ System.out.println(Speelt in defensieve modus"); }}Strategy pattern - Voetbalspelpublic class Team{private String teamName;private TeamStrategy strategy;public void setStrategy(TeamStrategy strategy) { this.strategy = strategy; }

public void playGame(){ System.out.println(teamName); strategy.play(); }Strategy pattern - VoetbalspelStrategy pattern - opdrachtMaak opdracht projectoefening 2014-2015 design patterns deel 2 a)Zie toledo41Design pattern 3Specifieke uitdaging: Elke speler in een team heeft een aantal verantwoordelijkheden zoals de bal passen. Elke spelers moet naast deze algemene verantwoordelijkheden nog bijkomende specifieke verantwoordelijkheden krijgen zoals degene van een spits, verdediger, doelman enz. Hoe kan ik bij het begin maar ook tijdens het spel, aan een speler dynamisch bijkomende verantwoordelijkheden toekennen?Generalisatie: We moeten op een dynamische manier bijkomende verantwoordelijkheden aan een object kunnen toekennen d.w.z. dat het niet nodig moet zijn om gebruik te maken van extra subklassen.

We vinden in de lijst van design patterns volgend kandidaat pattern terug:

Decorator: Add responsibilities to objects dynamically. Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.Design pattern 3Klassendiagram decorator pattern

Decorator pattern - algemeenComponent abstracte klasse die een interface definieert voor componenten.ConcreteComponent concrete implementatie van de component klasse. Definieert een object waaraan bijkomende verantwoordelijkheden toegekend kunnen worden.Decorator erft attributen en operaties over van een Component n houdt een referentie bij naar een object van de klasseConcreteDecorator Dit is de klasse waarmee we extra verantwoordelijkheden gaan toekennen aan een component.Decorator pattern - algemeen

Decorator pattern - Voetbalspelpublic class Player{public void passBall(){String s = Speler (" + getName() + ") - paste de bal"; System.out.println(s);}}

public class FieldPlayer extends Player{public void passBall(){ String s = Veldspeler (" + getName() + ") - paste de bal"; System.out.println(s); }}

Decorator pattern - VoetbalspelOm de bestaande code niet te breken maken we Player niet abstractpublic class GoalKeeper extends Player{public void passBall(){ String s = Keeper (" + getName() + ") - passte de bal"; System.out.println(s); }}

Decorator pattern - VoetbalspelThomas More 2e jaar Toegepaste InformaticaOvererving48public class PlayerRole extends Player{ protected Player player; @Override public void passBall(){ player.passBall(); }

public void setPlayer(Player player) { this.player = player; }}

Decorator pattern - Voetbalspelpublic class Defender extends PlayerRole{ public void defend(){ String s = Verdediger (" + player.getName() + ") voorkwam een schot op doel"; System.out.println(s); }}

Toegevoegd gedrag: dribbelen is in ons programma een verantwoordelijkheid die exclusief voor middenvelders is weggelegdVerdedigen kan enkel door een verdediger Enkel aanvallers kunnen op doel schietenpublic class MidFielder extends PlayerRole{ public void dribble(){ String s = Middenvelder (" + player.getName() + ") dribbelde met de bal"; System.out.println(s); }}

public class Forward extends PlayerRole{ public void shootGoal(){ String s = Spits (" + player.getName() + ") schoot op doel"; System.out.println(s); }}

Decorator pattern - VoetbalspelStrategy pattern - opdrachtMaak opdracht projectoefening 2014-2015 design patterns deel 2 b)Zie toledo52