代理模式
定義:由於某些原因給某個對象提供一個代理以控制該對象的訪問。
特點:(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;
}