设计模式2思考——web框架中—页面功能设计的实现
在web项目中经常会遇到页面的功能随着页面的内容动态改变的情况。
例如在考试系统的项目中有这样一个问题,每一个测试任务有不同的状态,不同的状态对应一些不同的操作。新建的测试任务并为空的时候,记录之后要有“修改”“删除”“报名”按钮。有了报名记录之后“修改、删除”按钮将会消失,只有“报名”按钮。当报名人满的时候“报名”按钮将改为“结束报名”按钮。等等
根据传统的软件架构,从数据库中得到实体只是包含数据内容。我们只能在 code-behind(aspx.cs) 文件中加入大量的 if-else 来进行判断,渐渐的 coder 就埋没在了 if 的嵌套中。如果业务有了变化(变化是肯定的,除非你的系统只给一个单位使用。),我们还不得不推翻原有的 if-else 。在以下的讨论中,系统可以通过 web.config 来配置不同的业务流程。
例如:系统 web.config 中的配置项 EnableOverNotFull = 1 时,报名未满时可以结束任务;=0 时,报名未满不可以结束任务。
我们先来看看原有的框架,首先是 Model ,定义了实体;底层是数据库访问层(DAL);这里要定义一个包含了基本业务的层(Biz)。
分别是 :
Model: taskInfo ;DAL:taskDal;Biz:taskMgr。实现task的管理。利用这些对象就可以实现普通的从数据库到业务对象和页面显示的过程。
在这些对象之外,我要在这里新建一个 taskCtrl ,它的定义如下:
class tasker
{
public taskInfo _taskInfo;
public Dictionary<string,string> operations = new Dictionary<string,string>();
//......
}
class taskerRegisting:tasker
{//为不同状态的 tasker 建立一个子类(状态模式)
void public taskDelete();
void public taskModify();
void public taskEnd();
//......
}
class taskMgr
{
public tasker getInstance(taskinfo){// 工厂模式
tasker _task;
switch taskinfo.state
{
case 1:
_task = new taskerRegist();
_task.operation.add("btn_delete","visible");//页面根据operation 中的内容决定是否显示相关按钮。
_task.operation.add("btn_add","visible"); //这里业务逻辑和显示逻辑结合较紧,无法实现松耦合。有好的想法欢迎与我联系探讨。
if (EnableOverNotFull == 1){//配置项的业务逻辑。
_task.operation.add("btn_End","visible");
}
break;
case 2:
......
default:
_task = null;
}
}
}
以上的代码可以实现一定的职责分离,但却无法完全实现松耦合。主要问题在无法为页面的按钮分配事件。或许可以将operations 定义成 button 的集合。我将在以后验证。