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 ;
2
14
3
15
namespace RefactoringGuru . DesignPatterns . Facade . Conceptual
4
16
{
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
6
29
{
7
- static void Main ( string [ ] args )
8
- {
9
- Client client = new Client ( ) ;
30
+ protected Subsystem1 _subsystem1 ;
31
+
32
+ protected Subsystem2 _subsystem2 ;
10
33
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 ;
15
38
}
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 ( )
21
49
{
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 ;
23
57
}
24
58
}
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
+ // он не является частью Подсистемы.
26
67
public class Subsystem1
27
68
{
28
69
public string operation1 ( )
@@ -36,6 +77,9 @@ public string operationN()
36
77
}
37
78
}
38
79
80
+ // EN: Some facades can work with multiple subsystems at the same time.
81
+ //
82
+ // RU: Некоторые фасады могут работать с разными подсистемами одновременно.
39
83
public class Subsystem2
40
84
{
41
85
public string operation1 ( )
@@ -49,27 +93,44 @@ public string operationZ()
49
93
}
50
94
}
51
95
52
- public class Facade
53
- {
54
- Subsystem1 Subsystem1 ;
55
-
56
- Subsystem2 Subsystem2 ;
57
96
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 )
59
110
{
60
- this . Subsystem1 = s1 ;
61
- this . Subsystem2 = s2 ;
111
+ Console . Write ( facade . Operation ( ) ) ;
62
112
}
63
-
64
- public string Operation ( )
113
+ }
114
+
115
+ class Program
116
+ {
117
+ static void Main ( string [ ] args )
65
118
{
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 ) ;
73
134
}
74
135
}
75
136
}
0 commit comments