【自然框架】——页面基类与设计模式(二) 模板模式

 

前篇:【自然框架】——页面基类与设计模式(一)桥接模式

 

桥接模式的补充:(下面的一段是桥接模式里后补充的一段,桥接模式的一个小结)

 

什么是交接模式?引用《大话设计模式》里的定义:

  桥接模式(Bridge):将抽象部分和他的实现部分分离,使他们都可以独立的变化。(P229)

 

  不知道大家有没有看懂这个定义,至少我是没弄懂,呵呵。再引用一段《大话设计模式》的一段解释:(P232)

 

  小菜:“我觉得交接模式所说的‘将抽象部分和他的实现部分分离’,还是不好理解,我的理解就是实现系统有多个角度分类,每一种分类都有可能有变化,那么就把这种多角度分离出来让他们独立变化,减少他们之间的耦合。”

 

  这个就是作者(程杰)的理解吧,这个解释够白话的了,不过我还想说一下我的更加白话的理解,呵呵。大家看看对不对。

 

  我的理解就是:有两套或者多套独立的“多态系统”,他们可以各自独立的变化(继承),互不干扰。然后选择一套系统作为容器,在这个容器里定义其他系统的实例或者借口,通过这种关系(组合/聚合)把两套或者多套系统结合起来,配合工作。组合/聚合就好像一座桥梁一样把这些系统结合在一起,所以就叫做桥接模式了。

 

  就好比我的这个例子里面,页面基类就是一套“多态系统”,他可以派生出列表页面基类、表单页面基类等,把页面基类作为容器,在其内部定义数据访问函数库的实例,定义当前登录人信息的实例。而数据访问函数库还可以自行派生出SqlClient的访问类、OleDb的访问类,他们是独立的“多态系统”互不干扰。页面基类如何变化不需要考虑数据访问的问题,数据访问函数库如何变化也不用考虑有多少种页面。这就是所谓的减少耦合吧。

 

 

=====================================================

 

   

  如果我们在页面基类里要做一些事情,需要制定一下执行顺序,而且有一些处理方法是公用的,但是有一些处理的方式又不一样,这时候就比较适合采用模板模式了。

  比如我们在页面基类里override 一下OnInit(EventArgs e),在这里制定一下执行顺序,然后定义几个虚函数(virtual)。代码如下:

 

 

 

/// <summary>
        /// 提取URL里面的参数,验证参数
        /// </summary>
        /// <param name="e"></param>
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            //调用函数来设置FunctionID,不同类型的页面就可以用不同的方式来设置FunctionID了。
            SetFunctionID();
            //调用函数来设置ButtonID。
            SetButtonID();

            //调用函数来设置DataID。
            SetDataID();

            //调用函数来设置DepartmentID(部门ID)。
            SetDepartmentID();

            //调用函数来设置ForeignID(外键ID)。
            SetForeignID();

            if (!Page.IsPostBack)
            {
                //设置标题
                SetPageTitle();
            }
        }

 

SetFunctionID()的代码,其他代码略。

 /// <summary>
        /// 设置FunctionID。
        /// </summary>
        protected virtual void SetFunctionID()
        {
            //DataList.aspx、DataForm.aspx 页面通过URL里的参数设置。
            //其他页面自行设置

            this.FunctionID = Request.QueryString["fid"];
            #region 验证模块ID参数是否是数字。
            if (!Functions.IsInt(this.FunctionID))
            {
                Response.Write("模块参数不正确!");
                Response.End();
            }
            #endregion

        }

 

 

  这样子类就继承了基类的执行顺序,然后如果有不一样的验证方式,那么就override一下就可以了。

 

  这样做的好处就是,把共用的东西放到父类,子类只需要关注不一样的地方。同时也强制了编写规范,基类是写好的,大家不能随便修改,如果有不同的需求,可以去改子类(override),不必去改基类,这样也遵守了开放封闭原则。

 

  同理,列表页面基类也采用了模板模式。

  在自然框架里面列表页面里需要使用分页控件、查询控件、数据显示控件、操作按钮组这几个控件,那么给这些控件设置属性值的操作,和他们之间的关联关系就可以放在列表页面基类里去做。代码如下:

 

 

 /// <summary>
        /// 在 OnInit 事件里面设置各个自定义控件的属性和关联
        /// </summary>
        /// <param name="e"></param>
        protected override void OnInit(EventArgs e)
        {
            //父类里面验证参数是否正确
            base.OnInit(e);

            //验证是否有权限访问。
            MyUser.CheckFunctionID(this.FunctionID);

            //设置分页控件的属性和事件
            SetQuickPagerInfo();

            //设置数据表格的属性
            SetGridInfo();

            //设置查询控件的属性
            SetFindControlInfo();

            //设置操作按钮的属性
            SetButtonBarInfo();

        }

 

 

  虽然大多数列表页面都可以这么设置,但是也不排除特殊需求,如果又不一样的需求的话,那么就可以在子类里面通过override的方式来实现自己的特殊需求。

还是那句话,把共用的放在基类里面,子类只关心不同点即可。

 

模板模式的定义:
  还是引用《大话设计模式》里的定义。

 

  模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模版方法可以使得子类可以不修改一个算法的结构既可以重定义该算法的某些特定步骤。【P96】

  

  当然我这里说的只是模板模式的一种形式的应用,除了这种形式的用法外还有很多种形式的用法。

 

  全部源代码下载:http://www.cnblogs.com/jyk/archive/2009/10/28/1591680.html  

 

