dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>C/C++>C/C++技术资料>文章内容
Command模式应用实践
来源:bc-cn 作者:Wayfarer
  在我们开发的一个项目中,需要自己开发一个安装系统,便于部署特定环境下的产品系统。要求的安装界面如图19-1所示:


图19-1 安装系统界面

  根据安装步骤的不同,所要执行的安装逻辑也相应不同,然而客户要求的是能够提供“上一步”和“下一步”的操作,以便于随时回退或者继续向前安装。这也是一般安装系统所应具备的功能。


根据对安装业务的分析,整个安装共分为七个步骤:


(1)检测本地计算机并初始化安装系统;
(2)选择要安装的压缩包;
(3)复制安装所需的临时文件;
(4)选定安装目录;
(5)准备安装;
(6)执行安装;
(7)安装成功,退出。


  整个安装步骤中,每一步的安装界面都不相同,而这些界面都由特定的User Control体现,例如User Control中的提示信息、按钮、进度条等。

二、 坏的设计

  既然我们为每一个安装步骤定义了不同的UserControl对象,那么在每次执行安装时,仅需要利用Pannel控件的添加子控件方法即可,例如定义如下的方法:
private void AddBodyUC(UserControl uc)
{
 panBody.Controls.Clear();
 panBody.Controls.Add(uc); 
 panBody.Refresh();
}
  然后我们直接在主窗体中定义若干执行安装的方法,且根据安装的方向分类,例如:
private void PreviousStep1()
{}
private void NextStep1()
{}
  我们接着定义一个计数器,用于记录安装步骤数:
private int step = 1;
  同时,定义一个枚举类型,以指定安装的方向是“上一步”,还是“下一步”:
public enum OpDirection {Previous=0,Next}
  为了调用更加简单,在执行安装的方法基础上,重又定义了一系列的安装方法,并接收OpDirection对象,根据其值以判断执行的方法:
private void Step1(OpDirection direction)
{
 switch (direction)
 {
  case OpDirection.Previous:
   PreviousStep1();
   break;
  case OpDirection.Next:
   NextStep1();
   break;
 }
}
  现在,我们就可以直接在Button的Click事件中调用相关的方法了,例如:
private void btnNext_Click(object sender, System.EventArgs e)
{
  switch (step)
  {
   case 1: 
    Step1(OpDirection.Next);     
    break;
   case 2:
    Step2(OpDirection.Next);    
    break;
   case 3:
    Step3(OpDirection.Next);     
    break;
   case 4:
    Step4(OpDirection.Next);      
    break;
   case 5:
    Step5(OpDirection.Next);      
    break;
   case 6:
    Step6(OpDirection.Next);
    break;
   case 7:
    Step7(OpDirection.Next);
    break;
  } 
}
  这样的设计不可谓不简单,然而也不可谓不拙劣了。实际上,这样的设计实乃面向过程设计之遗毒,而完全丢失了面向对象设计的精神实质。粗略列举一下,至少存在以下缺陷:
(1)层次混乱,职责不明,众多实现代码都集中在一个主窗体类中,导致一个类过于庞大;
(2)逻辑虽然简单,然而代码却极为繁杂,且不利于代码的复用;
(3)极度僵化,尤其不利于可能的扩展;
(4)思路混乱,结构模糊,不利于代码之阅读,从而影响其他人对代码可能会有的修改。
  总之,这样的设计仿若一个拙劣的工匠胡乱敲打出来的一件半成品,非但谈不上设计之美,竟然连最基本的设计要素也不具备。勉强可说,够用而已。
那么,应该如何设计才能克服以上的缺陷呢?其实,从上述的设计中我们可以找到一些改善设计的端倪。最重要的设计原则,还是对象的职责划分。例如我们思考一下执行安装的方法,它们属于主窗体对象的职责范围吗?答案显然是否定的。既然这些方法不属于主窗体对象的职责,为什么我们还要将其定义在主窗体类中呢?
  那么,这些方法究竟属于哪一个对象?是每一个安装步骤所定义的UserControl对象吗?似乎是,然而又不尽然。一个UserControl对象,它的职责应该是什么?虽然是为各个安装步骤定义的类,然而它的职责主要还在于安装界面的相关逻辑,例如相关信息在界面上的显示,进度条的进度显示,还包括Button响应Click事件所可能执行的方法。而执行安装,严格说来,却与这些对象无关。
  既然找不到安装方法所属的对象,为什么不为其专门定义相关的对象呢?思路到了这里,就有了豁然开朗的喜悦了。


上一篇:算术编码用c++的实现   下一篇:泛型<编程>:volatile——多线程程序员最好的朋友volatile修正符及让你的编译器为你检
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·C语言数组排序小结
·Python 与 C++ 程序的简单实例对
·c++ 数组与指针
·C++中的内存管理(new、delete、
·如何用C语言开发DSP嵌入式系统
·如何用C语言开发DSP嵌入式系统
·Linux下C语言编程
·学习arm的话先看哪本书?
·C++初学者应该关心的优秀图书一
·利用C语言小程序来解决大问题
·用C语言写PHP扩展的步骤
·用C语言扩展PHP功能
  相关文章
·算术编码用c++的实现
·泛型<编程>:volatile——多线程
·论C/C++函数间动态内存的传递
·mscorwks.dll在.Net中的地位以及
·C++箴言:只要可能就用const
·C++基本数据类型与输入输出
·C++箴言:将强制转型减到最少
·C++类对象的复制-拷贝构造函数
·C++箴言:理解inline的介入和排
·C++类对象的拷贝构造函数
·C++箴言:绝不在构造或析构期调
·Vista后,C++ Builder 
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763