《C++新经典设计模式》之第17章 中介者模式
中介者模式.cpp
#include #include #include using namespace std;namespace ns1{class CtlParent {protected:string m_caption; public:virtual ~CtlParent() {}CtlParent(const string &caption) : m_caption(caption) {}public: virtual void Changed(map<string, shared_ptr<CtlParent>> &tmpuictllist) = 0; virtual void Enable(bool sign) const = 0; };class Button : public CtlParent {public:Button(const string &caption) : CtlParent(caption) {}public:void Enable(bool sign) const override {if (sign)cout << "button \"" << m_caption << "\" enable" << endl;elsecout << "button \"" << m_caption << "\" disable" << endl;}void Changed(map<string, shared_ptr<CtlParent>> &tmpuictllist) override;};class RadioBtn : public CtlParent {public:RadioBtn(const string &caption) : CtlParent(caption) {}public:void Enable(bool sign) const override {} void Selected(bool sign) const{if (sign)cout << "radio button \"" << m_caption << "\" selected" << endl;elsecout << "radio button \"" << m_caption << "\" not selected" << endl;}void Changed(map<string, shared_ptr<CtlParent>> &tmpuictllist) override;};class EditCtl : public CtlParent {string m_content = ""; public:EditCtl(const string &caption) : CtlParent(caption) {}public:void Enable(bool sign) const override {if (sign)cout << "edit box \"" << m_caption << "\" enable" << endl;elsecout << "edit box \"" << m_caption << "\" disable" << endl;}bool isContentEmpty() const { return m_content.empty(); }void Changed(map<string, shared_ptr<CtlParent>> &tmpuictllist) override;};void Button::Changed(map<string, shared_ptr<CtlParent>> &tmpuictllist){if (m_caption == "sign in") cout << "Start the game login verification, and decide whether to enter the game or give a prompt according to the verification result!" << endl;else if (m_caption == "exit") cout << "Game exit, goodbye!" << endl;}void RadioBtn::Changed(map<string, shared_ptr<CtlParent>> &tmpuictllist){if (m_caption == "visitor login"){static_pointer_cast<RadioBtn>(tmpuictllist["visitor login"])->Selected(true);static_pointer_cast<RadioBtn>(tmpuictllist["account login"])->Selected(false); tmpuictllist["account"]->Enable(false);tmpuictllist["password"]->Enable(false); tmpuictllist["sign in"]->Enable(true); }else if (m_caption == "account login"){static_pointer_cast<RadioBtn>(tmpuictllist["visitor login"])->Selected(false); static_pointer_cast<RadioBtn>(tmpuictllist["account login"])->Selected(true);tmpuictllist["account"]->Enable(true);tmpuictllist["password"]->Enable(true); if (static_pointer_cast<EditCtl>(tmpuictllist["account"])->isContentEmpty() || static_pointer_cast<EditCtl>(tmpuictllist["password"])->isContentEmpty())tmpuictllist["sign in"]->Enable(false); elsetmpuictllist["sign in"]->Enable(true); }}void EditCtl::Changed(map<string, shared_ptr<CtlParent>> &tmpuictllist){if (static_pointer_cast<EditCtl>(tmpuictllist["account"])->isContentEmpty() || static_pointer_cast<EditCtl>(tmpuictllist["password"])->isContentEmpty())tmpuictllist["sign in"]->Enable(false); elsetmpuictllist["sign in"]->Enable(true); }}namespace ns2{class CtlParent; class Mediator {public:virtual ~Mediator() {}public:virtual void createCtrl() = 0; virtual void ctlChanged(CtlParent *const) = 0; };class CtlParent {protected:Mediator *m_pmediator; string m_caption;public:virtual ~CtlParent() {}CtlParent(Mediator *const ptmpm, const string &caption) : m_pmediator(ptmpm), m_caption(caption) {}public: virtual void Changed() { m_pmediator->ctlChanged(this); } virtual void Enable(bool sign) = 0; };class Button : public CtlParent {public:Button(Mediator *const ptmpm, const string &caption) : CtlParent(ptmpm, caption) {}void Enable(bool sign) override {if (sign == true)cout << "button \"" << m_caption << "\" enable" << endl;elsecout << "button \"" << m_caption << "\" disable" << endl;}};class RadioBtn : public CtlParent {public:RadioBtn(Mediator *const ptmpm, const string &caption) : CtlParent(ptmpm, caption) {}void Enable(bool sign) override {} void Selected(bool sign) {if (sign == true)cout << "radio button \"" << m_caption << "\" selected" << endl;elsecout << "radio button \"" << m_caption << "\" not selected" << endl;}};class EditCtl : public CtlParent {string m_content = ""; public:EditCtl(Mediator *const ptmpm, const string &caption) : CtlParent(ptmpm, caption) {}void Enable(bool sign) override {if (sign == true)cout << "edit box \"" << m_caption << "\" enable" << endl;elsecout << "edit box \"" << m_caption << "\" disable" << endl;}bool isContentEmpty() const { return m_content.empty(); } };class concrMediator : public Mediator {public: shared_ptr<Button> mp_login;shared_ptr<Button> mp_logout; shared_ptr<RadioBtn> mp_rbtn1; shared_ptr<RadioBtn> mp_rbtn2; shared_ptr<EditCtl> mp_edtctl1; shared_ptr<EditCtl> mp_edtctl2; public:void createCtrl() override {mp_login = make_shared<Button>(this, "sign in");mp_logout = make_shared<Button>(this, "exit");mp_rbtn1 = make_shared<RadioBtn>(this, "visitor login");mp_rbtn2 = make_shared<RadioBtn>(this, "account login");mp_edtctl1 = make_shared<EditCtl>(this, "account editing box");mp_edtctl2 = make_shared<EditCtl>(this, "password editing box");mp_rbtn1->Selected(true);mp_rbtn2->Selected(false); mp_edtctl1->Enable(false); mp_edtctl2->Enable(false); mp_login->Enable(true);mp_logout->Enable(true); }virtual void ctlChanged(CtlParent *const p_ctrl){if (p_ctrl == mp_login.get()) cout << "Start the game login verification, and decide whether to enter the game or give a prompt according to the verification result!" << endl;else if (p_ctrl == mp_logout.get())cout << "Game exit, goodbye!" << endl; if (p_ctrl == mp_rbtn1.get()) {mp_rbtn1->Selected(true);mp_rbtn2->Selected(false); mp_edtctl1->Enable(false); mp_edtctl2->Enable(false); mp_login->Enable(true); }else if (p_ctrl == mp_rbtn2.get()) {mp_rbtn1->Selected(false); mp_rbtn2->Selected(true);mp_edtctl1->Enable(true); mp_edtctl2->Enable(true); if (mp_edtctl1->isContentEmpty() || mp_edtctl2->isContentEmpty()) mp_login->Enable(false);elsemp_login->Enable(true); }if (p_ctrl == mp_edtctl1.get() || p_ctrl == mp_edtctl2.get()) if (mp_edtctl1->isContentEmpty() || mp_edtctl2->isContentEmpty()) mp_login->Enable(false);elsemp_login->Enable(true); }};}int main(){#if 0using namespace ns1;map<string, shared_ptr<CtlParent>> uictllist; uictllist["sign in"] = make_shared<Button>("sign in");uictllist["exit"] = make_shared<Button>("exit");uictllist["visitor login"] = make_shared<RadioBtn>("visitor login");uictllist["account login"] = make_shared<RadioBtn>("account login");uictllist["account"] = make_shared<EditCtl>("account");uictllist["password"] = make_shared<EditCtl>("password");static_pointer_cast<RadioBtn>(uictllist["visitor login"])->Selected(true);static_pointer_cast<RadioBtn>(uictllist["account login"])->Selected(false); uictllist["account"]->Enable(false);uictllist["password"]->Enable(false); uictllist["sign in"]->Enable(true); uictllist["exit"]->Enable(true);cout << "--------------------------" << endl;uictllist["account login"]->Changed(uictllist); #endif#if 1using namespace ns2;concrMediator mymedia;mymedia.createCtrl();cout << "-------------when \"account login\" radio button pressed:-------------" << endl;mymedia.mp_rbtn2->Changed();#endifcout << "Over!\n";return 0;}