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
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. 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
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
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
/* 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
# 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#
További példák C#-ban:
Absztrakt minta
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
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
További információk
Description from the Portland Pattern Repository
Fordítás
Kategória:Programtervezési minták Kategória:Java-kódpéldák