码迷,mamicode.com
首页 > 其他好文 > 详细

第27章 结构型模式大PK

时间:2016-07-09 16:29:02      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

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;
};
View Code

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;
};
View Code

27.1.3 最佳实践

(1)装饰类对被装饰的类的行为没有决定权,只有增强作用。而代理可以控制对被代理人的访问。

(2)代理模式是把当前的行为或功能委托给其他对象执行,代理类负责接口限定(如是否可以调用真实角色,一般不对被代理功能当修饰,而是保证原汁原叶的调用

(3)装饰模式在保证接口不变的情况下加强类的功能,它保证的是被修饰对象功能比原来丰富(当然也可以减弱),但不做准入条件和准入参数的过滤

第27章 结构型模式大PK

标签:

原文地址:http://www.cnblogs.com/5iedu/p/5655921.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!