Skip to content

Commit 7922ecf

Browse files
committed
Facade: improve conceptual example
1 parent f27076b commit 7922ecf

File tree

1 file changed

+94
-33
lines changed

1 file changed

+94
-33
lines changed

Facade.Conceptual/Program.cs

Lines changed: 94 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,69 @@
1-
using System;
1+
// EN: Facade Design Pattern
2+
//
3+
// Intent: Provide a unified interface to a number of classes/interfaces of a
4+
// complex subsystem. The Facade pattern defines a higher-level interface that
5+
// makes the subsystem easier to use.
6+
//
7+
// RU: Паттерн Фасад
8+
//
9+
// Назначение: Предоставляет единый интерфейс к ряду классов/интерфейсов сложной
10+
// подсистемы. Паттерн Фасад определяет интерфейс более высокого уровня, который
11+
// упрощает использование подсистемы.
12+
13+
using System;
214

315
namespace RefactoringGuru.DesignPatterns.Facade.Conceptual
416
{
5-
class Program
17+
// EN: The Facade class provides a simple interface to the complex logic of
18+
// one or several subsystems. The Facade delegates the client requests to
19+
// the appropriate objects within the subsystem. The Facade is also
20+
// responsible for managing their lifecycle. All of this shields the client
21+
// from the undesired complexity of the subsystem.
22+
//
23+
// RU: Класс Фасада предоставляет простой интерфейс для сложной логики одной
24+
// или нескольких подсистем. Фасад делегирует запросы клиентов
25+
// соответствующим объектам внутри подсистемы. Фасад также отвечает за
26+
// управление их жизненным циклом. Все это защищает клиента от нежелательной
27+
// сложности подсистемы.
28+
public class Facade
629
{
7-
static void Main(string[] args)
8-
{
9-
Client client = new Client();
30+
protected Subsystem1 _subsystem1;
31+
32+
protected Subsystem2 _subsystem2;
1033

11-
Subsystem1 s1 = new Subsystem1();
12-
Subsystem2 s2 = new Subsystem2();
13-
Facade facade = new Facade(s1, s2);
14-
client.ClientCode(facade);
34+
public Facade(Subsystem1 subsystem1, Subsystem2 subsystem2)
35+
{
36+
this._subsystem1 = subsystem1;
37+
this._subsystem2 = subsystem2;
1538
}
16-
}
17-
18-
class Client
19-
{
20-
internal void ClientCode(Facade facade)
39+
40+
//
41+
// EN: The Facade's methods are convenient shortcuts to the sophisticated
42+
// functionality of the subsystems. However, clients get only to a fraction
43+
// of a subsystem's capabilities.
44+
//
45+
// RU: Методы Фасада удобны для быстрого доступа к сложной функциональности
46+
// подсистем. Однако клиенты получают только часть возможностей подсистемы.
47+
///
48+
public string Operation()
2149
{
22-
Console.WriteLine(facade.Operation());
50+
string result = "Facade initializes subsystems:\n";
51+
result += this._subsystem1.operation1();
52+
result += this._subsystem2.operation1();
53+
result += "Facade orders subsystems to perform the action:\n";
54+
result += this._subsystem1.operationN();
55+
result += this._subsystem2.operationZ();
56+
return result;
2357
}
2458
}
25-
59+
60+
// EN: The Subsystem can accept requests either from the facade or client
61+
// directly. In any case, to the Subsystem, the Facade is yet another
62+
// client, and it's not a part of the Subsystem.
63+
//
64+
// RU: Подсистема может принимать запросы либо от фасада, либо от клиента
65+
// напрямую. В любом случае, для Подсистемы Фасад – это еще один клиент, и
66+
// он не является частью Подсистемы.
2667
public class Subsystem1
2768
{
2869
public string operation1()
@@ -36,6 +77,9 @@ public string operationN()
3677
}
3778
}
3879

80+
// EN: Some facades can work with multiple subsystems at the same time.
81+
//
82+
// RU: Некоторые фасады могут работать с разными подсистемами одновременно.
3983
public class Subsystem2
4084
{
4185
public string operation1()
@@ -49,27 +93,44 @@ public string operationZ()
4993
}
5094
}
5195

52-
public class Facade
53-
{
54-
Subsystem1 Subsystem1;
55-
56-
Subsystem2 Subsystem2;
5796

58-
public Facade(Subsystem1 s1, Subsystem2 s2)
97+
class Client
98+
{
99+
// EN: The client code works with complex subsystems through a simple
100+
// interface provided by the Facade. When a facade manages the lifecycle
101+
// of the subsystem, the client might not even know about the existence
102+
// of the subsystem. This approach lets you keep the complexity under
103+
// control.
104+
//
105+
// RU: Клиентский код работает со сложными подсистемами через простой
106+
// интерфейс, предоставляемый Фасадом. Когда фасад управляет жизненным
107+
// циклом подсистемы, клиент может даже не знать о существовании
108+
// подсистемы. Такой подход позволяет держать сложность под контролем.
109+
public void ClientCode(Facade facade)
59110
{
60-
this.Subsystem1 = s1;
61-
this.Subsystem2 = s2;
111+
Console.Write(facade.Operation());
62112
}
63-
64-
public string Operation()
113+
}
114+
115+
class Program
116+
{
117+
static void Main(string[] args)
65118
{
66-
string result = "Facade initializes subsystems:\n";
67-
result += Subsystem1.operation1();
68-
result += Subsystem2.operation1();
69-
result += "Facade orders subsystems to perform the action:\n";
70-
result += Subsystem1.operationN();
71-
result += Subsystem2.operationZ();
72-
return result;
119+
Client client = new Client();
120+
121+
// EN: The client code may have some of the subsystem's objects
122+
// already created. In this case, it might be worthwhile to
123+
// initialize the Facade with these objects instead of letting the
124+
// Facade create new instances.
125+
//
126+
// RU: В клиентском коде могут быть уже созданы некоторые объекты
127+
// подсистемы. В этом случае может оказаться целесообразным
128+
// инициализировать Фасад с этими объектами вместо того, чтобы
129+
// позволить Фасаду создавать новые экземпляры.
130+
Subsystem1 subsystem1 = new Subsystem1();
131+
Subsystem2 subsystem2 = new Subsystem2();
132+
Facade facade = new Facade(subsystem1, subsystem2);
133+
client.ClientCode(facade);
73134
}
74135
}
75136
}

0 commit comments

Comments
 (0)