the door proxe
This commit is contained in:
parent
56c278cb44
commit
cf7774be6a
|
@ -1,2 +1,3 @@
|
||||||
app
|
.vscode
|
||||||
app.o
|
.dub
|
||||||
|
bin
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
2. [Адаптер](adapter/)
|
2. [Адаптер](adapter/)
|
||||||
3. [Фасад](facade/)
|
3. [Фасад](facade/)
|
||||||
4. [Компоновщик](composite/)
|
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