您的位置:首页 > 其它

模板方法模式在学生资格审查系统(升级版)中的应用和实现

2014-05-14 22:16 363 查看
一,理论学习:
在面向对象系统的分析与设计中可能会遇到这样的一种情况:对于某一个业务逻辑在不同的对象中有着不同的细节实现,但是业务逻辑的整体框架是相同的。比如下面我自己写的一个学生资格审查系统升级版(前面我在学习外观模式的时候写过学生资格审查系统),假设需求决定了审查高中生和审查大学生的整个审查流程是一模一样的,审查流程都是:审查姓名 -> 审查年龄 ->审查体重 -> 审查身高 -> 审查分数 -> 个人信息和结果显示。 审查高中生和审查大学生二者不同是前面所述的每个流程的具体实现细节不一样!比如在审查分数这个流程时,对于高中生我们审查他的语文、数学、英语三门分数是否达标,而对于大学生我们审查他的文化课和专业课分数是否达标!
模板方法模式就是用来解决上面所说的问题的!模板方法模式采用继承的方式,将逻辑(算法)框架放在抽象基类中,并定义好细节的接口,细节的接口的实现则推迟到子类中进行。说的明白点就是:模板方法模式就是利用面向对象中多态的方法,实现算法实现细节和高层接口的松耦合!
实现要点:
1.将通用算法(逻辑)封装起来,而将算法的实现细节交给子类去完成。
2.将细节算法定义为基类中的保护成员只供其子类调用。
二,模板方法模式的简单应用:
学生资格审查系统升级版(C++实现)
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
class Student
{//抽象类:学生
public:
void process()
{
Get_Name();
Search_Name();
Control_System1();
cout<<endl;

Get_Age();
Reach_Age();
Control_System2();
cout<<endl;

Get_Weight();
Examine_Weight();
Control_System3();
cout<<endl;

Get_Height();
Reach_Height();
Control_System4();
cout<<endl;

Get_Score();
Reach_Score();
Control_System5();
cout<<endl;

Show_Name();
Show_Age();
Show_Weight();
Show_Height();
Show_Score();
}
protected:
virtual void Get_Name()=0;
virtual bool Search_Name()=0;
virtual void Control_System1()=0;

virtual void Get_Age()=0;
virtual bool Reach_Age()=0;
virtual void Control_System2()=0;

virtual void Get_Weight()=0;
virtual bool Examine_Weight()=0;
virtual void Control_System3()=0;

virtual void Get_Height()=0;
virtual bool Reach_Height()=0;
virtual void Control_System4()=0;

virtual void Get_Score()=0;
virtual bool Reach_Score()=0;
virtual void Control_System5()=0;

virtual void Show_Name()=0;
virtual void Show_Age()=0;
virtual void Show_Weight()=0;
virtual void Show_Height()=0;
virtual void Show_Score()=0;
};