=============================================

 

白天不能上网,被屏蔽了,所以白天就不能及时回复了,晚上在回复。

 

时间: 2024-10-22 22:16:08

【自然框架】——页面基类与设计模式(二) 模板模式的相关文章

【自然框架】——页面基类与设计模式(一)桥接模式(11.14补充了一段对桥接模式的理解)

  [自然框架] 页面里的父类-- (补充) [自然框架] 页面里的父类--把共用的东东都交给父类,让子类专注于其他.   ===================   以前发过两篇关于页面基类的文章,由于当时对于聚合.组合.桥接模式等不清楚,所以说的也是比较乱,这些日子又学习了一下程杰的<大话设计模式>,又有不少收获.现在我们再来重新分析一下.   先说需求:1. 对于MIS来说,大多数页面都需要验证一下访问者是否已经登录,是否有权限访问页面,是否有权限操作指定的记录. 2. 对于自然框架来说

秋色园QBlog技术原理解析:Module之页面基类-生命周期流程(六)

文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色园QBlog技术原理解析:UrlRewrite之无后缀URL原理(三) --介绍如何实现无后缀URL 4:  秋色园QBlog技术原理解析:UrlRewrite之URL重定向体系(四) --介绍URL如何定位到处理程序 5:  秋色园QBlog技术原理解析:Module之页面基类设计(五) --介绍

asp.net实现非常实用的自定义页面基类(附源码)_实用技巧

本文实例讲述了asp.net实现非常实用的自定义页面基类.分享给大家供大家参考,具体如下: 看到前面几篇文章(如:<asp.net实现利用反射,泛型,静态方法快速获取表单值到Model的方法>)想到的.下面总结发布一个笔者在开发中常用的一个自定义BasePage类,废话不多说了,直接贴代码. 一.BasePage类 1.代码 using System; using System.Data; using System.Configuration; using System.Web; using

【自然框架】之通用权限(二):人员表组

        继续,这是第二章了.本来想在这一章里面介绍三个表组来着,但是我有点写不好的感觉,还是多分几章吧,这一章就只介绍人员表组.第二章到第五章主要是介绍表结构.我是习惯使用Excel来设计表,一开始的时候只能记录表名.字段名.字段类型.字段说明等信息,但是一直没能找到如何使用Excel来体现出来表之间的关系.前一阵子(好像是去年)突然想到了可以使用"图表"+图形(比如箭头)的方式来做表关系,第一章里的那几个图就是这么弄出来的,看着还凑合吧.       至于为什么不用Power

【自然框架.视频】基础设置(二)下载演示程序用的数据库,和数据表结构简介

  本来想这个月做一套视频演示的,但是现在看来是做不出来了.客观原因是家里拆迁.买房子.搬家,确实有点忙:主观原因是自己还是比较懒.   虽然有客观原因,但是主要的还是主观原因.既然没做好,那就不要找理由,而要为能够做好找点方法!   今天是第二个视频-- demo用的数据库的下载,下载后附加数据库以及数据库里表(元数据.人员.角色等)的简介.   下周就要去北京了,估计视频的进度就可以加快了.大约三天一个吧.   自然框架一定会坚持下去!会一直开源,且免费!  

php设计模式 Template (模板模式)_php技巧

继承关系由于自身的缺陷,被专家们扣上了"罪恶"的帽子."使用委派关系代替继承关系","尽量使用接口实现而不是抽象类继承"等等专家警告,让我们这些菜鸟对继承"另眼相看".其实,继承还是有很多自身的优点所在.只是被大家滥用的似乎缺点更加明显了.合理的利用继承关系,还是能对你的系统设计起到很好的作用的.而模板方法模式就是其中的一个使用范例. GOF给模板方法(Template Method)模式定义一个操作中的算法的骨架,而将一些步

php设计模式 Template (模板模式)

复制代码 代码如下: <?php /** * 模板模式 * * 定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构可以定义该算法的某些特定步骤 * */ abstract class TemplateBase { public function Method1() { echo "abstract Method1<br/>"; } public function Method2() { echo "abstract Meth

Java设计模式之模板模式(Template模式)介绍_java

Template模式定义:定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中. 其实Java的抽象类本来就是Template模式,因此使用很普遍.而且很容易理解和使用,我们直接以示例开始: 复制代码 代码如下: public abstract class Benchmark { /** * 下面操作是我们希望在子类中完成 */ public abstract void benchmark(); /** * 重复执行benchmark次数 */ public final long repea

【自然框架 NatureFramework】 项目结构、命名空间和命名规范

  请注意,这里说的是自然框架内部代码的项目结构,并不是说给客户做开发的时候,也需要这些项目.在给客户开发的时候,只需要引用编译后的dll 即可. 一.项目结构   自然框架的基本的思路还是共用函数,数据访问函数库.元数据管理.基础控件扩展.元数据控件(依据元数据动态创建的控件),用户登录.在线.权限管理,分页控件,页面基类构成. 这个并没有按照三层(分层)的要求去做,只是感觉这么分可以更清晰一些.把功能相当比较独立的部分做成一个项目.有一点MVC(不是asp.net MVC)的味道.我不想依据