
- •Цель работы: Применение паттерна проектирования Proxy (заместитель, surrogate, суррогат)
- •Структура паттерна Proxy
- •Пример паттерна Proxy
- •Использование паттерна Proxy
- •Особенности паттерна Proxy
- •Реализация паттерна Proxy – примеры кода.
- •Паттерн Proxy: защитный proxy контролирует доступ к основному объекту
- •4. Задание
- •5. Требования к отчету
Паттерн Proxy: защитный proxy контролирует доступ к основному объекту
class Person { string nameString; static string list[]; static int next; public: Person() { nameString = list[next++]; } string name() { return nameString; } }; string Person::list[] = { "Tom", "Dick", "Harry", "Bubba" }; int Person::next = 0;
class PettyCashProtected { int balance; public: PettyCashProtected() { balance = 500; } bool withdraw(int amount) { if (amount > balance) return false; balance -= amount; return true; } int getBalance() { return balance; } };
class PettyCash { PettyCashProtected realThing; public: bool withdraw(Person &p, int amount) { if (p.name() == "Tom" || p.name() == "Harry" || p.name() == "Bubba") return realThing.withdraw(amount); else return false; } int getBalance() { return realThing.getBalance(); } };
int main() { PettyCash pc; Person workers[4]; for (int i = 0, amount = 100; i < 4; i++, amount += 100) if (!pc.withdraw(workers[i], amount)) cout << "No money for " << workers[i].name() << '\n'; else cout << amount << " dollars for " << workers[i].name() << '\n'; cout << "Remaining balance is " << pc.getBalance() << '\n'; } |
Вывод программы:
1 2 3 4 5 |
100 dollars for Tom No money for Dick 300 dollars for Harry No money for Bubba Remaining balance is 100 |
Вывод программы:
Паттерн Proxy: операторы "->" and "." дают различные результаты
class Subject { public: virtual void execute() = 0; };
class RealSubject: public Subject { string str; public: RealSubject(string s) { str = s; } /*virtual*/void execute() { cout << str << '\n'; } };
class ProxySubject: public Subject { string first, second, third; RealSubject *ptr; public: ProxySubject(string s) { int num = s.find_first_of(' '); first = s.substr(0, num); s = s.substr(num + 1); num = s.find_first_of(' '); second = s.substr(0, num); s = s.substr(num + 1); num = s.find_first_of(' '); third = s.substr(0, num); s = s.substr(num + 1); ptr = new RealSubject(s); } ~ProxySubject() { delete ptr; } RealSubject *operator->() { cout << first << ' ' << second << ' '; return ptr; } /*virtual*/void execute() { cout << first << ' ' << third << ' '; ptr->execute(); } };
int main() { ProxySubject obj(string("the quick brown fox jumped over the dog")); obj->execute(); obj.execute(); } |
Вывод программы:
1 2 |
the quick fox jumped over the dog the brown fox jumped over the dog |