1、分层模式
在使用分层设计模式编写代码之前,我们更多的是采用面向过程然后眉毛胡子一把抓,在一两个程序代码里写完所有的功能,这样只适合于小型个人项目。因为不利于阅读和修改,只有编程的个人比较熟悉程序的结构。这不利于程序的扩展性和协同开发。所以,我们引入一个固定的模式来进行编程,使得所有代码结构清晰明确,而且易于扩展延伸。
此处介绍的一种模式是分层模式。把程序分成几个层次:界面层、业务逻辑层、数据层。
界面层:主要功能就是实现界面的显示。比如要在登陆页面显示输入框之类,就需要login.php中放入form表单。比如要显示雇员信息,就需要empList.php来显示从数据库中获取的信息。但是,login.php中获取的输入数据是否合法与界面层无关;empList.php中显示的信息界面层也不用管来自哪里,它只要完成显示就行。具体这些数据操作都交给业务逻辑层来做,它要做的只是接受业务逻辑层反馈回来的结果并作出相应显示即可。
业务逻辑层:主要功能是实现逻辑处理,与界面层无关。该层主要包括 Admin.class.php,AdminService.class.php,Emp.class.php,EmpService.class.php等,Admin、Emp表示数据库中的两张表。
其中,Admin.class.php、Emp.class.php均为类,类内的成员变量就是各个表格自己的属性;
AdminService.class.php、EmpService.class.php均为类,主要作用就是为两张表格的操作提供函数支持;
除此之外,业务逻辑层还包括 SqlHelper.class.php助手类,主要提供mysql数据库操作支持。其他函数想要对数据库进行操作都要通过调用该助手类来操作数据库,例如完成 增删改查 操作。
数据层:就是指mysql数据库,在数据库里存放着要使用的表格Admin和Emp。这是最低层的数据库资源。
针对雇员信息管理系统,来分别讲解着三个层:
界面层:login.php empList.php等:login.php负责显示表单供用户输入,输入数据的合法性交给loginProcess.php来处理,而loginProcess.php又会去调用AdminService.class.php中的CheckAdmin()函数来验证并返回结果。
empList.php负责来显示雇员信息,它的数据来自empManage.php,而这个php又会调用EmpService.class.php来实现实际操作。
业务逻辑层:CheckAdmin()通过调用sql助手类来对数据库操作,验证输入的信息是否合法。
SqlHelper.class.php助手类主要提供各种对数据库的基本操作,例如:构造函数要实现获取连接、指定数据库、设置编码格式;execute_dql($sql)实现执行查询指令,返回$res;execute_dml($sql)实现增删改操作,返回$res;mysql_close_conn()自动关闭助手类中定义的连接。
数据层:就是最低层的数据库。
2、mvc模式
- (控制器Controller)- 负责转发请求,对请求进行处理。
- (视图View) - 界面设计人员进行图形界面设计。
- (模型Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。
- 模型(Model) 用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“模型”有对数据直接访问的权力,例如对数据库的访问。“模型”不依赖“视图”和“控制器”,也就是说,模型不关心它会被如何显示或是如何被操作。但是模型中数据的变化一般会通过一种刷新机制被公布。为了实现这种机制,那些用于监视此模型的视图必须事先在此模型上注册,从而,视图可以了解在数据模型上发生的改变。(比较:观察者模式(软件设计模式))
- 视图(View)能够实现数据有目的的显示(理论上,这不是必需的)。在视图中一般没有程序上的逻辑。为了实现视图上的刷新功能,视图需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册。
- 控制器(Controller)起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据模型上的改变。
3、设计模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
设计原则编辑
开闭原则
1
2
3
4
5
6
7
8
9
10
11
|
publicclassDiscFactory{ publicstatic光盘getDisc(Stringname){ //return(光盘)Class.forName(name).getInstance(); return (光盘)Class.forName(name).newInstance(); } } |
1
2
3
4
5
6
|
publicclass小子{ publicstaticvoidmain(String[]args){ 光盘d=DiscFactory.getDisc( "盗版盘" ); d.卖(); } } |
里氏代换原则
1
2
|
光盘d= new 盗版盘(); d.卖(); |
1
2
|
光盘d= new 盗版盘(); d.卖(); |