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.