.NET初学者架构设计指南(三)设计模式

在上一篇里面,我们初步了解了OO设计,OO设计的最独特之处在于他看待需求的方式。用这样的方式 ,我们不需要急于确定软件需要实现哪些流程、设计哪些功能点、制作哪些画面,而是要关注需求中一 些更加基本的概念。首先根据这些概念开发出一些零件,然后把这些零件组装起来实现需要的功能。用 这样的方式,我们不需要一开始就去知道所有的业务需求,只需要知道一些比较重要的需求,就可以开 始开发了。这样开发出来的程序不仅可以实现当前的需要,同时也是一个业务开发的平台,在这个平台 上可以不断的开发新的功能。

这种设计思想有很多实际的例子,比如Microsoft Office。下面的 图就展示了Excel里面最基本的几个对象:


Excel的各项功能都是建立在这个对象模型基础上的。比如要实现设置字体 的功能,就可以这样编写:先打开一个字体对话框,使用者选择字型、字号,然后把这个字体设置到区 域上:

Font font = CommonFontDialog.ChooseFont();
Application.ActiveWorkbook.ActiveSheet.Range("A1").Font = font;

Excel还把这些对象的引用暴露给了脚本引擎,于是我们就可以使 用VBA调用他们,实现我们自己想要的各种功能,这就是Office宏。我们可以编写一段VB脚本,把鼠标选 中区域的单元格复制到另一个工作表中,然后把某一个的单元格的值赋值为一个公式,计算出我们需要 的数值。Excel不仅本身是一个好用的制表工具,他更是一个强大、易用的开发平台。使用者可以随时根 据自己的想法,开发出需要的功能。一些大型的软件系统都是具有这样的特点,一开始就明确所有的功 能需求是不可能的,重要的是形成一个业务开发的平台,提供一些业务编程接口,在这个平台上就可以 不断的开发出新的功能。这样的开发方式不使用OO设计是很难实现的。

软件的第一个维护者和第 一个使用者就是开发者本人,因此,开发迅速、功能灵活、维护简单——这些特点在精心设 计的软件中经常是同时具有的。

运用OO方法设计程序的时候会遇到的这样困难:我们从需求中发 现了一些模糊的概念,但是怎样才能根据这些概念建立合理的对象模型呢,到底哪些概念应该是一个类 ,哪些概念只应该是一个方法和属性,这些类之间应该是什么样的关系?要解决这个问题,最根本的途 径当然是尽量深入的了解需求(比如说翻翻会计原理,看看应收款未收和已收的时候应该如何记账,其 中一个记账原则也许就是一个重要的对象;协助用户做一个供电方案,随手画出的草图,或者某个计算 公式就是一个重要的对象)。在解决了一个个困难之后,有人总结了经验,形成了一些解决特定问题的 固定套路,这样的套路就是设计模式。

有些设计模式和OO没有什么必然的关系,比如层次模式, 消息模式。但是大部分设计模式都是在OO设计中形成的,这些模式可以帮助我们发现系统中的对象、设 计对象之间的关系。了解这些模式可以帮助我们把软件设计的更加合理。并且,在探索需求的过程中, 我们也可以从模式中得到一些启发,获得设计的灵感,发现需求的真实面貌。

在上一篇我们看见 了“费用”这个类型:Fee,其实这就是一个简单的设计模式:组合模式(Composite)。这 个类的结构如下:


Fee类型是他本身的一个聚合,可以使用 GetChildren方法得到某个费用包含的其他费用。如果一个费用没有包含其他费用,他的金额就是由他自 己确定的,否则就是由他包含的费用相加确定的,这两种情况对外界提供的都是相同的方法:GetValue 。这样,我们想显示一个账单费用的时候,不用再去判断他是否包含了其他的费用,调用起来就简单了 很多。组合模式很好的体现了账单费用的层次包含关系。

刚才的情况里面,聚合类和元素类都是 同样的类型。也有些情况他们分别属于不同的类型。比如一个企业,他的营销网络是由下面一些元素组 成的:公司,市场部,直销店,代理商,自由代理人,营业员。如同下面的情况:


公司按照行政区域建立了多个市场部,市场部建立了自己的直销店,同时也 与很多代理商和独立代理人进行合作,直销店和代理商雇用了营业员。每天公司需要对每个销售网点的 情况进行查询和分析,需要知道他们定下了多少订单、收了多少货款、发展了多少新的客户。

这 是一个比较复杂的结构关系,网点类型比较多,他们的销售方式差异很大,各类数据统计的方式也不同 。并且在统计一些数值的时候,需要把下属网点的数量加起来,再加上自身的数量。如果采用组合模式 ,就可以解决这种问题。

时间: 2024-09-12 03:35:34

.NET初学者架构设计指南(三)设计模式的相关文章

.NET初学者架构设计指南(四)Model-View-Controller

Model-View-Controller简称为MVC,这是图形界面(GUI)应用程序的一种架构形式.Model是业务领 域层,比如我们在前面两篇里面提到的Account.Entry.Bill.Invoice之类的对象,这些类构成了一个 电信账务系统的业务领域层:View就是用户界面:Controller是指用户界面和业务对象之间的控制器, 控制器的作用是从业务对象中获取数据显示到用户界面上,并且从界面上收集用户的输入和动作,然后 调用业务对象完成业务功能. 大部分软件系统的工作可以总结成下面这

.NET初学者架构设计指南(二)OO设计初次见面

