封装变化(Part One)

转载 2006年06月13日 14:14:00

封装变化(Part One)

Filed under: Design & Pattern — bruce zhang @ 8:16 pm

        软件设计最大的敌人,就是应付需求不断的变化。变化有时候是无穷尽的,于是项目开发就在反复的修改、更新中无限期地延迟交付的日期。变化如悬在头顶的达摩克斯之剑,令许多软件工程专家一筹莫展。正如无法找到解决软件开发的“银弹”,要彻底将变化扼杀在摇篮之中,看来也是不可能完成的任务。那么,积极地面对“变化”,方才是可取的态度。于是,极限编程(XP)的倡导者与布道者Kent Beck提出要“拥抱变化”,从软件工程方法的角度,提出了应对“变化”的解决方案。而本文则试图从软件设计方法的角度,来探讨如何在软件设计过程中,解决未来可能的变化,其方法就是——封装变化。

设计模式是“封装变化”方法的最佳阐释。无论是创建型模式、结构型模式还是行为型模式,归根结底都是寻找软件中可能存在的“变化”,然后利用抽象的方式对这些变化进行封装。由于抽象没有具体的实现,就代表了一种无限的可能性,使得其扩展成为了可能。所以,我们在设计之初,除了要实现需求所设定的用例之外,还需要标定可能或已经存在的“变化”之处。封装变化,最重要的一点就是发现变化,或者说是寻找变化。

GOF对设计模式的分类,已经彰显了“封装变化”的内涵与精髓。创建型模式的目的就是封装对象创建的变化。例如Factory Method模式和Abstract Factory模式,建立了专门的抽象的工厂类,以此来封装未来对象的创建所引起的可能变化。而Builder模式则是对对象内部的创建进行封装,由于细节对抽象的可替换性,使得将来面对对象内部创建方式的变化,可以灵活的进行扩展或替换。

至于结构型模式,它关注的是对象之间组合的方式。本质上说,如果对象结构可能存在变化,主要在于其依赖关系的改变。当然对于结构型模式来说,处理变化的方式不仅仅是封装与抽象那么简单,还要合理地利用继承与聚合的方法,灵活地表达对象之间的依赖关系。例如Decorator模式,描述的就是对象间可能存在的多种组合方式,这种组合方式是一种装饰者与被装饰者之间的关系,因此封装这种组合方式,抽象出专门的装饰对象显然正是“封装变化”的体现。同样地,Bridge模式封装的则是对象实现的依赖关系,而Composite模式所要解决的则是对象间存在的递归关系。

行为型模式关注的是对象的行为。行为型模式需要做的是对变化的行为进行抽象,通过封装以达到整个架构的可扩展性。例如策略模式,就是将可能存在变化的策略或算法抽象为一个独立的接口或抽象类,以实现策略扩展的目的。Command模式、State模式、Vistor模式、Iterator模式概莫如是。或者封装一个请求(Command模式),或者封装一种状态(State模式),或者封装“访问”的方式(Visitor模式),或者封装“遍历”算法(Iterator模式)。而这些所要封装的行为,恰恰是软件架构中最不稳定的部分,其扩展的可能性也最大。将这些行为封装起来,利用抽象的特性,就提供了扩展的可能。

利用设计模式,通过封装变化的方法,可以最大限度的保证软件的可扩展性。面对纷繁复杂的需求变化,虽然不可能完全解决因为变化带来的可怕梦魇,然而,如能在设计之初预见某些变化,仍有可能在一定程度上避免未来存在的变化为软件架构带来的灾难性伤害。从此点看,虽然没有“银弹”,但从软件设计方法的角度来看,设计模式也是一枚不错的“铜弹”了。

相关文章推荐

MongoDB权威指南—读书笔记(Part one)

MongoDB权威指南—读书笔记(Part One)非常棒的官方网站!MongoDB基础知识 文档是MongoDB中数据的基本单元,非常类似于关系学数据库管理系统中的行,但更具表现力。 类似地,集合(...

java_12-24-part one

1.方法重载(overload)表示2个或多个方法名字相同,参数不同(参数个数,顺序,类型不同) 注意:方法的返回值类型对重载没有任何的影响2.构造方法名=类名,构造方法可以重载。first: 如果...

正则表达式学习指南(十九)----Testing The Same Part of a String for More Than One

Testing The Same Part of a String for More Than One Requirement Lookaround, which I introduced in d...

Windows Communication Foundation入门(Part One)

前言:WCF是微软基于SOA(Service Oriented Architecture)推出的.Net平台下的框架产品,它代表了软件架构设计与开发的一种发展方向,在微软的战略计划中也占有非常重要的...
  • iamdll
  • iamdll
  • 2011年02月23日 10:55
  • 208

ELF解析(part one)

最近学习了ELF格式文件,在学习过程中产生过很多疑惑,也翻找了不少网上资源。期间经常会惊讶于设计者的思路。预计整个工程分成三个部分,这里是第一个部分,介绍了一些前期遇到的问题。因为这是这个月的最后一天...

第一部分,介绍和指南(Part One: Introduction and Tutorial)

原文链接:http://blog.sina.com.cn/s/blog_53988c0c0100osmk.html 第一部分,介绍和指南(Part One: Introduction...

Windows rootkits of 2005, part one(翻译)

注:本技术文章写的太好了,情不自禁的转载了,让更多的人来尽情技术狂欢!!! 原文地址:http://blog.csdn.net/coding_hello/article/details/1652...

初涉USB入门 - Part One Summary

  今日刚刚拿到毕业设计的众多资料,发现自己的毕业设计牵扯到许多方面:Linux驱动程序设计;USB协议;单片机板。能同时接触这么多方面的知识确实另我很是开心,同时也感到了点压力,不知道该怎么入手,不...
  • WInScar
  • WInScar
  • 2011年05月11日 09:32
  • 851

vim实用技巧学习part_one

vim实用技巧学习 part one入门使用命令dw​ 删除光标下的单词/​ /the 高亮显示查找的匹配项 thevittext //当光标在a上面的时候 实用vit命令光标跳转到tex...

Python Foundation - part one

Python
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:封装变化(Part One)
举报原因:
原因补充:

(最多只允许输入30个字)