#include <iostream>
#include <string>
#include <memory>
using namespace std;
class AbstractMember; // 前向声明
// 行为基类
class AbstractAction {
public:
virtual void maleDoing(AbstractMember* member) = 0;
virtual void femaleDoing(AbstractMember* member) = 0;
virtual ~AbstractAction() {}
};
class Anger : public AbstractAction {
public:
void fight() {
cout << "I want to fight" << endl;
}
void warning() {
cout << "I am warning" << endl;
}
void maleDoing(AbstractMember* member) override;
void femaleDoing(AbstractMember* member) override;
};
class Horror : public AbstractAction {
public:
void help() {
cout << "I need help" << endl;
}
void think() {
cout << "I am thinking" << endl;
}
void maleDoing(AbstractMember* member) override;
void femaleDoing(AbstractMember* member) override;
};
// 抽象成员基类
class AbstractMember {
public:
virtual void accept(AbstractAction* action) = 0;
virtual ~AbstractMember() {}
AbstractMember(string name) : mName(name) {}
string getName() {
return mName;
}
protected:
string mName;
};
class maleMember : public AbstractMember {
public:
using AbstractMember::AbstractMember;
void accept(AbstractAction* action) override {
action->maleDoing(this);
}
};
class femaleMember : public AbstractMember {
public:
using AbstractMember::AbstractMember;
void accept(AbstractAction* action) override {
action->femaleDoing(this);
}
};
// Anger and Horror methods implementation
void Anger::maleDoing(AbstractMember* member) {
cout << "I am " << member->getName() << endl;
fight();
}
void Anger::femaleDoing(AbstractMember* member) {
cout << "I am " << member->getName() << endl;
warning();
}
void Horror::maleDoing(AbstractMember* member) {
cout << "I am " << member->getName() << endl;
think();
}
void Horror::femaleDoing(AbstractMember* member) {
cout << "I am " << member->getName() << endl;
help();
}
int main() {
unique_ptr<AbstractMember> maleAnger = make_unique<maleMember>("Luffy");
unique_ptr<AbstractAction> angerAction = make_unique<Anger>();
maleAnger->accept(angerAction.get());
unique_ptr<AbstractMember> maleHorror = make_unique<maleMember>("Zoro");
unique_ptr<AbstractAction> horrorAction = make_unique<Horror>();
maleHorror->accept(horrorAction.get());
unique_ptr<AbstractMember> femaleAnger = make_unique<femaleMember>("Nami");
femaleAnger->accept(angerAction.get());
unique_ptr<AbstractMember> femaleHorro = make_unique<femaleMember>("luobi");
femaleHorro->accept(horrorAction.get());
}