From cf7774be6a5f2f765c83e1b2c0bf3705071d9be8 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 17 Dec 2022 23:25:47 +0300 Subject: [PATCH] the door proxe --- .gitignore | 5 +- README.md | 1 + proxy/README.md | 12 ++++ proxy/thedoorproxy/dub.json | 8 +++ proxy/thedoorproxy/dub.selections.json | 5 ++ proxy/thedoorproxy/src/app.d | 80 ++++++++++++++++++++++++++ 6 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 proxy/README.md create mode 100644 proxy/thedoorproxy/dub.json create mode 100644 proxy/thedoorproxy/dub.selections.json create mode 100644 proxy/thedoorproxy/src/app.d diff --git a/.gitignore b/.gitignore index 7a1b276..dfd52c8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ -app -app.o +.vscode +.dub +bin diff --git a/README.md b/README.md index 948698d..cf77fc8 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ 2. [Адаптер](adapter/) 3. [Фасад](facade/) 4. [Компоновщик](composite/) +5. [Заместитель (Прокси)](proxy/) ### Пораждающие diff --git a/proxy/README.md b/proxy/README.md new file mode 100644 index 0000000..cdc9053 --- /dev/null +++ b/proxy/README.md @@ -0,0 +1,12 @@ +# Заместитель (Прокси) + +Структурный паттерн проектирования, который позволяет подставлять вместо реальных объектов специальные объекты-заменители. Эти объекты перехватывают вызовы к оригинальному объекту, позволяя сделать что-то до или после передачи вызова оригиналу. + +Паттерн **Заместитель** предоставляет суррогатный объект , управляющий доступом к другому объекту. + +Некоторые варианты управления доступом в заместителях: +- Удаленный заместитель управляет доступом к удаленному объекту +- Виртуальный заместитель управляет доступом к ресурсу, создание которого требует больших затрат ресурсов +- Защитный заместитель контролирует доступ к ресурсу в соответствии с системой привелегий + +Паттерн Заместитель существует во многих формах, но все они строятся на приблизительно похожей архитектуре опосредственного доступа. diff --git a/proxy/thedoorproxy/dub.json b/proxy/thedoorproxy/dub.json new file mode 100644 index 0000000..b92d3f7 --- /dev/null +++ b/proxy/thedoorproxy/dub.json @@ -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" +} diff --git a/proxy/thedoorproxy/dub.selections.json b/proxy/thedoorproxy/dub.selections.json new file mode 100644 index 0000000..322586b --- /dev/null +++ b/proxy/thedoorproxy/dub.selections.json @@ -0,0 +1,5 @@ +{ + "fileVersion": 1, + "versions": { + } +} diff --git a/proxy/thedoorproxy/src/app.d b/proxy/thedoorproxy/src/app.d new file mode 100644 index 0000000..6f47713 --- /dev/null +++ b/proxy/thedoorproxy/src/app.d @@ -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); +}