Dr inż. Wojciech Koziński maj 2007 ZS ISEP WE PW Przykład zastosowania notacji UML dla realizacji zastosowania wzorca Mediator (materiały dla studentów na prawach rękopisu) Opis systemu (wzorca Mediator): Systemy programowe składają się zwykle ze znacznej liczby klas. Logika współdziałania znacznej liczby jest złożona i rośnie wraz z komplikacją systemu. W przypadku, gdy każda klasa musi zawierać informacje o metodach wszystkich innych współdziałających klas, utrzymanie i rozbudowa takiego systemu stają się coraz trudniejsze. Wzorzec Mediator pozwala na rozluźnienie powiązań między poszczególnymi klasami. Specjalizowana klasa Mediator zawiera informacje o metodach znajdujących się w innych klasach (przykładowo klasa Colleague). Klasy informują klasę Mediator o zmianach, z kolei klasa Mediator informuje pozostałe, które oczekują na wiadomość o tym fakcie. Diagram przypadków użycia. strona1/7
Diagram klas: Diagram czynności (activity diagram) współpraca trzech obiektów. strona2/7
Diagram sekwencji realizacja przypadku użycia setup: Diagram sekwencji realizacja przypadku użycia samplemeeting: strona3/7
Diagram sekwencji realizacja przypadku użycia changed: strona4/7
Kod wygenerowany na podstawie diagramu klas UML: ==== Code generated by Sun Studio Enterprise 8.1 ==== import java.util.arraylist; * Communications Manager class which inherits from Mediator * main class which simulates the system public class CommunicationsManager extends Mediator { public static void main(string[] args) { public void setup() { public void samplemeeting() { public void changed(colleague person) { ======================================================= public abstract class Mediator { private Vector<Colleague> colleagues = new Vector<Colleague>(); public void addcolleague(colleague col) { public abstract void changed(colleague col); =========================================================== * abstract class for all colleagues. A Colleague knows its mediator public abstract class Colleague { private Mediator mediator; public void addmediator(mediator med) { public void changed() { ============================================================== public class TeamMember extends Colleague { * instance variables String name; * instance variables String meeting; private Vector<String> meetings = new Vector<String>(); * a constructor public TeamMember(String aname) { public void meeting(string atimeanddate) { public String currentmeeting() { return null; public void newmeeting(string atimeanddate) { ================================================================= strona5/7
Kod uzupełniony z przykładowymi rezultatami działania: ============ MEDIATOR ============================= // Communications Manager class which inherits from Mediator // main class which simulates the system public class CommunicationsManager extends Mediator { public static void main(string args[]) { CommunicationsManager c = new CommunicationsManager(); c.setup(); c.samplemeeting(); public void setup() { String teammembers[] = {"John", "Denise", "Phoebe", "Isobel", "Andrew", "Ian"; System.out.println("--- TEAM MEMBERS ---"); for (String str : teammembers) { addcolleague(new TeamMember(str)); System.out.println(str); public void samplemeeting() { // This is just an example; manager would not normally initiate this. TeamMember aperson; // possibilities elementat(i), firstelement(), lastelement() aperson = (TeamMember) (colleagues.elementat(3)); System.out.println("--- MEETING CALLED ---"); aperson.addmediator(this); aperson.meeting("9.00 am 10 Nov 2006"); public void changed (Colleague person) { TeamMember tm; String themeeting = ((TeamMember)person).currentMeeting(); System.out.println("--- MESSAGE DISSEMINATED ---"); for (Colleague col : colleagues) { tm = (TeamMember) col; if (col!= person) tm.newmeeting(themeeting); ========================================================================== // Mediator based system import java.util.*; public abstract class Mediator { public Vector<Colleague> colleagues = new Vector<Colleague>(); public void addcolleague(colleague col) { colleagues.addelement(col); public abstract void changed (Colleague col); strona6/7
========================================================================== // abstract class for all colleagues. A Colleague knows its mediator public abstract class Colleague { private Mediator mediator; public void addmediator(mediator med) { mediator = med; public void changed() { mediator.changed(this); ========================================================================= import java.util.vector; public class TeamMember extends Colleague { // instance variables String name, meeting; Vector<String> meetings = new Vector<String>(); // a constructor public TeamMember(String aname) { name = aname; public void meeting(string atimeanddate) { meeting = atimeanddate; System.out.println("Generating a meeting " + atimeanddate + " by " + name); changed(); public String currentmeeting() { return meeting; public void newmeeting(string atimeanddate) { meetings.addelement(atimeanddate); System.out.println("Adding meeting " + atimeanddate + " for " + name); ========================================================================== --- TEAM MEMBERS --- John Denise Phoebe Isobel Andrew Ian --- MEETING CALLED --- Generating a meeting 9.00 am 10 Nov 2006 by Isobel --- MESSAGE DISSEMINATED --- Adding meeting 9.00 am 10 Nov 2006 for John Adding meeting 9.00 am 10 Nov 2006 for Denise Adding meeting 9.00 am 10 Nov 2006 for Phoebe Adding meeting 9.00 am 10 Nov 2006 for Andrew Adding meeting 9.00 am 10 Nov 2006 for Ian strona7/7