我使用OO技术第一次设计软件的时候,犯了一个设计者所能犯的所有错误.那是一个来自国外的外包 项目,外方负责功能设计,我们公司负责程序设计.编码和测试. 第一个重要的错误是,我没有 认真的把设计说明书看明白.功能点设计确实有一些问题,按照他们的设计,一个重要的流程是无法实 现的.于是我在没有与投资方沟通的情况下,擅自改动了设计,把一个原本在Linux系统上开发的模块改 到了Windows系统上.结果流程确实是实现了,但是很不幸,根本不符合他们的需要,比起原先的设计差 的更多.在询问了这个流程的设计

.NET初学者架构设计指南(一)Hello world的时代

中学的时候,学校里开设了电脑课.当时的电脑还是一种比较希罕的东西,学校里的电脑一共就十几 台,还专门找了一个大厅摆放这些机器.厅里面铺着厚厚的地毯,整天都拉着重重的窗帘.每次上课前 一天,我们需要沐浴更衣,剪好指甲.上课时大家都穿上鞋套,排好队伍,列队进入机房.然后各位同 学坐在座位上,在老师的指挥下,拿出一张五英寸的软磁盘,磁盘里安装着DOS操作系统,插入电脑的A 驱动器.然后依次打开显示器.主机电源,在一阵吱吱声中,等待着电脑的启动,进入一个充满了幻想 的神奇世界. 我就是在那个时候写出了第

走向ASP.NET架构设计第三章:分层设计,初涉架构(后篇)

接上篇 4.数据访问层设计 数据访问层,这块要说的不多.但是要澄清一点:数据访问不一定就是访问数据库,虽然多数的情况下,我们确实把数据存储在数据库中. 这里我们用数据库存储数据,并且用Linq To Sql来进行数据访问操作. 下面我们就来实现数据操作的一些代码: public class ProductRepository : IProductRepository { public IList<Model.Product> FindAll() { var products = from p

走向ASP.NET架构设计第三章:分层设计,初涉架构(前篇)

本篇主要讲述ASP.NET应用中如何进行逻辑分层.本篇的前篇会从Smart UI 反模式和它的一些缺点开始讲述,然后一步步的讲述如何逻辑分层,而且在后篇中也会给出一个ASP.NET设计中常用的仅供参考的分层架构的Demo. 一个稳定和易维护的系统必须建立在一个好的基础之上.计划和设计一个好的架构对一个项目的成败起着至关重要的作用.可能在我们一般做项目的时候,经验告诉我们:3层,N层的设计,基本就能把问题解决了,很多的情况确实是这样的.在提出一个设计的时候,常常要考虑为什么要这样划分结构,而且常常

一起谈.NET技术,走向ASP.NET架构设计——第三章:分层设计,初涉架构(中篇)

1.阐明示例需求 本篇还是用之前的电子商务网站中的一个简单的场景来讲述:在页面上需要显示产品的列表信息.并且根据产品的类型不同,计算出相应的折扣. 在上篇中,我们已经设计项目的逻辑分层.我们再来回顾下: 可能有的朋友认为从Smart UI立刻跳到这种分层设计,似乎快了些.其实也算是一个思想的跳跃吧.下面就来看看这种分层是如何解决之前Smart UI的问题的. 2.业务层设计 记得在之前的Smart UI的例子中,程序的业务逻辑是直接写在了ASPX页面后面的cs代码中的.现在,采用分层的方法,我们

走向ASP.NET架构设计第三章:分层设计,初涉架构(中篇)

1.阐明示例需求 本篇还是用之前的电子商务网站中的一个简单的场景来讲述:在页面上需要显示产品的列表信息.并且根据产品的类型不同,计算出相应的折扣. 在上篇中,我们已经设计项目的逻辑分层.我们再来回顾下: 可能有的朋友认为从Smart UI立刻跳到这种分层设计,似乎快了些.其实也算是一个思想的跳跃吧.下面就来看看这种分层是如何解决之前Smart UI的问题的. 2.业务层设计 记得在之前的Smart UI的例子中,程序的业务逻辑是直接写在了ASPX页面后面的cs代码中的.现在,采用分层的方法,我们

软件架构设计的三个维度

架构设计是一个非常大的话题,不管写几篇文章,接触到的始终只是冰山一角,更多 的是实践中去体会.这篇文章主要介绍面向对象OO.面向方面AOP和面向服务SOA这三个要 素在架构设计中的位置与作用. 架构设计有三个维度,或者说是我们在考虑架构时需要思考三个方向. 这三个维度分别为面向对象.面向方面.面向服务. 这三个维度可以看作是正交的,但不同维度会互相印证,互相支撑,整个架构的示意 图如图所示. 图:架构三维度结构图 面向对象 面向对象技术最初是从面向对象的程序设计开始的,它的出现以上世纪60年代S

一起谈.NET技术,走向ASP.NET架构设计——第四章—业务层分层架构(中篇)

在上一篇文章中,我们讨论了两种组织业务逻辑的模式:Transaction Script和Active Record.在本篇中开始讲述Domain Model和Anemic Model. Domain Model 在开发过程中,我们常常用Domain Model来对目标的业务领域建模.通过Domain Model建模的业务类代表了目标领域中的一些概念.而且,我们会看到通过Domain Model建模的一些对象模拟了业务活动中的数据,有的对象还反映了一些业务规则. 我们就来看看电子商务系统的开发,在