代理
为其他对象提供一种代理以控制对这个对象的访问.
实例
main.cc:
#include "runner.h"
#include "runner_proxy.h"
#include <windows.h>
using namespace std;
/*
design_pattern:"proxy"
December 10, 2016, Xiamen marathon sudden death occurs, one of the players for the run
real runner:lin
proxy runner:wu
*/
int main(){
Runner *runner = new Runner("lin");
RunnerProxy *runner_proxy = new RunnerProxy("wu");
runner_proxy->SetRunner(runner);
runner_proxy->Run();
//clear
delete runner;
delete runner_proxy;
system("Pause");
return 0;
}
Person:
//person.h
#ifndef HELENDP_SOURCE_PERSON_H_
#define HELENDP_SOURCE_PERSON_H_
#include <string>
using namespace std;
class Person{
public:
Person(string name);
virtual ~Person();
virtual void Run();
string GetName();
private:
string name_;
};
#endif
//person.cc
#include "person.h"
Person::Person(string name){
name_ = name;
}
Person::~Person(){
}
void Person::Run(){
}
string Person::GetName(){
return name_;
}
Runner:
//runner.h
#ifndef HELENDP_SOURCE_RUNNER_H_
#define HELENDP_SOURCE_RUNNER_H_
#include "person.h"
class Runner : public Person{
public:
Runner(string name);
~Runner();
void Run();
};
#endif
//runner.cc
#include "runner.h"
#include <iostream>
using namespace std;
Runner::Runner(string name)
:Person(name){
}
Runner::~Runner(){
}
void Runner::Run(){
cout << this->GetName() << " " << "run in xiamen marathon" << endl;
}
RunnerProxy:
//runner_proxy.h
#ifndef HELENDP_SOURCE_RUNNER_PROXY_H_
#define HELENDP_SOURCE_RUNNER_PROXY_H_
#include "person.h"
#include "runner.h"
class RunnerProxy : public Person{
public:
RunnerProxy(string name);
~RunnerProxy();
void Run();
void SetRunner(Runner *runner);
private:
Runner *runner_;
};
#endif
//runner_proxy.cc
#include "runner_proxy.h"
#include <iostream>
using namespace std;
RunnerProxy::RunnerProxy(string name)
:Person(name){
}
RunnerProxy::~RunnerProxy(){
}
void RunnerProxy::SetRunner(Runner *runner){
runner_ = runner;
}
void RunnerProxy::Run(){
runner_->Run();
}
代码和UML图(EA)工程文件,最后会整理打包上传.
UML类图
结构
- Subject(Person):抽象类.
- Porxy(RunnerProxy):代理类.
- RealSubject(Runner):真实对象类.
优点
- 代理模式能够协调调用者和被调用者,在一定程度上降低了系 统的耦合度.
- 远程代理使得客户端可以访问在远程机器上的对象,远程机器 可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求.
- 虚拟代理通过使用一个小对象来代表一个大对象,可以减少系 统资源的消耗,对系统进行优化并提高运行速度.
- 保护代理可以控制对真实对象的使用权限.
缺点
- 由于在客户端和真实主题之间增加了代理对象,因此 有些类型的代理模式可能会造成请求的处理速度变慢.
- 实现代理模式需要额外的工作,有些代理模式的实现非常复杂.