标签:
27.1 代理模式 VS 装饰模式
27.1.1 代理模式
(1)场景:客人找运动员代理要求安排运动员参加比赛
(2)说明:代理人有控制权,可以拒绝客人的要求,也可以答应安排,甚至自己下去跑(因为有些运动员本身就作自己的代理)
【编程实验】找代理安排运动员比赛
//创建型模式大PK——代理模式和装饰模式 //实例:找代理安排运动员比赛 #include <iostream> #include <ctime> using namespace std; //抽象运动员 class IRunner { public: virtual void run() = 0; virtual ~IRunner() {} }; //运动员 class Runner : public IRunner { public: void run() { cout << "运动员跑步,动作很潇洒" << endl; } }; //代理人(也与运动员一样,实现同一接口) class RunnerAgent : public IRunner { Runner* runner; public: RunnerAgent(Runner* runner) { srand((int)time(NULL)); this->runner = runner; } void run() { if((rand() % 2) ==0) { cout << "代理人同意安排运动员跑步" << endl; runner->run(); } else { cout << "代理人心情不好,不安排运动员跑步" << endl; } } }; int main() { //定义一个运动员 Runner* runner = new Runner(); //定义代理人 IRunner* agent = new RunnerAgent(runner); //要求运动员跑步 cout << "===客人找到代理要求运动员去跑步" << endl; //为演示,比如洽谈了10次 for(int i=0; i<10; i++) { cout <<"第" <<i+1 <<"次洽谈结果:"; agent->run(); cout << endl; } delete runner; delete agent; return 0; };
27.1.2 装饰模式
(1)装饰模式:对类的功能进行加强
【编程实验】安装喷气装置
//创建型模式大PK——代理模式和装饰模式 //实例:为飞机安装喷气动力装置 #include <iostream> #include <ctime> using namespace std; //飞行接口 class IFly { public: virtual void fly() = 0; virtual ~IFly() {} }; //飞机 class AirPlane : public IFly { public: void fly() { cout << "飞机正在飞行..." << endl; } }; //JetFly class JetFly : public IFly { IFly* airPlane; public: JetFly(IFly* airPlane) { this->airPlane = airPlane; } void speedUp() { cout << "为飞机加装了喷气动力装置,正在加速中..." << endl; } void fly() { speedUp(); airPlane->fly(); } }; int main() { //定义一架飞机 IFly* airPlane = new AirPlane(); //定义装饰类,对功能进行加强 IFly* jet = new JetFly(airPlane); cout << "===增加功能后的飞机" << endl; jet->fly(); delete jet; delete airPlane; return 0; };
27.1.3 最佳实践
(1)装饰类对被装饰的类的行为没有决定权,只有增强作用。而代理可以控制对被代理人的访问。
(2)代理模式是把当前的行为或功能委托给其他对象执行,代理类负责接口限定(如是否可以调用真实角色,一般不对被代理功能当修饰,而是保证原汁原叶的调用。
(3)装饰模式在保证接口不变的情况下加强类的功能,它保证的是被修饰对象功能比原来丰富(当然也可以减弱),但不做准入条件和准入参数的过滤。
标签:
原文地址:http://www.cnblogs.com/5iedu/p/5655921.html