private static void TestBridgeAndDecoratorAndProxy() { var officeAddress = EmailAddressFactory.GetOfficeAddress(); //előre tudom, hogy hidat akarok használni, //leválasztom a konkrét megvalósítást a használattól //ez az adatok tárolásánál a repository minta //EZ HELYETT //var repo = new PersonRepository(); //EZ: Repo példányosítása DI framework-kel //https://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx //https://ayende.com/blog/2886/building-an-ioc-container-in-15-lines-of-code //http://kenegozi.com/blog/2008/01/17/its-my-turn-to-build-an-ioc-container-in-15-minutes-and-33-lines //http://blogs.clariusconsulting.net/kzu/funq-screencast-series-on-how-to-building-a-di-container-using-tdd/ //http://structuremap.github.io/quickstart/ //amit használunk, az a ninject: http://www.ninject.org/ var repo = kernel.Get <IPersonRepository>(); //csak példa, ilyeneket lehet csinálni a repoban, de most nem kell //var person = repo.Get(1); //var person = repo.Create(person); //var person = repo.Delete(person); //var person = repo.Update(person); var person = repo.GetBirthdayPersons(); var sendWith = AbstractSendWith.Factory <SendWith>(); var service = new EmailService(sendWith); //készítünk egy olyan szervizt, ami naplót is készít //ezt dekorátor mintával tudjuk megtenni, ha a szerviz kódját nem módosíthatjuk. //Akkor működik, ha a függvény, amit dekorálni akarok virtuális VAGY //akkor működik, ha a saját felületemet tudom használni var serviceWithLogger = new EmailServiceWithLogger(service, sendWith); //Ha az eredeti felületet kell használnom, ÉS nem virtuális az eredeti függvény, //akkor nem fogja meghívni semmi az én függvényemet, ez így sosem fog naplózni. //EmailService serviceWithLogger = new EmailServiceWithLogger(service, sendWith); //PROXY minta: ha a proxy osztály felületének a használatát ki lehet kényszeríteni. //egyéb nevek: Wrapper/burkoló var serviceProxy = new EmailServiceProxy(service, sendWith); //A proxy osztályt akkor használjuk, ha például // - a fejlesztéskor nem áll rendelkezésre a végleges megvalósítás // - hálózaton keresztül kapcsolódunk, és szeretnénk tesztet írni, // - jogosultságot implementálni // - cache-t implementálni. //Facade: amikor az eredeti osztály felülete nagyon bonyolult, akkor // egy egyszerű könnyebben felhasználható felületet adunk. // Például: // Sok komolyabb workflow-t implementáló WebAPI ad saját kliens könyvtárat. // Például: Paypal fizetés var message = EmailMessage.Factory ( from: officeAddress, to: person.EmailAddress, subject: "üdvözlet", message: "Boldog születésnapot" ); serviceWithLogger.Send(message); }
private static void TestBridgeDecoratorAndProxy() { var officeAddress = EmailAddressFactory.GetOfficeAddress(); //Elore tudom, hogy hidat akarok hasznalni, //levalasztom a konkret megvalositast a hasznalattol //ez az adatok tarolasanal a repository minta //E HELYETT //var repo = new PersonRepository(); //EZ LESZ: Repo peldanyositasa DI (Dependency Injection) frameworkkel //https://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx //Ninject-et hasznalunk: http://www.ninject.org var repo = kernel.Get <IPersonRepository>(); //Ezek csak peldak; ilyeneket lehetne csinalni egy repoban //var person = repo.Get(1); //var person = repo.Create(person); //var person = repo.Delete(person); //var person = repo.Update(person); var person = repo.GetBirthdayPersons(); //var sendWith = AbstractSendWith.Factory(SendWithTypes.SendWith); //statikus fgv-t keszitettunk var sendWith = AbstractSendWith.Factory <SendWith>(); var service = new EmailService(sendWith); //Fogadja a strategiat (a Send metodust) es meghivja //----------------------------------######## DEKORATOR #######--------------------------------------------------------------------- //keszitunk egy olyan szervizt, ami naplot is keszit //Ha a szerviz kodjat mar valamiert nem modosithatjuk (pl. regi kod kiegeszitese, vagy nem modosithato a forraskod), //akkor ezt ######## DEKORATOR ####### mintaval tudjuk megtenni //Keszitunk egy burkoloosztalyt, es dependency injection-el atadjuk neki az eredeti osztalyt. //Akkor mukodik, ha a EmailServiceWithLogger feluletet tudom hasznalni. //Vagy, ha a dekoralando fgv (Send) virtualis, es overridolni tudom a dekorator osztalyban. //EmailService serviceWithLogger = new EmailServiceWithLogger(service, sendWith);// --> Igy az ososztaly Send fuggvenyet fogja hivni, ha nincs virt/overr. var serviceWithLogger = new EmailServiceWithLogger(service, sendWith); //----------------------------------######### PROXY ############--------------------------------------------------------------------- //A proxy osztaly feluletenek hasznalatat ki lehet kenyszeriteni //A Decorator-hoz hasonloan ez is egy wrapper (beburkoljuk es meghivjuk az eredeti osztalyt, es annak mukodeset kiegeszitjuk) var serviceWithProxy = new EmailServiceWithProxy(service, sendWith); //A proxy osztalyt akkor hasznaljuk, ha pl.: // - a fejleszteskor nem all rendelkezesre a vegleges megvalositas // - halozaton keresztul kapcsolodunk, es szeretnenk tesztet irni, // - jogosultsagot implementalni, // - cache-t implementalni // ----------------------------------######### FACADE ############--------------------------------------------------------------------- //Amikor az eredeti osztaly felulete tul bonzolult, akkor helyette egy konnyebben felhasznalhato feluletet adunk. Pl.: // - Sok, komolyabb (sok lepesbol allo) workflow-t implementalo WebAPI as sajat klienskonyvtarat. Pl.: // - PayPal fizetes //--------------------------------------------------------------------------------------------------------------------------------------- var message = EmailMessage.Factory( officeAddress, person.EmailAddress, "Udvozlet", "Boldog szuletesnapot!"); //service.Send(message); serviceWithLogger.Send(message); }