天天看点

C++用纯虚函数实现协议托付的样例

  C++不像其它非常多编程语言有接口、托付或者协议的概念,可是利用纯虚函数和C++多重继承的特性,我们也能实现接口、托付或协议要做的事情,以下的通过一个人设置闹钟然后被闹钟唤醒的样例来说明怎样在C++中实现托付回调。

#include <iostream>
#include <unistd.h>

using std::cout;
using std::endl;

// 用纯虚函数设计一个协议
// 实现该协议的类有一个被唤醒的行为
class Awakable {
public:
    // 纯虚函数
    virtual void beAwaken() = 0;
};

// 闹钟类
class AlarmClock {
public:
    // 托付方(谁托付了闹钟提供唤醒服务)
    Awakable *delegate;
    // 在指定时间后报警
    void alarmAfter(int) const;
};

void AlarmClock::alarmAfter(int seconds) const {
    sleep(seconds);
    cout << "叮咚 叮咚 叮咚" << endl;
    // 回调托付方的方法
    delegate->beAwaken();
}

// 人类(实现了Awakable协议能够被唤醒)
class Person : public Awakable {
public:
    // 启动闹钟并指定唤醒时间
    void rollClock(int);
    // 协议中的被唤醒的行为
    void beAwaken();
};

void Person::rollClock(int seconds) {
    cout << "人设置了闹钟" << seconds << "秒后响铃" << endl;
    // 在栈上创建闹钟对象
    AlarmClock ac;
    // 设置托付方
    ac.delegate = this;
    ac.alarmAfter(seconds); 
}

void Person::beAwaken() {
    cout << "人被闹钟唤醒了" << endl;
}

int main(void) {
    // 在堆上创建人的对象
    Person *person = new Person;
    // 人启动闹钟设置5秒后被唤醒
    person->rollClock(5);
    // 释放指针指向的堆空间
    delete person;
    return 0;
}