2006年第12期 福 建 电 脑 43 设计模式的应用研究 李亦飞 (常州工学院计算机信息工程学院 江苏常州213002) 【摘要】:随着设计经验的不断积累,设计模式成为软件复用技术中的一个重要的概念。它是指把可复用的面向对象 的软件设计经验以文档的形式展现出来。并给予了系统的分类、命名、解释和评价。正确的模式可以提高软件的开发效率、可 复用性、稳定性和可维护性。 【关键词】:设计模式;面向对象;软件复用 1.设计模式简介 在面向对象软件设计中.设计可复用的软件是比较困难的 在面向对象的设计过程中.人们积累了一些经常使用的体系结 构和功能模块,这些模式化的经验.称之为设计模式(Design Pattems)。设计模式是经过分类编目、设计经验的总结。设计模 式的概念是工业化生产流程的要点.这对于提高软件开发效率 和质量做出了重大的贞献.程序员可以复用别人已经思考并且 得到了证实的通用设计模式.而不是从头开始的设计。 常见的设计模式是1994年Gang of Four(GoF)提出的23 种基本设计模式.引起了较大的反响.从此设计模式开始普及开 来,现在人们不断地尝试着模式化的软件开发。流行的Java、 Dot NET等开发语言中也广泛地使用着设计模式地思想。 一般模式有四个基本要素:模式名称(pattern rlame),通过 模式名称便于工作中的交流;问题(problem)。模式的使用场合, 它解释了在什么场合使川模式:解决方案(solufion),描述了设计 的组成部分,它们之间的关系和各自的职责和协作方式.提供抽 象意义的描述;效果(consequence8).选择模式的代价和优势。 2.模式结构 2.1创建型模式 对象通过实例化类来创建.该对象被称为该类的实例 创建 型模型解决对象实例化的问题.对象在随着系统的不同要求.需 要不同的实例化过程..比如多文档系统中.如何对文档进行实例 化。一个运行在不I百】平白的系统.如何在不同平台上使用该平台 特有的窗口界面来实现本系统的界面。以及.大多数系统中都会 创建一个用来记录日志的日志记录对象LDgger。这些都是创建 型模式可以实现的『口】题 1.Factol_v模式 仅仅定义对象的接口。实际实例化哪个类,由子类来决定。 比如在多文档系统的框架中两个主要的抽象类是Applicarl0n和 Document.使用者通过他们的于类 来做具体的实现 其中Applicarl0n 作用是Creator.实现文档的创建. Doeument作川是ProdUCt.完成文档 的具体功能(如图1) 这样做的优 势.抽象类Product定义的方法.在 抽象类Creat0r中 jJ以进行逻辑调 用.并通过CreatoIt的子类Concrete. Creat0r来确定.具体创建Product的 昌~图I雾 哪个子类ConcreteProduct的实例. .2.Singleton和Monostate模式 类和实例之间通常是一对多的关系.然而对于有些类.他们 确只有一个实例 如很多系统中的tq志记录对象.不同的对象使 用着统一个日志记录对象记录日志、Singleton模式通过屏蔽构 造方法.利用静态对象创建方法使类只能产生一个对象。 Monostate模式是另一种通过静态成员变量来获救对象 一性 的方法 让不同的实例对象表现地好像是一个对象 2.2结构型模式 在表示多个类或对象之问,如何通过组合来获得更大的结 构,结构型模式采用继承来组合接El和实现 1.Composite模式 捕述了如何构造一个类层次式结构.在次模式下通常有个 组合其它对象的容器类。通过容器类组合基元对象.表示出整体 和部分的关系,同时该容器对象有可以被其他的容器类组合.而 形成树型结构 2.Decorator模式 装饰(Decorator)模式使得在对象上动态地增加功能成为可 能,这是比继承来得更为灵活地功能扩充方法.可以比较方便地 扩充对象地属性和方法.图2 所示.ConcreteDceoratorA扩充 了addedState属性.Concret— eDecoratorB扩充了addedBe— havior0方法.而且这些变化都 可以动态地使用.在使用Co cfeteComponent时可以选掸使 用两个中的一个.也可以两个 都使崩.当然也可以不扩充功 能.这使得 户可以选择性地 图2 组合装配这些功能 2.3行为型模式 行为模式不仪描述对象和类的关系.还描述了它们之间的 通信关系。 Chain Of Responsibility模式.如果多个对象需要对请求有 响应的机会的时候.首先将这些对象设置成一个链表,这样每个 对象就有机会处理请求,同时也有权利选择处理还是不处理请 求.并有义务将这个请求传递给链表上的下一个对象这些处理 请求的对象的选择,和响应的优先次序可以动态地被指定。这在 工作流响应,上下文有关的帮助机制中得以使州 Command模式,将执行与请求分离.通过预先定义的操作 接口,比盘I】一个捕象的(:on・inand类,它定义一个执行操作的接 FI 通过继承该接口实现不同功能的执行实例.而这些执行实例 拥有相 的执行入口.请求层在接受到不同的请求的时候.就可 以方便地指定不 的实际执行操作.并且这些操作有着相I百j的 执行接¨。 3。设计模式府用 设计经验的重要价值.是在面对需要解决的问题的时候.把 解决问题的方法和已有的经验联系起来.这并不是一件容易的 事情 在解决相似问题的人们会使用不同解决方案.而模式是要 缩小其关注的焦点.提取设计之间的相似之处 使用模式可以复 用解决方案、通过复用已经建立好的设计.而不是从零开始的设 计.避免多走不必要的弯路 住仓库信息管理的系统开发中.系统可保存日常仓库中进 出库所需的各种信息.包括物品、仓库、库存、警戒线、进出库信 息等 必须为每种信息的输人、验证和修改都提供单独的界面. 以便用户进行交互。通常会为各种信息的处理(下转第35页) 维普资讯 http://www.cqvip.com
2006年第l2期 福 建 电脑 35 问中的记录数目小于LIMITs,就把它和第一个区间合并;为了保 点,它把最初划分的各个区间分成两个集合:一个包含概率小于 证区间的离散化不至于把属性的值域划分的太过分散.必须让 或等于p 的A上的各个区间,另一个包含剩下的概率高于 离散后划分出的区间数目少于某个限定的阀值uMITf。 3.2转化为概率属性 的A上的各个区间 被D 区分的两个集合中可能包含几个初始区间。因为它们 假设在初始离散化.并将记录数目小于LIMITs的区问合并 对于属性P有相似的性质,即概率值都大于或小于p ,所以把 后得到k1个区间.接下来我们估算一下在每个区间中各个类的 在相同集合里的相邻区问结合。假设在结合后,两个集合中的区 显然k2≤kl。在图1中,k1=25,k2=5。属性P的 概率.在这里我们仪讨论分两类的问题。假设在属性A上的某 间总数目是k2.个区间Ri与训练数据子集合n相关.即子集合Ti中的记录在 二分法对应于属性A的k2个分裂.结合后的集合可以这样描 属性A上的取值都在区间m内。设在集台 中属于第一个类 述:的记录个数H】N(C1.Ti)表示 则在集合Ti中的各个类的概率估 TI={s l val A(s)≤al Or a2<val A(s)≤a3 or a4<val 算是: A(s),S∈T} 3"2={s 1 al<valA(s) ̄a2< or a3<valA(s)≤a4,S E T1 p(C T)=N(C。,TJ/ITil (3.1) T1和1、2就是原训练样本记录集合T根据属性A的取值经 p(C ,Ti)=1一p(CI,Ti) (3.2) 其中T1有三个 第一个类在各个区间的概率估计为P(C。,T。),P(C。,T2),…,P 概率转化,以及二分离散化后的最终分裂结果.(C , 。1。我们把属性A的取值范同分别分配到类别C1的概率 结合的区间. r2有两个 空间里.通过用另一个取值范丽在『0,11的连续属性P来替换A。 4.结论 改进的连续属性处理方法基于统计概率信息.把连续属性 替换规则是: 映射到概率属性里,再用二分法,比较信息增益,求得概率属性 if val^(S)∈R then valP(s) P(Cl,T,). 对应的把连续属性不相邻的取值区间合并.从而 这样就完成了从连续属性到概率属性的转化 接下来,再用 的最佳分裂点.二分法寻找概率属性P上的最佳分裂点。假设在概率属性P上 将训练样本集分裂。这种分裂在本质上.是结合了离散属性的处 取值的上升离散序列为Ip1,p:…,P },对任意一个这个序列里的 理方法.按照分布在连续属性不同取值区间上的记录属于不同 值t=Pi(1≤i≤k,),都可能作为分裂点 这个分裂点将把集 类别的概率统计信息进行的 它把记录在属性上的取值与记录 合T划分成两个子集合:子集T】(集合中的任意记录S在概率属 的类别紧密地结合起来.与原来在连续属性取值区间上的直接 该方法大大增加了决策树的分类精度 、 性P上的取值valP(s)≤t)与子集T1(valP(s)>t)。让t=p 是具有最 分裂相比.大信息增益的分裂点,那么p 就是我们需要的最佳分裂点。 3.3区间结合 参考文献: 经过上述属性转化.原来的连续属性A和经转化的概率属 1陈京民等.敷据仓库与数据挖掘技术第1版北京:电子工业出版社, 性P之间的关系如下罔1中所描述.其中水平轴和垂直轴分别 表示原来的连续属性A和转 2002 2.【 ̄lJiawei Han,【]Micheline Kamber.数据挖掘:概念与技术.范明盂 小峰等译第1版北京:机械工业出版社.2001 化的概率属性P 图1中水平 轴上的区间是属性A经初始 化后的区间.较宽的那几个区 间(在A取值空间中.区间的 3.J.Ross Quinlan.C4.5:Programs for Machine learning.Morgan Kaufman. 1993 4 Computer and Information Sciences Department in the CoHege of Sci— ence and Technology of Temple University Building Classiicatfion Mod- els 1D3 and C4.5..http:|| .cis.temple.edu/一ingargio/ 取值范围比其它的大)说明它 们是那些由于记录数目小于 HM1Ts而和相邻的区间结合 而成的区间 较高的那些说明 它们的记录属于高概率的一 (0 类 D}是P属性的最佳分裂 -+”-+一-+一-+--+一—+r一+“+ —- ,-+一一—+一一—+一- cis587/readings/id3一c45 htm1.1999 5姜欣.徐六通.张雷.c4.5决策树展示算法的设计计算机工程与应 用2003(4):93-94.97 m I t㈨ 6蒋艳凰,扬学军,赵强利.具有高可理解性的二分决策树生成算法研 究软件学报.2003.14(121:1996—2005 图1属性A与属性P的关系 -4-一+一+“—■一*—- 一-4-一-4---4--—卜 (上接第43页) 编写相应的用户界面,通常的实现方法是为独立地对每个数据 访问进行实现,当项目到达一定的规模的时候.其实现会由 其代价是大量的人力和时问.软件的可扩展性差。因此使厢 行为型模式的Coremand模式.建立接口IEdit.并为IEdit接口定 义Insert、Update和Delete等方法的声明。处理信息的类CPm. duetEdit.CStockEdit等等编辑类实现这个接n.并完成Inse ̄、 Update和Delete方法的实现 而这些编辑类为后面的调用、已经 以后程序的扩展带来了方便 然后还需要建立创建CProductEdit、CStoekEdit的工厂类。 这里使 了创建型模式的Factory模式。所以定义了CEditFacto. ry类来创建IEdit接口的编辑类.但是CEditFaetory并不亲自实 现具体的编辑类.而是有CEditFactory的于类CPmductFactory 创建部分延迟到于类或子对象中:结构型模式描述了使用继承 等机制来组合和组装类或对象:行为型模式则描述算法和控制 流.完成一组对象怎样协作完成单个对象所无法完成的任务。 4.结束语 设计模式是一种共享的经验方式.为了具有最广泛的适用 性.设计模式通常是从具体的实践中抽象而来的 设计模式的使 用不能生搬硬套,将不同的设计模式合理的配合、改进.在抽象 的层次』二可以统一考虑的类,可以考虑使用设计模式。设计模式 给设计和开发带来了很多好处.因而成为研究的焦点.随着技术 的不断发展和完善.设计模式的种类也在日益增多 在系统设计 开发中利用上述选择策略进行模式选取.精化利用.可以优化系 统的性能.提高软件设计的灵活性 和CStockFaetory来创建具体的编辑类.而CProduetFactory等 参考文献: 类.才是编辑类的具体创建者,也是CEditFactory的具体实现, 1 Erich Gamma,Richard Helm,Ralph lohnson,lohn Vhsmdes设计模式一 最后由FrameWork程序来调用拥有相同接口的编辑类 M1机械工业出版社 2005:71 75. 整个系统中还使用了Singleton模式实现了日志类CLog.使 可复用面向对象软件的基础fan Shallowa 设计模式解析lMl_人民邮电出版社.2006:184—190. 不同对象的调用中始终使用同一个CLog对象,这样也提高了只 2 Al志的记载效率 3伽玛设计模式一可复用面向对象软件的基础IMl机械工业出版社, 2005 70 75. 根据模式的日的进行分类.也就是模式可以完成什么工作。 4泮海敏,陈奇一个基于模式的快速查询构建系统订1.计算机工程与谩 创建型模式为对象的创建提供了不同解决方案.比如将对象的 计。2005.26(1):174 176.
因篇幅问题不能全部显示,请点此查看更多更全内容