OOS Object geOrienteerd Software-ontwerp - 5 PackageDiagram Scheiding GUI en Domein
Package diagram UI Framework gui domein + facade test legacy netwerk persistentie
Een model in lagen Application Facade PanelUseCase ViewDomainObject case::gui case::domain Application Facade 1 * PanelUseCase ViewDomainObject DomainObject * * * 1
Application package casus.gui; public class Application extends JFrame { private PanelUseCase1 panel1; private PanelUseCase2 panel2; … public Application() { ..jbInit().. initialisatie en toevoeging van de panels } public static void main(String[] arg) { (new Application()).setVisible(true);
Panel met views package casus.gui; class PanelUseCase1 extends JPanel { private ViewDomainObject view; public PanelUseCase1() { initialisatie en toevoeging view(s); registratie eventlisteners; }
View package casus.gui; import casus.domein.DomainObject; class ViewDomainObject extends JPanel { … public ViewDomainObject() { creatie en toevoeging visuele componenten; evt registratie eventlisteners; } public ViewDomainObject(DomainObject obj) { this(); invulling gegevens a.h.v. obj; // voor sommige extern te wijzigen eigenschappen public String getProperty() {
<<singleton>> Mediatheek voorbeeld <<singleton>> Mediatheek -Mediatheek( ) +Mediatheek getSingleton( ) +Collection getKlant(String) +Klant getKlant(int) +Item getItem(String) +boolean leenUit(Item, Klant) … Klanten Collection getKlant(String) void addKlant(KlantInfo) … Klant 1 * id : int naw : String … 1 1 * Materiaal Item getItem(String) void addItem(ItemInfo) … Item Uitlening id : String vanaf, tot : Datum * 0,1 void leenUit(Klant) … …
Package diagram test gui domein +Applicatie PanelUitlenen PanelRegKlant ViewKlant … +Mediatheek +Klant Klanten +Item +Uitlening …
Nogmaals Observerpatroon
Observer + Facade DomainObject Observer ViewDomainObject Facade <<interface>> Observer void update(Object) state : Type DomainObject( ) Type getState( ) void setState(Type) void attach(Observer) void detach(Observer) void inform( ) observers * ViewDomainObject <<singleton>> Facade addDomainObject( … ) change(DomainObject, …) remove(DomainObject) … searchForDomainObject( … ) attach(Observer,DomainObject) detach(Observer,DomainObject) PanelUseCase
Observer-interface package casus.util; public interface Observer { void update(Object obj); }
Observer-implementatie class ViewDomainObject extends JPanel implements casus.util.Observer { … public void update(Object obj) { DomainObject domainObj = (DomainObject) obj; ophalen en tonen relevante eigenschappen; }
Domeinklasse geschikt maken voor observers package mediatheek.domein; import casus.util.*; import java.util.*; public abstract class Item { private Uitlening uitlening; private ArrayList observers; … public void leenUitAan(Klant k) { if (uitlening != null) return; uitlening = new Uitlening(this, k); inform(); } public void attach(Observer obs){ observers.add(obs); public void inform() { Iterator it = observers.iterator(); while (it.hasNext()) { ((Observer)it.next()).update(this);
Uitlening package mediatheek.domein; public class Uitlening { private Item item; private Klant klant; … //constructor is niet-publiek: Uitlening(Item i, Klant k) { item = i; klant = k; klant.leent(i); }
Klant package mediatheek.domein; import java.util.*; public class Klant { private ArrayList uitleningen; private ArrayList observers; … // niet-publieke methode: void leent(Item item) { if (uitleningen.size()==MAX_TE_LEEN) uitleningen.add(item); inform(); }
To do domeinklassen aanpassen i.v.m. Observer-patroon werken met packages 1 groepslid is verantwoordelijk voor facade elk groepslid kiest in overleg use case uit opsomming benodigde viewklassen taakverdeling viewklassen elk groepslid ontwerpt, codeert en test panelklasse