Ճակատ (նախագծման ձևանմուշ)
- Անվան այլ կիրառումների համար տե՛ս՝ Ճակատ (այլ կիրառումներ)
Ճակատ (անգլ.՝ Decorator), կառուցվածքային նախագծման ձևանմուշ, որը թույլ է տալիս թաքցնել համակարգի բարդությունը բոլոր հնարավոր կանչերը տեղափոխելով մեկ օբյեկտի վրա, որն իր տակից կանչում է համակարգի համապատասխան օբյեկտին։
Ճակատ | |
---|---|
Տեսակ | Կառուցվածքային |
Նշանակություն | Միասնական ինտերֆեյս ապահովելու համար ենթահամակարգի բոլոր նմուշների համար |
Նկարագրությունը ԳօՖի "Design Patterns" գրքում | Այո |
Ընդհանուր հասկացողություններ խմբագրել
- Client - հայցող
- Instance - նմուշ
- Implementation - իրականացում
- Product - արգասիք
Կիրառություն խմբագրել
Ճակատ նախագծման ձևանմուծն օգտագործվում է, որպես պարզ և հեշտ ինտերֆեյս տրամադրեն հայցողին[1]։ Բացի այդ ադապտերը կարելի է օգտագործել, երբ ծրագիրը պետք է ունենա որոշակի ինտերֆեյս և պետք է ունենա պոլիմորֆիկ վարքագիծ։ Դեկորատորը թույլ է տալիս փոփոխել ինտերֆեյսի վարքը ծրագրի իրականացման ժամանակ։
Pattern | Intent |
---|---|
Ադապտեր | Փոխակերպում է մեկ ինտերֆեյսը մեկ այլի՝ ինչ-որ ակնկալում է հայցողը |
Դեկորատոր | Դինամիկ կերպով պատասխանատվություն է ավելացնում ինտեֆեյսին բնօրինակ կոդի ծրարումով (անգլ.՝ wrap) |
Ճակատ | Տրամադրում է պարզեցված ինտերֆեյս |
Ճակատ նախագծման ձևանմուշը որպես կանոն օգտագործում են, երբ
- անհրաժեշտ է պարզ ինտերֆեյս բարդ համակարգի հետ աշխատելու համար
- ենթահամակարգի աբստրակցիան և իրականացումը սերտորեն կապված են
- պետք է մեկ կետ ծրագրի բոլոր մակարդակների համար
- համակարգը չափազանց բարդ է հասկանալու համար
UML դիագրամ խմբագրել
Օրինակներ խմբագրել
Բերվածը աբստրակտ օրինակ է, թե ինչպես է հայցողն առնչվում է բարդ համակարգի հետ։
C# խմբագրել
Իրականացում խմբագրել
namespace IVSR.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 SubsystemA a = new SubsystemA();
private SubsystemB b = new SubsystemB();
private SubsystemC c = new SubsystemC();
public void Operation1()
{
Console.WriteLine("Operation 1\n" +
a.OperationA1() +
a.OperationA2() +
b.OperationB1());
}
public void Operation2()
{
Console.WriteLine("Operation 2\n" +
b.OperationB2() +
c.OperationC1() +
c.OperationC2());
}
}
}
Պարզ կոդ խմբագրել
namespace IVSR.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 CarModel model;
private CarEngine engine;
private CarBody body;
private CarAccessories accessories;
public CarFacade()
{
model = new CarModel();
engine = new CarEngine();
body = new CarBody();
accessories = new CarAccessories();
}
public void CreateCompleteCar()
{
Console.WriteLine("******** Creating a Car **********\n");
model.SetModel();
engine.SetEngine();
body.SetBody();
accessories.SetAccessories();
Console.WriteLine("\n******** Car creation is completed**********");
}
}
// Facade Pattern Demo
class Program
{
static void Main(string[] args)
{
CarFacade facade = new CarFacade();
facade.CreateCompleteCar();
Console.ReadKey();
}
}
}
Java խմբագրել
/* Complex parts */
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) { ... }
}
/* Facade */
class ComputerFacade {
private CPU processor;
private Memory ram;
private HardDrive hd;
public ComputerFacade() {
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();
}
}
/* Client */
class You {
public static void main(String[] args) {
ComputerFacade computer = new ComputerFacade();
computer.start();
}
}
Ruby խմբագրել
# Complex Parts
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
# Facade
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
# Client
computer_facade = ComputerFacade.new
computer_facade.start
Ծանոթագրություններ խմբագրել
- ↑ Freeman, Eric; Freeman, Elisabeth; Kathy, Sierra; Bert, Bates (2004). Hendrickson, Mike; Loukides, Mike (eds.). «Head First Design Patterns» (paperback). 1. O'Reilly: 243, 252, 258, 260. ISBN 978-0-596-00712-6. Վերցված է 2012 թ․ հուլիսի 2-ին.
{{cite journal}}
: Cite journal requires|journal=
(օգնություն)