#include <iostream>
#include <string>
#include <list>
using namespace std;
class Observer {   //抽象类
public:
    virtual void update(string message) = 0;   //更新行为,纯虚函数
};

class WeixinUser : public Observer
{
private:
    string name;   // 微信用户名
public:
    WeixinUser(string name) {
        this->name = name;
    }
    virtual void update(string message) {
        cout << endl << (name + " knows " + message);
        this->doSomething();
    }
    virtual void doSomething()
    {
        cout << endl << name << " is very happy";
    }
};

class ReporterUser : public Observer
{
private:
    string name;  // 微信用户名
public:
    ReporterUser(string name) {
        this->name = name;
    }
public:
    virtual void update(string message)
    {
        cout << endl << (name + " knows " + message);
        this->doSomething();
    }
    void doSomething()
    {
        cout << endl << name << " is going to write a report";
    }
};

class  Subject {     //抽象类
public:
    virtual void attach(Observer*  observer) = 0;  //增加订阅者,纯虚函数
    virtual void detach(Observer*  observe) = 0;  //删除订阅者,纯虚函数
    virtual void notify(string message) = 0;   //通知订阅者更新消息,纯虚函数
};


class SubscriptionSubject : public Subject
{
private:
    list<Observer *> weixinUserlist;  //储存订阅公众号的用户
public:
    virtual void attach(Observer* observer);
    virtual void detach(Observer* observer);
    virtual void notify(string message);
};

//StudybarCommentEnd


void SubscriptionSubject::attach(Observer* observer)
{
    weixinUserlist.push_back(observer);
}

void SubscriptionSubject::detach(Observer* observer)
{
    for (list<Observer *>::iterator it = weixinUserlist.begin();
        it != weixinUserlist.end(); ++it){
        if ((*it) != observer) continue;

        weixinUserlist.erase(it);
        break;
    }
}

void SubscriptionSubject::notify(string message)
{
    for (list<Observer *>::iterator it = weixinUserlist.begin();
        it != weixinUserlist.end(); ++it){
        (*it)->update(message);
    }
}

//StudybarCommentBegin
int main()
{
    SubscriptionSubject   CAUBlog;
    string name1, name2, name3;
    cin >> name1 >> name2 >> name3;

    WeixinUser zhangsan(name1), lisi(name2);
    ReporterUser  wangwu(name3);
    //用户关注
    CAUBlog.attach(&zhangsan);
    CAUBlog.attach(&lisi);
    CAUBlog.attach(&wangwu);

    CAUBlog.notify("2018农大招生了");
    //用户取消关注
    CAUBlog.detach(&lisi);

    CAUBlog.notify("2018农大招生结束了");

    return 0;
}

//StudybarCommentEnd