Homlokzat programtervezési minta
A homlokzat programtervezési minta az objektumorientált programozásban egy gyakran használt programtervezési minta. Az elnevezés a építészetbeli homlokzat analógiáján alapul.
A homlokzat egy objektum, amely egy leegyszerűsített interfészt biztosít nagyobb kódrészhez, mint pl. egy osztálykönyvtár.
A homlokzat képes:
- egy szoftverkönyvtár használatát, megértését és tesztelését megkönnyíteni, habár a homlokzat kényelmes módszer általános feladatokra
- egy könyvtárat olvashatóbbá tenni, ugyanazon okok miatt
- csökkenteni a külső kód függőségeit a belső könyvtári munkáktól, habár a legtöbb kód használja a homlokzatot, amely nagyobb rugalmasságot biztosít a rendszer fejlesztésekor
- becsomagolja a gyengén tervezett APIk gyűjteményét egy leegyszerűsített jól tervezett API-ba (feladatonként szükséges módon)
Használata[szerkesztés]
A Homlokzatot akkor használják, amikor valaki egy könnyebb vagy leegyszerűsített interfészt szeretne egy alatta lévő megvalósítási objektumhoz.[1] Máskor az adapter használható, ha a becsomagolónak figyelnie kell egy kitüntetett interfészre, és támogatnia kell a többalakú viselkedést. A díszítő lehetővé teszi, hogy hozzáadjunk, vagy módosítsuk egy interfész viselkedését futás időben.
Minta | Leírás |
---|---|
Illesztő | Egy interfészt egy másikba konvertál, azért, hogy az megfeleljen az ügyfél elvárásainak |
Díszítő | Dinamikusan felelősségeket ad hozzá az interfészhez becsomagolva az eredeti kódot |
Homlokzat | Leegyszerűsített interfészt nyújt |
Homlokzatot használnak, ha:
- le kell egyszerűsíteni a hozzáférést egy komplex rendszerhez
- a rendszer nagyon bonyolult vagy nehezen elérhető
- a rétegzett szoftver minden egyes rétegéhez kell belépési pont
- az absztrakciók és az implementációk között törékeny összefüggés van
Struktúra[szerkesztés]
- Csomagok (angolul packages): Egymástól függetlenül tervezett programcsomagok, amiket egy egységes rendszerben kell használni.
- Homlokzat (angolul facade): A homlokzat osztály az 1-es, 2-es és 3-as csomagok egy absztrakcióját nyújtja, és elválasztja ezeket az alkalmazás többi részéből.
- Ügyfelek (angolul clients): Az objektumok a Homlokzat mintát használják az erőforrások a csomagokból való eléréséhez.
Példák[szerkesztés]
Absztrakt példa arra, hogy a kliens ("te") hogy tud használni egy homlokzat ("számítógép") segítségével egy bonyolult rendszert (belső számítógép részek, mint pl. a processzor v. a merevlemezek).
Java[szerkesztés]
/* Bonyolult részek */ class CPU { public void freeze() { ... } public void jump(long position) { ... } public void execute() { ... } } class Memory { public void load(long position, byte[] data) { ... } } class HardDrive { public byte[] read(long lba, int size) { ... } } /* Homlokzat */ class Computer { private CPU processor; private Memory ram; private HardDrive hd; public Computer() { this.processor = new CPU(); this.ram = new Memory(); this.hd = new HardDrive(); } public void start() { processor.freeze(); ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR, SECTOR_SIZE)); processor.jump(BOOT_ADDRESS); processor.execute(); } } /* Ügyfél */ class You { public static void main(String[] args) { Computer facade = new Computer(); facade.start(); } }
Ruby[szerkesztés]
# Bonyolult részek class CPU def freeze; end def jump(position); end def execute; end end class Memory def load(position, data); end end class HardDrive def read(lba, size); end end # Homlokzat class ComputerFacade def initialize @processor = CPU.new @ram = Memory.new @hd = HardDrive.new end def start @processor.freeze @ram.load(BOOT_ADDRESS, @hd.read(BOOT_SECTOR, SECTOR_SIZE)) @processor.jump(BOOT_ADDRESS) @processor.execute end end # Kliens computer_facade = ComputerFacade.new computer_facade.start
C#[szerkesztés]
További példák C#-ban:
Absztrakt minta[szerkesztés]
namespace DesignPattern.Facade { class SubsystemA { public string OperationA1() { return "Subsystem A, Method A1\n"; } public string OperationA2() { return "Subsystem A, Method A2\n"; } } class SubsystemB { public string OperationB1() { return "Subsystem B, Method B1\n"; } public string OperationB2() { return "Subsystem B, Method B2\n"; } } class SubsystemC { public string OperationC1() { return "Subsystem C, Method C1\n"; } public string OperationC2() { return "Subsystem C, Method C2\n"; } } public class Facade { private readonly SubsystemA a = new SubsystemA(); private readonly SubsystemB b = new SubsystemB(); private readonly SubsystemC c = new SubsystemC(); public void Operation1() { Console.WriteLine("Operation 1\n" + a.OperationA1() + b.OperationB1() + c.OperationC1()); } public void Operation2() { Console.WriteLine("Operation 2\n" + a.OperationA2() + b.OperationB2() + c.OperationC2()); } } }
Példa kód[szerkesztés]
namespace DesignPattern.Facade.Sample { // The 'Subsystem ClassA' class class CarModel { public void SetModel() { Console.WriteLine(" CarModel - SetModel"); } } /// <summary> /// The 'Subsystem ClassB' class /// </summary> class CarEngine { public void SetEngine() { Console.WriteLine(" CarEngine - SetEngine"); } } // The 'Subsystem ClassC' class class CarBody { public void SetBody() { Console.WriteLine(" CarBody - SetBody"); } } // The 'Subsystem ClassD' class class CarAccessories { public void SetAccessories() { Console.WriteLine(" CarAccessories - SetAccessories"); } } // The 'Facade' class public class CarFacade { private readonly CarAccessories accessories; private readonly CarBody body; private readonly CarEngine engine; private readonly CarModel model; public CarFacade() { accessories = new CarAccessories(); body = new CarBody(); engine = new CarEngine(); model = new CarModel(); } public void CreateCompleteCar() { Console.WriteLine("******** Creating a Car **********"); model.SetModel(); engine.SetEngine(); body.SetBody(); accessories.SetAccessories(); Console.WriteLine("******** Car creation is completed. **********"); } } // Facade pattern demo class Program { static void Main(string[] args) { var facade = new CarFacade(); facade.CreateCompleteCar(); Console.ReadKey(); } } }
Jegyzetek[szerkesztés]
- ↑ (2004) „Head First Design Patterns” (paperback) 1, 243, 252, 258, 260. o, Kiadó: O'Reilly. (Hozzáférés: 2012. július 2.)
További információk[szerkesztés]
Fordítás[szerkesztés]
Ez a szócikk részben vagy egészben a Facade pattern című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.