class Senior_High_School_Student:public Student
{
public:
virtual void Get_Name()
{//输入高中生的名字
cout<<"请输入你的名字:";
cin >> name;
}

virtual bool Search_Name()
{//查询高中生的姓名:若存在,则返回true,否则返回false
string sarry[] = { "张三", "李四", "王五", "马六",
"李刚", "王天一", "李天一", "王西门", "王东门", "王南门" };
ivec.insert(ivec.end(), sarry, sarry + 10);
string search_value = name;
vector<string>::const_iterator result = find(ivec.begin(), ivec.end(), search_value);
if (result == ivec.end())
return false;
else
return true;
}

virtual void Control_System1()
{//控制系统是否继续运行
if (Search_Name())
{
cout << "恭喜你!符合要求!请继续下面的审查项目!" << endl;
}
else
{
cout << "对不起!你所输入的名字不存在!系统将关闭!" << endl;
system("pause");
exit(-1);
}
}

virtual void Get_Age()
{//输入高中生的年龄
cout << "请输入你的年龄:";
cin >> age;
}

virtual bool Reach_Age()
{//审查高中生年龄是否合格:若合格返回true,否则返回false
if (age >= 15 && age<=20)
return true;
else
return false;
}

virtual void Control_System2()
{//控制系统是否继续运行
if (Reach_Age())
{
cout << "恭喜你!年龄审查通过!请继续下面的审查项目!" << endl;
}
else
{
cout << "对不起!你年龄不符合15岁至20岁之间的条件!系统将关闭!" << endl;
system("pause");
exit(-1);
}
}

virtual void Get_Weight()
{//输入高中生体重
cout << "请输入你的体重(Kg):";
cin >> weight;
}

virtual bool Examine_Weight()
{//审查高中生的体重,若达标,则返回true,否则返回false
if (weight >= 40.0 && weight<=55.0)
return true;
else
return false;
}

virtual void Control_System3()
{//控制系统是否继续运行
if (Examine_Weight())
{
cout << "恭喜你!体重审查通过!请继续下面的审查项目!" << endl;
}
else
{
cout << "对不起!你的体重不符合40kg至55kg之间的条件!系统将关闭!" << endl;
system("pause");
exit(-1);
}
}

virtual void Get_Height()
{//输入高中生的身高
cout << "请输入你的身高:";
cin >> height;
}

virtual bool Reach_Height()
{//判断高中生的身高是否达标:若达标,返回true,否则返回false
if (height >= 155.0 && height <= 165.0)
return true;
else
return false;
}

virtual void Control_System4()
{//控制系统是否继续运行
if (Reach_Height())
{
cout << "恭喜你!身高审查通过!请继续下面的审查项目!" << endl;
}
else
{
cout << "对不起!你的身高不符合155cm至165cm之间的条件!系统将关闭!" << endl;
system("pause");
exit(-1);
}
}

virtual void Get_Score()
{//输入高中生的分数
cout << "请输入你的语文课分数:";
cin >> Chinese_Courses;
cout<< "请输入你的数学课分数:";
cin >> Math_Course;
cout<<"请输入你的英语课分数:";
cin>>English_Course;
}

virtual bool Reach_Score()
{//判断高中生分数是否达标:若达标,则返回true,否则返回false
if ( Chinese_Courses>= 70.0 && Math_Course>= 80.0 && English_Course>=75.0)
return true;
else
return false;
}

virtual void Control_System5()
{//控制系统是否继续运行
if (Reach_Score())
{
cout << "恭喜你!分数达标!" << endl<<endl;
}
else
{
cout << "对不起!你的语文分数未达到70分以上,";
cout<<"或者数学未达到80分以上,或者英语未达到75分以上!系统将关闭!" << endl<<endl;
system("pause");
exit(-1);
}
}

virtual void Show_Name()
{//输出高中生的姓名
cout <<"姓名:"<<name << endl;
}

virtual void Show_Age()
{//输出高中生的年龄
cout <<"年龄:"<<age << endl;
}

virtual void Show_Weight()
{//输出高中生的体重
cout <<"体重:"<<weight << endl;
}

virtual void Show_Height()
{//输出高中生的身高
cout << "身高:" << height << endl;
}

virtual void Show_Score()
{//输出高中生的分数
cout<<"语文:"<<Chinese_Courses<<endl;
cout<<"数学:"<<Math_Course<<endl;
cout<<"英语:"<<English_Course<<endl;
}
private:
string name;
vector<string> ivec;
int age;
float weight;
float height;
float Chinese_Courses;
float Math_Course;
float English_Course;
};

