Անվան այլ կիրառումների համար տե՛ս՝ Ճակատ (այլ կիրառումներ)

**Ճակատ** (անգլ.՝ Decorator), կառուցվածքային նախագծման ձևանմուշ, որը թույլ է տալիս թաքցնել համակարգի բարդությունը բոլոր հնարավոր կանչերը տեղափոխելով մեկ օբյեկտի վրա, որն իր տակից կանչում է համակարգի համապատասխան օբյեկտին։

Ընդհանուր հասկացողություններ
----------------------------

* Client - հայցող
* Instance - նմուշ
* Implementation - իրականացում
* Product - արգասիք

Կիրառություն
------------

Ճակատ նախագծման ձևանմուծն օգտագործվում է, որպես պարզ և հեշտ ինտերֆեյս տրամադրեն հայցողին։ Բացի այդ ադապտերը կարելի է օգտագործել, երբ ծրագիրը պետք է ունենա որոշակի ինտերֆեյս և պետք է ունենա պոլիմորֆիկ վարքագիծ։ Դեկորատորը թույլ է տալիս փոփոխել ինտերֆեյսի վարքը ծրագրի իրականացման ժամանակ։

| 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

```

Ծանոթագրություններ
------------------

1. ↑  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=` (օգնություն)

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * դ
* ք
* խ
Նախագծման ձևանմուշներ |
| --- |
|  |
| ԳօՖիձևանմուշներ | 

|  |  |
| --- | --- |
| Ստեղծող | Աբստրակտ ֆաբրիկա* Կառուցող
* Ֆաբրիկային մեթոդ
* Նախատիպ
* Եզակի օգտագործման
 |
| Կառուցվածքային | Ադապտեր* Կամուրջ
* Կազմող
* Դեկորատոր
* Ճակատ
* Հարմարեցնող
* Պրոքսի
 |
| Վարքագծային | Պարտականությունների շղթա* Հրաման
* Թարգմանիչ
* Իտերատոր
* Միջնորդ
* Պահպանող
* Դիտորդ
* Վիճակ
* Մարտավարություն
* Կաղապարային մեթոդ
* Այցելող
 |

 |
|  |
| Ստեղծող ձևանմուշներ | 
* Ծույլ բեռնում
* Բազմակի օգտագործման
* Օբյեկտների ավազան
* Ռեսուրսի ստանալը ինիցիալիզացիա է

 |
|  |
| Կառուցվածքային ձևանմուշներ | Ճակատը հսկող
* Մոդուլ
 |
|  |
| Համաձայնեցման ձևանմուշներ | 
* Ակտիվ օբյեկտ
* Հենվող
* Մեկուսացում կրկնակի ստուգումով
* Ասինքրոն կանչի մեթոդ
* Պահպանվող կախոց
* Ռեգիստրացնող
* Կողպեքավորող
* Մոնիտոր
* Նախագործող
* Ապագործող
* Ընթերցողներ-գրողի կողպեք
* Պլանավորման
* Հոսքերի ավազանի
* Հոսքերի լոկալ հիշողություն

 |
|  |
| Ճարտարապետական ձևանմուշներ | 
* Ճակատը հսկող ձևանմուշ
* Զավթող ձևանմուշ
* ձևանմուշի ներկայացման վերահսկում
* Բազմաշերտ
* Հատկորոշում
* Հրատարակող-ստորագրող
* Մերկ օբյեկտներ
* Ծառայության լոկատոր
* Ակտիվ գրառման
* Բազմության իդենտիֆիկացման
* Data access object
* Data transfer object

 |
|  |
| Այլ ձևանմուշներ | 
* Կախվածության ներդնում
* Mock օբյեկտ
* Զրոյական օբյեկտ
* Ծառայող
* Թունելային տարատեսակի

 |

 |