1.需求:设计代理
设计代理替代追求者向被追求者送玩偶、送花、送巧克力。
分析:追求者类和代理类都应该拥有送礼物的接口,只不过代理类送的礼物实际是追求者送的
2.实现
(1)被追求者类
被追求者Schoolgirl类只有name这一成员变量,两个成员函数是设置name和获取name。
class Schoolgirl {
private:
string name;
public:
string getName()
{
return name;
}
void setName(string str)
{
name = str;
}
};
(2)送礼物类
如前分析所述,追求者类和代理类都应该拥有送礼物的接口,现由一个抽象类定义接口。三个纯虚函数用来送玩偶送花、送巧克力,由子类来实现
//抽象类:定义代理类和真正对象类的公共接口
class Givegift {
public:
virtual void giveFlowers() = 0;
virtual void giveChocolate() = 0;
virtual void giveDolls() = 0;
};
(3)追求者类
追求者类实际买的礼物,所以需要继承送礼物类并实现它
class Pursuit : public Givegift {
private:
Schoolgirl* mm;
public:
Pursuit(Schoolgirl* m) {
this->mm = m;
}
void giveFlowers()
{
cout << "给" << mm->getName()<<"Flowers" << endl;
}
void giveChocolate()
{
cout << "给" << mm->getName() << "Chocolate" << endl;
}
void giveDolls()
{
cout << "给" << mm->getName() << "Dolls" << endl;
}
};
(4)代理类
代理类也同样拥有送礼物的接口,但是实现方法却是调用追求者中相关方法。所以我们需要保存一个追求者的指针来代理相关的接口。
//代理类:保存指针来访问实体
class Proxy :public Givegift {
public:
Pursuit *gg;
Proxy(Schoolgirl* mm)
{
gg = new Pursuit(mm);
}
void giveDolls()
{
gg->giveDolls();
}
void giveFlowers()
{
gg->giveFlowers();
}
void giveChocolate()
{
gg->giveChocolate();
}
};
(5)main函数
在完成上述类的定义后,main函数需要构造被追求者、构造代理托管追求者实现要求功能
int main()
{
//定义被追求者娇娇
Schoolgirl *jiaojiao = new Schoolgirl();
jiaojiao->setName("娇娇");
//代理者daili,构造时也构造追求者
Proxy* daili = new Proxy(jiaojiao);
//实际调用追求者定义的接口
daili->giveChocolate();
daili->giveDolls();
daili->giveFlowers();
return 0;
}
输出如下:
3.总结
整个代理模式结构图如下
代理模式:为其他对象提供一种代理以控制对这个对象的访问。可以理解为访问对象引入了一定程度的间接性。
应用场景
-
远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
-
虚拟代理,是根据需要创建开销很大的对象。通过他来存放实例化需要很长时间的真实对象。例如:图片加载的时候。
-
安全代理,用来控制真是对象访问时的权限。
-
智能指引,是指当调用真实的对象的时候,代理处理另外一些事。
文章评论