设计模式2思考——web框架中—页面功能设计的实现
2008-03-31 16:25
706 查看
在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 的集合。我将在以后验证。
例如在考试系统的项目中有这样一个问题,每一个测试任务有不同的状态,不同的状态对应一些不同的操作。新建的测试任务并为空的时候,记录之后要有“修改”“删除”“报名”按钮。有了报名记录之后“修改、删除”按钮将会消失,只有“报名”按钮。当报名人满的时候“报名”按钮将改为“结束报名”按钮。等等
根据传统的软件架构,从数据库中得到实体只是包含数据内容。我们只能在 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 的集合。我将在以后验证。
相关文章推荐
- 实现Web页面中级联菜单的设计/实现动态加载列表框/实现自动刷新页面/实现Web页面的局部动态更新/实现自动完成功能
- 基于事件的监听,消息订阅设计模式的实现框架,ERP,OA,复杂,灵活多变的项目的福音
- 基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作
- 我的权限系统设计实现MVC4 + WebAPI + EasyUI + Knockout(五)框架及Web项目的组件化
- 设计模式(九)-桥接模式(Bridge Pattern)——将类的功能层次结构与实现层次结构分离
- 细谈Web框架设计与实现
- 在web页面中打印功能的实现问题集锦
- 2016年3月19日,如何在web页面里面实现拨打电话的功能
- 设计模式之抽象工厂模式(附带类似反射功能的实现/c++)
- Android 框架设计Demo,一个简单的MVP示例搜索功能,网络请求用Retrofit+RxJava实现
- 微信开发之移动手机WEB页面(HTML5)Javascript实现一键拨号及短信发送功能
- 使用SSM框架搭建Web服务器实现登录功能(Spring+SpringMVC+Mybatis)
- WebView从assets中加载html5页面,实现定位功能
- 160229-01、web页面常用功能js实现
- 设计技巧39:利用Visitor模式实现对现有数据的封装和功能的添加
- 使用jQuery实现Web页面换肤功能的要点解析
- 基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
- 大家很容易忽视的几个问题,1.投简历请换位思考、2.前台页面设计比后台实现更值钱
- 通用权限系统框架功能实现设计
- 基于SSM框架web搜索功能的实现