the door proxe

This commit is contained in:
Alexander Zhirov 2022-12-17 23:25:47 +03:00
parent 56c278cb44
commit cf7774be6a
6 changed files with 109 additions and 2 deletions

5
.gitignore vendored
View File

@ -1,2 +1,3 @@
app
app.o
.vscode
.dub
bin

View File

@ -19,6 +19,7 @@
2. [Адаптер](adapter/)
3. [Фасад](facade/)
4. [Компоновщик](composite/)
5. [Заместитель (Прокси)](proxy/)
### Пораждающие

12
proxy/README.md Normal file
View File

@ -0,0 +1,12 @@
# Заместитель (Прокси)
Структурный паттерн проектирования, который позволяет подставлять вместо реальных объектов специальные объекты-заменители. Эти объекты перехватывают вызовы к оригинальному объекту, позволяя сделать что-то до или после передачи вызова оригиналу.
Паттерн **Заместитель** предоставляет суррогатный объект , управляющий доступом к другому объекту.
Некоторые варианты управления доступом в заместителях:
- Удаленный заместитель управляет доступом к удаленному объекту
- Виртуальный заместитель управляет доступом к ресурсу, создание которого требует больших затрат ресурсов
- Защитный заместитель контролирует доступ к ресурсу в соответствии с системой привелегий
Паттерн Заместитель существует во многих формах, но все они строятся на приблизительно похожей архитектуре опосредственного доступа.

View File

@ -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"
}

View File

@ -0,0 +1,5 @@
{
"fileVersion": 1,
"versions": {
}
}

View File

@ -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);
}