版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhao5502169/article/details/89463464
代理模式
定义:由于某些原因给某个对象提供一个代理以控制该对象的访问。
特点:(1)代理模式再客户端和目标对象之间起到一个中介的作用和保护目标对象的作用。(2)代理对象可以扩展目标对象的功能。(3)代理模式能将客户端和目标对象分离,一定程度上降低了系统的耦合度。
主要角色 Subject,ConcreteSubject,Proxy
具体应用的例子:比如你有一个生产玩偶的工厂,但你自己生产的不是很美观,你可以交给一家代理商来做。代理商可以更好的完成生产。或者如A想追求B,但A不认识B,但C认识B,A可以通过C来向A表达爱意。
Subject.h
#pragma once
class Subject {
public:
Subject();
virtual void Request() = 0;//执行的任务
~Subject();
};
ConcreteSubject.h
#pragma once
#include"Subject.h"
class ConcreteSubject :public Subject {
public:
ConcreteSubject();
~ConcreteSubject();
void Request();
};
Proxy.h
#pragma once
#include"Subject.h"
class Proxy :public Subject {
public:
Proxy(Subject* _sub);
~Proxy();
void Request();
void pre();//生产前的准备
void end();//生产后的工作
private:
Subject* sub;
};
Subject.cpp
#include"Subject.h"
#include<iostream>
using namespace std;
Subject::Subject(){
cout << "Subject" << endl;
}
Subject::~Subject(){
cout << "~Subject" << endl;
}
ConcreteSubject.cpp
#include"ConcreteSubject.h"
#include<iostream>
using namespace std;
ConcreteSubject::ConcreteSubject(){
cout << "ConcreteSubject" << endl;
}
ConcreteSubject::~ConcreteSubject(){
cout << "~ConcreteSubject" << endl;
}
void ConcreteSubject::Request() {
cout << "执行生产" << endl;
}
Proxy.cpp
#include "proxy.h"
#include<iostream>
using namespace std;
Proxy::Proxy(Subject* _sub)
{
this->sub = _sub;
}
Proxy::~Proxy() {
delete sub;
cout << "~Proxy" << endl;
}
void Proxy::pre() {
cout << "生产前工作" << endl;
}
void Proxy::end() {
cout << "生产后工作" << endl;
}
void Proxy::Request() {
this->pre();
this->sub->Request();
this->end();
}
main.cpp
#include"Subject.h"
#include"ConcreteSubject.h"
#include"proxy.h"
int main(void) {
Subject* ConcreteSub = new ConcreteSubject();
Proxy* pro = new Proxy(ConcreteSub);
pro->Request();
return 0;
}