class College_Student:public Student
{
public:
virtual void Get_Name()
{//输入大学生的名字
cout<<"请输入你的名字:";
cin >> name;
}

virtual bool Search_Name()
{//查询大学生的姓名:若存在,则返回true,否则返回false
string sarry[] = { "马良君", "周未", "邓洋", "邓潮",
"张无忌", "赵敏", "高超", "李林", "李超", "牛马" };
ivec.insert(ivec.end(), sarry, sarry + 10);
string search_value = name;
vector<string>::const_iterator result = find(ivec.begin(), ivec.end(), search_value);
if (result == ivec.end())
return false;
else
return true;
}

virtual void Control_System1()
{//控制系统是否继续运行
if (Search_Name())
{
cout << "恭喜你!符合要求!请继续下面的审查项目!" << endl;
}
else
{
cout << "对不起!你所输入的名字不存在!系统将关闭!" << endl;
system("pause");
exit(-1);
}
}

virtual void Get_Age()
{//输入大学生的年龄
cout << "请输入你的年龄:";
cin >> age;
}

virtual bool Reach_Age()
{//审查大学生年龄是否合格:若合格返回true,否则返回false
if (age >= 20 && age<=30)
return true;
else
return false;
}

virtual void Control_System2()
{//控制系统是否继续运行
if (Reach_Age())
{
cout << "恭喜你!年龄审查通过!请继续下面的审查项目!" << endl;
}
else
{
cout << "对不起!你年龄不符合20岁至30岁之间的条件!系统将关闭!" << endl;
system("pause");
exit(-1);
}
}

virtual void Get_Weight()
{//输入大学生体重
cout << "请输入你的体重(Kg):";
cin >> weight;
}

virtual bool Examine_Weight()
{//审查大学生的体重,若达标,则返回true,否则返回false
if (weight >= 60.0 && weight<=70.0)
return true;
else
return false;
}

virtual void Control_System3()
{//控制系统是否继续运行
if (Examine_Weight())
{
cout << "恭喜你!体重审查通过!请继续下面的审查项目!" << endl;
}
else
{
cout << "对不起!你的体重不符合60kg至70kg之间的条件!系统将关闭!" << endl;
system("pause");
exit(-1);
}
}

virtual void Get_Height()
{//输入大学生的身高
cout << "请输入你的身高:";
cin >> height;
}

virtual bool Reach_Height()
{//判断大学生的身高是否达标:若达标,返回true,否则返回false
if (height >= 160.0 && height <= 170.0)
return true;
else
return false;
}

virtual void Control_System4()
{//控制系统是否继续运行
if (Reach_Height())
{
cout << "恭喜你!身高审查通过!请继续下面的审查项目!" << endl;
}
else
{
cout << "对不起!你的身高不符合160cm至170cm之间的条件!系统将关闭!" << endl;
system("pause");
exit(-1);
}
}

virtual void Get_Score()
{//输入大学生的分数
cout << "请输入你的文化课总分:";
cin >> Culture_Courses;
cout<< "请输入你的专业课总分:";
cin >> Specialized_Course;
}

virtual bool Reach_Score()
{//判断大学生分数是否达标:若达标,则返回true,否则返回false
if (Culture_Courses >= 150.0 && Specialized_Course >= 200.0)
return true;
else
return false;
}

virtual void Control_System5()
{//控制系统是否继续运行
if (Reach_Score())
{
cout << "恭喜你!分数达标!" << endl<<endl;
}
else
{
cout << "对不起!你的分数未达到文化课150分以上或者专业课200以上的条件!系统将关闭!" << endl<<endl;
system("pause");
exit(-1);
}
}

virtual void Show_Name()
{//输出大学生的姓名
cout <<"姓名:"<<name << endl;
}

virtual void Show_Age()
{//输出大学生的年龄
cout <<"年龄:"<<age << endl;
}

virtual void Show_Weight()
{//输出大学生的体重
cout <<"体重:"<<weight << endl;
}

virtual void Show_Height()
{//输出大学生的身高
cout << "身高:" << height << endl;
}

virtual void Show_Score()
{//输出大学生的分数
cout<<"文化课:"<<Culture_Courses<<endl;
cout<<"专业课:"<<Specialized_Course<<endl;
}

private:
string name;
vector<string> ivec;
int age;
float weight;
float height;
float Culture_Courses;
float Specialized_Course;
};

int main(void)
{
cout<<"欢迎来到学生资格审查系统!"<<endl<<endl;
cout<<"请选择你的学历:"<<endl;
cout<<"1.高中"<<endl;
cout<<"2.大学"<<endl;
int a;
cout<<"请输入对应数字进行选择:";
cin>>a;
switch(a)
{
case 1:
{
Student *p1=new Senior_High_School_Student;
p1->process();
cout<<"恭喜你已经通过了我们的全部审核!"<<endl;
delete p1;
break;
}

case 2:
{
Student *p2=new College_Student;
p2->process();
cout<<"恭喜你已经通过了我们的全部审核!"<<endl;
delete p2;
break;
}
default:cout<<"你输入的数字有误!系统将关闭!"<<endl;
}
system("pause");
return 0;
}
运行结果截图:
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: