1. 程式人生 > >C++重寫《大話設計模式》中模式例項六(代理模式)

C++重寫《大話設計模式》中模式例項六(代理模式)

(宣告:如果想看例項詳細解析,請看《大話設計模式》,這裡文章只是為了加深學習設計模式印象而自己用C++程式寫一遍,以及把程式碼共享給大家。僅僅是把C#語言換成C++表述,不對書中的程式和例子是否合適做個人表述。)

使用代理模式可以避免外部程式直接訪問被代理類,以及減輕代理類的負擔。比如被代理類是一個檔案讀寫類,它在不停地進行檔案讀寫,代理類可以把被代理類讀寫的內容快取。這樣外部的程式想要讀寫檔案可以訪問代理類,而不用直接訪問檔案讀寫類,這樣減輕了檔案讀寫類的負擔,也提高了檔案讀寫的效率。

UML:

SchoolGirl.h

#pragma once
#include<iostream>

class SchoolGirl {
private:
	char* name;
public:
	SchoolGirl(char* name) {
		this->name = name;
	}
	char* GetName() {
		return name;
	}
};

Proxy.h 

#pragma once
#include <iostream>
#include "SchoolGirl.h"

class IGiveGift {
	virtual void GiveDolls() = 0;
	virtual void GiveFlowers() = 0;
	virtual void GiveChocolate() = 0;
};
//追求者類
class Pursuit :public IGiveGift {
private:
	SchoolGirl* mm;
public:
	Pursuit(SchoolGirl* mm) {
		this->mm = mm;
	}
	~Pursuit() {
		delete mm;
	}
	virtual void GiveDolls() {
		std::cout << mm->GetName() << ",送你洋娃娃" << std::endl;
	}
	virtual void GiveFlowers() {
		std::cout << mm->GetName() << ",送你鮮花" << std::endl;
	}
	virtual void GiveChocolate() {
		std::cout << mm->GetName() << ",送你巧克力" << std::endl;
	}
};

class Proxy :public IGiveGift {
private:
	Pursuit* gg;
public:
	Proxy(SchoolGirl* mm) {
		gg = new Pursuit(mm);
	}
	~Proxy() { delete gg; }
	virtual void GiveDolls() { gg->GiveDolls(); }
	virtual void GiveFlowers() { gg->GiveFlowers(); }
	virtual void GiveChocolate() { gg->GiveChocolate(); }
};

main.cpp

#include "Proxy.h"
#include <cstdlib>

int main() {
	SchoolGirl* jiaojiao = new SchoolGirl("李嬌嬌");
	Proxy* daili = new Proxy(jiaojiao);
	daili->GiveDolls();
	daili->GiveFlowers();
	daili->GiveChocolate();
	delete daili;
	system("pause");
	return 0;
}

執行結果: