外观模式及其在简单的学生资格审查系统中的应用(C++实现)

13 篇文章 0 订阅
1 篇文章 0 订阅
一,理论学习:
     在软件系统开发中经常会遇到这样的情况,你实现了一些接口,但是这些接口都分布在几个类中,比如下面我写的一个简单的学生入学资格审查系统中,查询学生姓名的接口在Name类中实现,审查年龄是否合格的接口在Age类中实现,审查体重是否达标的接口在Weight类中实现,审查身高是否达标的接口在Height类中实现,审查分数是否达标的接口在Score类中实现。假如现在我在客户端中需要实现的功能(流程)是:查询学生的姓名是否正确 -> 审查年龄是否合格 -> 审查体重是否达标 -> 审查身高是否达标 -> 审查分数是否达标。
     面对这样的功能需求你会怎么做?也许有人在客户端中会这么做:实例化Name类,调用查询学生姓名的接口实现查询姓名的功能 -> 实例化Age类,调用审查年龄是否合格的接口实现审查年龄的功能 -> 实例化Weight类,调用审查体重是否达标的接口实现审查体重的功能 -> 实例化Height类,调用身高是否达标的接口实现审查身高的功能->实例化Score类,调用审查分数是否达标的接口实现分数审查的功能。这么做虽然功能是都实现了,你也可以向你的老板或上级交差了! 但是这么做的话有一个非常不好的问题!就是客户端程序与上面的每个功能(也可以称为子系统)都发生了耦合!当子系统发生变化的时候,客户端也将面临着许多变化的挑战,这对以后系统的维护和功能的扩展都是极为不利的!为什么呢? 假设现在你的上级或者老板需要你在审查分数是否达标的功能(子系统)后面再加n个功能(子系统),或者要你给以前的子系统增加几个功能,这时候你就该郁闷了!因为要满足老板的“胃口”,你不仅要增加子系统或者修改子系统(给子系统增加功能),而且你还要修改客户端的代码!面对如此多的变化,想必你该是“剪不断理还乱”!
     为了避免以后出现“剪不断理还乱”这种悲剧!一个合情合理的做法是利用软件开发中的“独孤九剑”--23大设计模式之外观模式,来解决这个问题。我为这些子系统创建一个统一的接口,这个接口简化了客户程序的判断操作,以后我要维护系统的或者给系统增加功能的时候,我只需要维护这个统一的接口或者增加一个功能然后把这个功能的接口写到这个统一的接口里面就可以了!这样做就使得子系统与客户端大幅度解耦!符合面向对象系统设计的低耦合的目标!!!
    总结:
1.什么叫外观模式?
为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
2.外观模式的适用性:
2.1 为一个复杂子系统提供一个简单的接口,这里的复杂子系统的是相对而言的,比如我写的这个简单的学生资格审查系统如果隶属于一个更大的学生信息管理系统的话,那么我这个系统相对学生信息系统而言就是其子系统!
2.2 提高子系统的独立性,这个上面已经分析过,就是降低子系统与客户端的耦合性。
2.3 在层次化结构中,可以使用外观模式定义系统中每一层的入口!
 
二,外观模式的应用:
运用外观模式写的一个简单的学生入学资格审查系统(C++实现) 
#include<iostream>
#include<string>
#include<vector>
#include <iomanip>
//#include<algorithm>
using namespace std;

class Name //姓名审查
{
public:
	void Get_Name()
	{//输入学生的姓名
		cout<<"请输入你的名字:";
		cin >> name;
	}
	void Show_Name()
	{//输出姓名
		cout <<"姓名:"<<name << endl;
	}
	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;
	}
	void Control_System()
	{//控制系统是否继续运行
		if (Search_Name())
		{
			cout << "恭喜你!符合要求!请继续下面的审查项目!" << endl;
		}			
		else
		{
			cout << "对不起!你所输入的名字不存在!系统将关闭!" << endl;
			system("pause");
			exit(-1);
		}
	}
private:
	string name;
	vector<string> ivec;
};

class Age //年龄审查
{
public:
	void Get_Age()
	{//输入年龄
		cout << "请输入你的年龄:";
		cin >> age;
	}
	void Show_Age()
	{//输出年龄
		cout <<"年龄:"<<age << endl;
	}
	bool Reach_Age()
	{//审查年龄是否合格:若合格返回true,否则返回false
		if (age >= 20 && age<=30)
			return true;
		else
			return false;
	}
	void Control_System()
	{//控制系统是否继续运行
		if (Reach_Age())
		{
			cout << "恭喜你!年龄审查通过!请继续下面的审查项目!" << endl;
		}
		else
		{
			cout << "对不起!你年龄不符合20岁至30岁之间的条件!系统将关闭!" << endl;
			system("pause");
			exit(-1);
		}
	}
private:
	int age;
};

class Weight //体重审查
{
public:
	void Get_Weight()
	{//输入体重
		cout << "请输入你的体重(Kg):";
		cin >> weight;
	}
	void Show_Weight()
	{//输出体重
		cout <<"体重:"<<weight << endl;
	}
	bool Examine_Weight()
	{//体重审查,若达标,则返回true,否则返回false
		if (weight >= 60.0 && weight<=70.0)
			return true;
		else
			return false;
	}
	void Control_System()
	{//控制系统是否继续运行
		if (Examine_Weight())
		{
			cout << "恭喜你!体重审查通过!请继续下面的审查项目!" << endl;
		}
		else
		{
			cout << "对不起!你的体重不符合60kg至70kg之间的条件!系统将关闭!" << endl;
			system("pause");
			exit(-1);
		}
	}
private:
	float weight;
};

class Height //审查身高
{
public:
	void Get_Height()
	{//输入身高
		cout << "请输入你的身高:";
		cin >> height;
	}
	void Show_Height()
	{//输出身高
		cout << "身高:" << height << endl;
	}
	bool Reach_Height()
	{//判断身高是否达标:若达标,返回true,否则返回false
		if (height >= 170.0 && height <= 180.0)
			return true;
		else
			return false;
	}
	void Control_System()
	{//控制系统是否继续运行
		if (Reach_Height())
		{
			cout << "恭喜你!身高审查通过!请继续下面的审查项目!" << endl;
		}
		else
		{
			cout << "对不起!你的身高不符合170cm至180cm之间的条件!系统将关闭!" << endl;
			system("pause");
			exit(-1);
		}
	}
private:
	float height;
};

class Score //审查分数
{
public:
	void Get_Score()
	{//输入分数
		cout << "请输入你的文化课总分:";
		cin >> Culture_Courses;
		cout<< "请输入你的专业课总分:";
		cin >> Specialized_Course;
	}
	void Show_Score()
	{//输出分数
		cout << "文化课总分:" << Culture_Courses << endl;
		cout << "专业课总分:" << Specialized_Course << endl;
	}
	bool Reach_Score()
	{//判断分数是否达标:若达标,则返回true,否则返回false
		if (Culture_Courses >= 150.0 && Specialized_Course >= 200.0)
			return true;
		else
			return false;
	}
	void Control_System()
	{//控制系统是否继续运行
		if (Reach_Score())
		{
			cout << "恭喜你!分数达标!" << endl;
		}
		else
		{
			cout << "对不起!你的分数未达到文化课150分以上和专业课200以上的条件!系统将关闭!" << endl;
			system("pause");
			exit(-1);
		}
	}
private:
	float Culture_Courses;
	float Specialized_Course;
};

class Review_Process //审查流程:为整个流程提供更高层的统一接口
{
public:
	void Process()  //整个流程的统一接口
	{
		cout << "欢迎来到资格审查系统!";
		cout << "请按提示进行操作!"<<endl;
		Name*p1=new Name;
		p1->Get_Name();
		p1->Search_Name();
		p1->Control_System();
		cout << endl;
		Age*p2 = new Age;
		p2->Get_Age();
		p2->Reach_Age();
		p2->Control_System();
		cout << endl;
		Weight*p3 = new Weight;
		p3->Get_Weight();
		p3->Examine_Weight();
		p3->Control_System();
		cout << endl;
		Height*p4 = new Height;
		p4->Get_Height();
		p4->Reach_Height();
		p4->Control_System();
		cout << endl;
		Score*p5 = new Score;
		p5->Get_Score();
		p5->Reach_Score();
		p5->Control_System();
		cout << endl;		
		p1->Show_Name();
		p2->Show_Age();
		p3->Show_Weight();
		p4->Show_Height();
		p5->Show_Score();
		cout << "恭喜你!你已经通过了我们的资格审查!" << endl;
		delete p1;
		delete p2;
		delete p3;
		delete p4;
		delete p5;
	}
};

int main(void)
{
	Review_Process*R = new Review_Process;
	R->Process();
	delete R;
	cout << endl << endl;
	system("pause");
	return 0;
}
运行测试结果:




                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值