利用“观察者模式”实现求职中心应用程序

题目

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;
}
posted @ 2022-08-30 21:43  catting123  阅读(94)  评论(0)    收藏  举报