命令模式应用

本文介绍了命令模式在医疗场景中的应用,通过Command类封装医生的治疗行为,如治疗眼睛和鼻子。Nurse类可以接收并执行Command对象,AdvNurse类则能处理多个Command,实现请求的排队和记录。这使得系统更易于管理和扩展。
摘要由CSDN通过智能技术生成

命令模式:通过被称为Command 的类封装了对目标对象的调用行为以及调用参数。
在面向对象的程序设计中,一个对象调用另一个对象,一般情况下的调用过程是:创建目标对象实例;设置调用参数;调用目标对象的方法。但在有些情况下有必要使用一个专门的类对这种调用过程加以封装,我们把这种专门的类称作 command 类。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
命令模式:是将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

class Doctor {
public:
    void treat_Eye() {
        cout << "doctor treat eye---------" << endl;
    }
    void treat_Nose() {
        cout << "doctor treat nose---------" << endl;
    }
};
class Command {
public:
    virtual void treat() = 0;
};
class CommandTreatEye:public Command{
public:
    CommandTreatEye(Doctor* doctor) {
        m_doctor = doctor;
    }
    void treat() {
        m_doctor->treat_Eye();
    }
private:
    Doctor* m_doctor;
};
class CommandTreatNose :public Command {
public:
    CommandTreatNose(Doctor* doctor) {
        m_doctor = doctor;
    }
    void treat() {
        m_doctor->treat_Nose();
    }
private:
    Doctor* m_doctor;
};
class Nurse {
public:
    Nurse(Command* com) {
        m_command = com;
    }
    void submittedCase() {
        m_command->treat();
    }
private:
    Command* m_command;
};
class AdvNurse {
public:
    AdvNurse() {
        m_list.clear();
    }
    void setCommand(Command* com) {
        m_list.push_back(com);
    }
    void submittedCase() {
        list<Command*>::iterator it;
        for (it = m_list.begin(); it != m_list.end(); it++) {
            (*it)->treat();
        }
    }
private:
    list<Command*> m_list;
};
void testMethod1() {
    Doctor* doc = new Doctor;
    Command* com = new CommandTreatEye(doc);
    com->treat();
    delete com;
    delete doc;
}
void testMethod2() {
    Doctor* doc = new Doctor;
    Command* com = new CommandTreatEye(doc);
    Nurse* nurse = new Nurse(com);
    nurse->submittedCase();
    delete nurse;
    delete com;
    delete doc;
}
void testMethod3() {
    Doctor* doc = new Doctor;
    Command* com1 = new CommandTreatEye(doc);
    Command* com2 = new CommandTreatNose(doc);
    AdvNurse* anurse = new AdvNurse();
    anurse->setCommand(com1);
    anurse->setCommand(com2);
    anurse->submittedCase();
    delete anurse;
    delete com2;
    delete com1;
    delete doc;
}
int main()
{
    //testMethod1();
    //testMethod2();
    testMethod3();
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值