Trick med facadeklasse og serialisering Trick model samles
- Slides: 7
Trick med facadeklasse og serialisering • ”Trick” – model ”samles” til eet overordnet objekt • Alle klasser i model skal have attriutten [Serializable] • Når det overordnede modelobjekt serialiseres vil alle de tilknyttede objekter og felter ”følge med” • Der laves en facadeklasse, der ”holder” det overordnede model objekt som en klasse-variabel • Facade-klassen tager sig af evt. indlæsning (load) af model objekt, samt forsynes også med metode for at gemme (save) model-objekt. Tietgen Skolen
Klasser defineres som Serializable For at objekter kan serialiseres skal klassen forsynes med attributten [Serializable] og alle objektets data skal ligeledes være serializable Klassen Vare: ……. [Serializable] public class Vare : System. IComparable { …………… Klassen Varekartotek: ……. [Serializable] public class Varekatalog { …………… Klassen Varesalg: ……. [Serializable] public class Varesalg { …………… Tietgen Skolen
Eksempel på Facade med serialisering using System; using System. Collections. Generic; using System. Text; using System. Windows. Forms; using System. IO; using System. Runtime. Serialization. Formatters. Binary; namespace Varekartotek. Windows. Application { public class Model. Fasade { // Bemærk at static betyder at felter og metoder er // er på klassen og der ikke laves objekter af typen // Model. Facade private static Varekatalog varekataloget; // klasse instans private static string DEFAULT_FILENAME = "Varekatalog. bin"; Tietgen Skolen
Eksempel på Facade med serialisering // klassemetode der kaldes direkte uden at have et objekt //. . . = Model. Facade. Varekataloget; public static Varekataloget { if (varekataloget == null) Load. Varekataloget(); // sikre load første gang // det bruges return varekataloget; // bemærk klasse instans } } Tietgen Skolen
Eksempel på Facade med serialisering private static void Load. Varekataloget() { // hent filnavn med "stifinder" facilitet // normalt bør det undgås at placere GUI her, // men det er en praktisk "beskidt" måde for os // at undgå øget kompleksitet / eller fast filnavn Open. File. Dialog open. File. Dialog = new Open. File. Dialog(); open. File. Dialog. File. Name = DEFAULT_FILENAME; // startværdi Dialog. Result dres = open. File. Dialog. Show. Dialog(); if (dres == Dialog. Result. Cancel) { varekataloget = new Varekatalog(); // opret tomt } else { string filnavn = open. File. Dialog. File. Name; File. Stream file. Stream = new File. Stream(filnavn, File. Mode. Open); Binary. Formatter binary. Formater = new Binary. Formatter(); // hent objekt og typecast til rigtig type varekataloget = (Varekatalog)binary. Formater. Deserialize(file. Stream); file. Stream. Close(); } } Tietgen Skolen
Eksempel på Facade med serialisering public static void Save. Varekataloget() { // hent filnavn med "stifinder" facilitet Save. File. Dialog save. File. Dialog = new Save. File. Dialog(); save. File. Dialog. File. Name = DEFAULT_FILENAME; // startværdi save. File. Dialog. Show. Dialog(); string filnavn = save. File. Dialog. File. Name; // Objektet med alle refererede elementer gemmes // serialiseret som fil File. Stream file. Stream = new File. Stream(filnavn, File. Mode. Create); Binary. Formatter binary. Formater = new Binary. Formatter(); binary. Formater. Serialize(file. Stream, varekataloget); file. Stream. Close(); } } } Tietgen Skolen
Tilgang til model gennem facade klassen Her eksempel på tilgang fra en funktionsklasse using System; using System. Collections. Generic; using System. Text; namespace Varekartotek. Windows. Application { public class Test. Funktioner { public static void Opret. Testvarer() { // hent varekatalog objekt // dette kunne også være overføret som parameter Varekatalog varekatalog = Model. Fasade. Varekataloget; // Brug objekt til at oprette test varer Vare vare 1001 = varekatalog. Opret. Vare(1001, "A 4 blok ternet med huller", 3. 98 f, "kasser", 3. 68 f, 100); Vare vare 1002 = varekatalog. Opret. Vare(1002, "A 4 blok linieret med huller", 3. 88 f, "boxe", 3. 65 f, 20); Vare vare 1003 = varekatalog. Opret. Vare(1003, "Blyant Viking 400 x 2", 0. 64 f, "æsker", 0. 50 f, 500); Vare vare 1004 = varekatalog. Opret. Vare(1004, "Blyant Viking 800 x 2", 0. 66 f, "æsker", 0. 55 f, 200); vare 1004. Registrer. Varer. Solgt(102); vare 1004. Registrer. Varer. Solgt(23); } } } Tietgen Skolen