利用“观察者模式”实现求职中心应用程序
题目
1.求职者对“求职中心”的职位需求信息非常关心,很想跟踪“求职中心”中职位需求信息的变化。“求职中心”让求职者把个人信息登记下来。当出现新的职位需求时,“求职中心”会通知全体求职者,而求职者会根据不同的职位需求做出不同的响应:应聘或忽略。
2.编写程序,模拟求职者在“求职中心”进行登记,“求职中心”发布职位需求信息,求职者决定是否应聘的过程。
(1)定义“求职中心”类 JobCenter,其成员变量可以保存所有的求职者;
(2)定义求职者类 JobSeeker,定义 2 种不同类型的求职者对象, 应届大学毕业生 Student 类和有工作经验的求职者 Experienced 类,并在“求职中心”中进行注册登记;
(3)“求职中心”发布新的职位需求信息,并及时通知所有注册过的求职者。
(4)求职者能够自动接收信息,并做出响应:应聘或忽略。
(5)应届大学毕业生做出应聘的响应之前,还必须先经过学校( University)的审核:绩点(GPA)不低于 2.5 分才允许毕业和参加应聘;成绩低于 2.5 分就必须留级一年,不能参加应聘。
3.题目要求
(1)创建新的工程项目 Findjob; 所有代码可以放在同一个源文件中;
(2)可以自由扩展程序,随意修改类、函数、参数等,但是必须满足题目要求。
4.编写程序并测试。
5.程序执行完毕后,命令行窗口显示的结果:
求职中心成立了
发布招聘信息:腾辉公司需要 10 名 C++程序员。
通知所有求职者...
我叫小张,我是一名毕业生,我收到了招聘信息:腾辉公司需要 10 名 C++程序员。 可以应聘。
我叫小王,我有工作经验,待遇要好。我收到了招聘信息:腾辉公司需要 10 名 C++程序员。 可以应聘。
我叫小李,我是一名毕业生,我收到了招聘信息:腾辉公司需要 10 名 C++程序员。 无法毕业,不能应聘。
发布招聘信息:海景公司需要 8 名动画设计师。
通知所有求职者...
我叫小张,我是一名毕业生,我收到了招聘信息:海景公司需要 8 名动画设计师。 可以应聘。
我叫小王,我有工作经验,待遇要好。我收到了招聘信息:海景公司需要 8 名动画设计师。 工作不合适,不应聘。
我叫小李,我是一名毕业生,我收到了招聘信息:海景公司需要 8 名动画设计师。 无法毕业,不能应聘。
发布招聘信息:仁海公司需要 9 名电工。
通知所有求职者...
我叫小张,我是一名毕业生,我收到了招聘信息:仁海公司需要 9 名电工。 可以应聘。
我叫小王,我有工作经验,待遇要好。我收到了招聘信息:仁海公司需要 9 名电工。 工作不合适,不应聘。
我叫小李,我是一名毕业生,我收到了招聘信息:仁海公司需要 9 名电工。 无法毕业,不能应聘。
求职中心关闭了
6. 提示
(1) 采用下面的方法判断一个字符串中是否含有指定的子串。
if (str1.find(str2) != string::npos) {
cout << "found!" << endl;
}
(2) 向 vector 容器中添加元素。
vector<JobSeeker *> jobSeekers;
jobSeekers.push_back(pJobSeeker);
(3)遍历 vector 容器中的元素。
for (JobSeeker *pJobSeeker : jobSeekers) {
pJobSeeker->answerPhone(message);
}
代码
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
class JobCenter;
class University;
class JobSeeker;
class Student;
class Experienced;
class JobCenter {
public:
JobCenter() :numJobSeeker(0) { cout << "求职中心成立了" << endl; }
void publishMessage(const string& message);
void notifyJobSeekers();
void match(Experienced& experieced);
void addJobSeekers(JobSeeker* seeker);
~JobCenter() { cout << "求职中心关闭了" << endl; }
private:
string message;
int numJobSeeker;
vector<JobSeeker*>jobSeekers;
};
class University {
public:
University(const string& name) :name(name) {}
void approve(Student& student);
~University() {}
private:
string name;
};
class JobSeeker {
public:
JobSeeker(const string& name, int age) :name(name), age(age) {}
virtual void replyMessage(const string& message) = 0;
virtual ~JobSeeker() {}
protected:
string name;
int age;
};
class Student :public JobSeeker {
public:
Student(const string& name, int age, double GPA, University& university, JobCenter& jobcenter)
:JobSeeker(name, age), GPA(GPA), university(university), jobcenter(jobcenter) {
}
void replyMessage(const string& message) {
cout << "我叫" << name << ",我是一名毕业生,我收到了招聘信息:" << message;
university.approve(*this);
if (graduate) {
cout << "可以应聘。" << endl;
} else {
cout << "无法毕业,不能应聘。" << endl;
}
}
~Student() {};
bool graduate;
double GPA;
private:
University& university;
JobCenter& jobcenter;
};
class Experienced :public JobSeeker {
public:
Experienced(const string& name, int age, JobCenter& jobcenter)
:JobSeeker(name, age), jobcenter(jobcenter) {
}
void replyMessage(const string& message) {
cout << "我叫" << name << ",我有工作经验,待遇要好。我收到了招聘信息:" << message;
jobcenter.match(*this);
if (match) {
cout << "可以应聘。" << endl;
} else {
cout << "工作不合适,不能应聘。" << endl;
}
}
~Experienced() {};
bool match;
private:
JobCenter& jobcenter;
};
void JobCenter::notifyJobSeekers() {
cout << "通知所有求职者..." << endl;
for (int i = 0; i < numJobSeeker; i++) {
jobSeekers[i]->replyMessage(message);
}
}
void JobCenter::match(Experienced& experieced) {
if (message.find("程序员") != string::npos) {
experieced.match = true;
} else {
experieced.match = false;
}
}
void JobCenter::addJobSeekers(JobSeeker* seeker) {
jobSeekers.push_back(seeker);
numJobSeeker++;
}
void JobCenter::publishMessage(const string& message) {
this->message = message;
cout << "发布招聘信息:" << this->message << endl;
}
void University::approve(Student& student) {
if (student.GPA < 2.5) {
student.graduate = false;
} else {
student.graduate = true;
}
}
int main() {
JobCenter jobCenter;
University ouc("中国海洋大学");
Student* zhang = new Student("小张", 22, 3.3, ouc, jobCenter);
Experienced* wang = new Experienced("小王", 30, jobCenter);
Student* li = new Student("小李", 21, 2.4, ouc, jobCenter);
jobCenter.addJobSeekers(zhang);
jobCenter.addJobSeekers(wang);
jobCenter.addJobSeekers(li);
jobCenter.publishMessage("腾辉公司需要10名c++程序员。");
jobCenter.notifyJobSeekers();
cout << endl;
jobCenter.publishMessage("海景公司需要8名动画设计师。");
jobCenter.notifyJobSeekers();
cout << endl;
jobCenter.publishMessage("仁海公司需要9名电工。");
jobCenter.notifyJobSeekers();
cout << endl;
delete zhang;
delete wang;
delete li;
return 0;
}