the door proxe
This commit is contained in:
parent
56c278cb44
commit
cf7774be6a
|
@ -1,2 +1,3 @@
|
|||
app
|
||||
app.o
|
||||
.vscode
|
||||
.dub
|
||||
bin
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
2. [Адаптер](adapter/)
|
||||
3. [Фасад](facade/)
|
||||
4. [Компоновщик](composite/)
|
||||
5. [Заместитель (Прокси)](proxy/)
|
||||
|
||||
### Пораждающие
|
||||
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
# Заместитель (Прокси)
|
||||
|
||||
Структурный паттерн проектирования, который позволяет подставлять вместо реальных объектов специальные объекты-заменители. Эти объекты перехватывают вызовы к оригинальному объекту, позволяя сделать что-то до или после передачи вызова оригиналу.
|
||||
|
||||
Паттерн **Заместитель** предоставляет суррогатный объект , управляющий доступом к другому объекту.
|
||||
|
||||
Некоторые варианты управления доступом в заместителях:
|
||||
- Удаленный заместитель управляет доступом к удаленному объекту
|
||||
- Виртуальный заместитель управляет доступом к ресурсу, создание которого требует больших затрат ресурсов
|
||||
- Защитный заместитель контролирует доступ к ресурсу в соответствии с системой привелегий
|
||||
|
||||
Паттерн Заместитель существует во многих формах, но все они строятся на приблизительно похожей архитектуре опосредственного доступа.
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"name": "thedoorproxy",
|
||||
"description": "The Proxy pattern. Opening and closing the door via password request",
|
||||
"authors": ["Alexander Zhirov"],
|
||||
"homepage": "https://zhirov.kz",
|
||||
"license": "GPL-2.0",
|
||||
"targetPath": "bin"
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"fileVersion": 1,
|
||||
"versions": {
|
||||
}
|
||||
}
|
|
@ -0,0 +1,80 @@
|
|||
import std.stdio : writeln, readln;
|
||||
|
||||
interface Door {
|
||||
void open();
|
||||
void close();
|
||||
bool getState();
|
||||
}
|
||||
|
||||
class MainDoor : Door {
|
||||
private:
|
||||
bool state = false;
|
||||
|
||||
public:
|
||||
override void open() {
|
||||
state = true;
|
||||
writeln("Open the door");
|
||||
}
|
||||
|
||||
override void close() {
|
||||
state = false;
|
||||
writeln("Close the door");
|
||||
}
|
||||
|
||||
bool getState() {
|
||||
return state;
|
||||
}
|
||||
}
|
||||
|
||||
class Security : Door {
|
||||
private:
|
||||
Door door;
|
||||
|
||||
bool authenticate() {
|
||||
string password;
|
||||
if ((password = readln) !is null) {
|
||||
return password == "please\n";
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public:
|
||||
this(Door door) {
|
||||
this.door = door;
|
||||
}
|
||||
|
||||
override void open() {
|
||||
if (authenticate()) {
|
||||
if (getState()) {
|
||||
writeln("The door is already open");
|
||||
return;
|
||||
}
|
||||
this.door.open();
|
||||
} else {
|
||||
writeln("Incorrect password");
|
||||
}
|
||||
}
|
||||
|
||||
override void close() {
|
||||
if (!getState()) {
|
||||
writeln("The door is already close");
|
||||
return;
|
||||
}
|
||||
this.door.close();
|
||||
}
|
||||
|
||||
bool getState() {
|
||||
return this.door.getState();
|
||||
}
|
||||
}
|
||||
|
||||
void playWithDoor(Door door) {
|
||||
door.open();
|
||||
door.close();
|
||||
}
|
||||
|
||||
void main() {
|
||||
Door door = new MainDoor();
|
||||
Door pDoor = new Security(door);
|
||||
|
||||
playWithDoor(pDoor);
|
||||
}
|
Loading…
Reference in New Issue