模板设计模式(Template Method)和窄接口 的应用1例

 

在一个HIS的项目开发中我负责《医疗技术模块》的开发,
中间有两个界面,一个是 医技申请的确认界面,另一个是医技申请的冲红界面

两个界面的元素基本一致,但是调用的查询方法和确认方法不一样。
我设计的是 确认界面作父类,冲红界面作子类。

开始 用了以下的代码:
确认界面的确认按键Click代码:
 private void btEnter_Click(object sender, EventArgs e)
        {
            try
            {
                if (执行科室ComboBox.Visible && null == 执行科室ComboBox.SelectedValue)
                 throw new Exception("请先选择一个执行科室!");
                else
                        {
   if (this.Text == "医技申请单确认")         //根据窗口的标题去决定怎么干活,有点无赖
                      DRHis.Exam.Bus.Exam.Confirm( 医技申请单号 , 执行科室ComboBox.SelectedValue.ToString(),      操作员TextBox.EmpId.ToString(), 检验师TextBox.EmpId.ToString());
                 else if (this.Text == "医技申请单冲红")
                      DRHis.Exam.Bus.Exam.RefundExam( 医技申请单号 , 操作员TextBox.EmpId.ToString());
   else
    return;
   } 
                医技申请单号清空();
                重新查询申请(登陆部门, PerformFlag);
            }
            catch(Exception Ex)
            { MessageBox.Show(Ex.Message); }
        }
冲红界面没有确认按键代码。

第一次修改:将父类的 按键Click代码 改为保护级别(原来私有),去掉 窗口标题判断的 if语句,在子类 重写按键代码,
还将 操作员TextBox控件和  医技申请单号  变量的级别也变为了保护级别(原来私有)
 
确认界面的确认按键Click代码:
 protected void btEnter_Click(object sender, EventArgs e)
        {
            try
            {
                    if (执行科室ComboBox.Visible && null == 执行科室ComboBox.SelectedValue)
                        throw new Exception("请先选择一个执行科室!");
                    else
                        DRHis.Exam.Bus.Exam.Confirm( 医技申请单号 , 执行科室ComboBox.SelectedValue.ToString(),      操作员TextBox.EmpId.ToString(), 检验师TextBox.EmpId.ToString());
  医技申请单号清空();
                重新查询申请(登陆部门, PerformFlag);
            }
            catch(Exception Ex)
            { MessageBox.Show(Ex.Message); }
        }
冲红界面代码的确认按键Click代码:
 protected new void btEnter_Click(object sender, EventArgs e)
        {
            try
            {
                if (执行科室ComboBox.Visible && null == 执行科室ComboBox.SelectedValue)
                        throw new Exception("请先选择一个执行科室!");
                else
                        DRHis.Exam.Bus.Exam.RefundExam( 医技申请单号 , 操作员TextBox.EmpId.ToString());
                医技申请单号清空();
                重新查询申请(登陆部门, PerformFlag);
            }
            catch (Exception Ex)
            { MessageBox.Show(Ex.Message); }
        }
其实不是很满意,许多代码重复出现造成不易维护, 3个地方的私有被破坏就为了一个小小的功能,有些失败。

第二次修改:将父类的按键Click代码 改为原来的私有,还将 操作员TextBox控件和 医技申请单号 变量 的级别也变为了原来的私有
     抽象出变化的部分作成模板(保护级别)
确认界面的确认按键Click代码:
 private void btEnter_Click(object sender, EventArgs e)
        {
            try
            {
                if (执行科室ComboBox.Visible && null == 执行科室ComboBox.SelectedValue)
                    throw new Exception("请先选择一个执行科室!");
                else
                    ExecuteTemplate( 医技申请单号 ,操作员TextBox.EmpId.ToString());
                医技申请单号清空();
                重新查询申请(登陆部门, PerformFlag);
            }
            catch(Exception Ex)
            { MessageBox.Show(Ex.Message); }
        }
模板代码:
        protected virtual void ExecuteTemplate(string _医技申请单号 ,string 操作员Id)
        {
            DRHis.Exam.Bus.Exam.Confirm(_医技申请单号 , 执行科室ComboBox.SelectedValue.ToString(), 操作员Id,            检验师TextBox.EmpId.ToString());
        }
冲红界面代码:
确认按键Click代码已经被去除,换成模板代码:
 protected override void ExecuteTemplate(string _医技申请单号 ,string 操作员Id)
        {
            DRHis.Exam.Bus.Exam.RefundExam(_医技申请单号 , 操作员Id);
        }
还算比较满意了,用了 模板设计模式 实现了一定意义上的窄接口。

其实应该是先作一个抽象类,然后 确认界面 和 冲红界面都派生自这个类,但是不知为什么如果Form类申明为抽象(abstract)的话,子类的设计器打不开,很是奇怪。
只好用了上面的方法。因为如果不是 抽象类就不能定义抽象方法,那也还是只能用虚方法了。
如果用委托的话要先在程序集中定义委托还要在子类加一句委托赋值,反而更麻烦。

如果谁有更好的方法请留言

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值