大话设计模式4-代理模式

    科技2025-11-12  8

    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.总结

    整个代理模式结构图如下 代理模式:为其他对象提供一种代理以控制对这个对象的访问。可以理解为访问对象引入了一定程度的间接性。 应用场景

    远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

    虚拟代理,是根据需要创建开销很大的对象。通过他来存放实例化需要很长时间的真实对象。例如:图片加载的时候。

    安全代理,用来控制真是对象访问时的权限。

    智能指引,是指当调用真实的对象的时候,代理处理另外一些事。

    Processed: 0.014, SQL: 8