04 2012 档案

设计模式 3.5 Singleton(单件)-对象创建型模式
摘要:其实我已经写了一篇关于单件模式的随笔了,这里我将再重复一次的对这个模式进行记录。 1.意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点 2.动机 很明显,我们有时需要一个只有一个实例的类。例如,我们系统中可以有许多打印机,但却只应该有一个打印假脱机(printer spooler)。 3.适用性在类只能有一个实例而且客户可以从一个总所周知的访问点访问它时当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展实例事 4.结构 5.参与者 Singleton --定义一个Instance 操作,允许客户访问它的唯一实例。Instance是一... 阅读全文

posted @ 2012-04-30 16:34 lufangtao 阅读(330) 评论(0) 推荐(0)

设计模式 3.4 Prototype(原型)-对象创建模式
摘要:1.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 2.动机 为了更好的解决关于一个通用的图形编辑器框架和增加一些表示音符、休止符和五线谱的新对象来构建一个乐谱编辑器的问题。我们框架中为音符和五线谱这样的图形构件提供了一个抽象的Graphics类。为定义选择板中的攻击,还提供了一个抽象类Tool。该框架还为一些创建图形对象实例并将它们加入到文档的工具预定义了一个GraphicTool子类。但GraphicTool给框架设计者带来了一个问题。音符和五线谱的类特定于我们的应用,而GraphicTool类却属于框架。GraphicTool不知道如何创建我们的引用类实例... 阅读全文

posted @ 2012-04-28 22:05 lufangtao 阅读(342) 评论(0) 推荐(0)

C# Word.Office操作总结
摘要:最近这段时间,一直忙于修改一个我感觉从设计和编码方面都很烂的一个系统,各种软件设计中的错误,我们一边给他修改功能,一边进行代码重构,其中,让我感觉比较麻烦的是Office的操作,所以我就花了一点时间总结了这个项目中需要的Office.Word的基本操作,主要是在这项目中用到的操作,没有用到的也就没有涉及到。 首先,我要说一下的是Word中的表格操作。在我的程序中我是用WordTable这个类来实现的。按照一般思维,我们首先是需要一个Table对象,显然,这个对象是Microsoft.Office.Interop.Word.Table类型的。有了这个表格对象了,我们就可以在上面进行操作了,... 阅读全文

posted @ 2012-04-27 11:21 lufangtao 阅读(7279) 评论(0) 推荐(2)

设计模式-3.3 Factory Method(工厂方法) 对象创建型模式
摘要:1.意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类实例化延迟到其子类。 2.别名 虚拟构造器(Virtual Constructor) 3.动机 框架使用抽象类定义和维护对象之间的关系。这些对象的创建通常也由框架负责。 考虑这样一个应用框架,它可以向用户显示多个文档。在这个框架中年,两个主要的抽象类Application和Document。这两个类都是抽象的,客户必须通过他们的子类来做与具体应用相关的实现。因为被实例化的特定Document子类时与特定应用相关的,所有Application类不可能预测到哪个Document子类... 阅读全文

posted @ 2012-04-26 20:20 lufangtao 阅读(558) 评论(1) 推荐(0)

设计模式 3.2 Builder(生成器)对象创建型模式
摘要:1.意图 将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。 2.动机 一个RTF(Rich Text Format)文档交换格式的阅读器应该将RTF转换为多种正文格式。一种解决办法是用一个可以将RTF转化成另一种正文表示的TextConverter对象配置这个RTFReader类。当RTFReader对RTF文档进行语法分析时,它使用TextConverter去做转换。无论何时RTFReader识别了一个RTF标记(或是普通正文或是RTF控制字),它都发送一个请求给TextConverter去转换成这个标记。TextConverter对象复杂精细数据转换以及... 阅读全文

posted @ 2012-04-26 10:44 lufangtao 阅读(328) 评论(0) 推荐(0)

设计模式-3.1 Abstract Factory(抽象工厂)--对象创建型模式
摘要:我将按照描述一个设计模式的顺序进行以后博客的书写(其实,主要是设计模式这本书上是按照这个顺序进行书写的(*^__^*) )。 1.意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 2.别名 Kit(工具箱,装备) 3.动机。为了支持多种视感(look-and-feel)。客户仅与抽象类定义的接口交互,而不使用特定的具体类的接口 4.实用性(以下情况可以使用Abstract Factory模式)一个系统要对立与他的 产品的创建、组合和表示时一个系统要由多个产品系列中的一个来配置时当你要强调一系列相关的产品对象的设计以便进行联合使用时当你提供一个产品库,而只... 阅读全文

posted @ 2012-04-25 21:32 lufangtao 阅读(311) 评论(0) 推荐(0)

设计模式-3.创建型模式
摘要:创建型模式抽象了实例化过程。他们帮助一个熊独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。 随着系统演化得越来越依赖于对象复合而不是类继承,创建型模式变得更为重要。在这些模式中有两个不断出现的主旋律。第一,他们都将关于该系统使用那些具体的类的信息封装起来。第二,它们隐藏了这些类的实例是如何被创建和放在一起的。 这一章,我们将以一个迷宫游戏为背景,完成,Abstract factory(抽象工厂),Builder(生成器),Factory method(工厂方法),prototype(原型),Singleto... 阅读全文

posted @ 2012-04-25 21:08 lufangtao 阅读(397) 评论(0) 推荐(0)

设计模式-文本编辑器
摘要:这次,我将紧随设计模式第二章的步伐,来完成一个文本编辑器Lexi的实现,大部分内容都会原样的copy书中的东西,最后我将实现一个完整的文本编辑器,并且附上完整的源代码,好了,让我们开始吧。 一.设计问题文档结构 对文档内部表示的选择几乎影响到Lexi设计的每个方面。所有的编辑、格式安排、显示和问题吧分析都设计到这种表示。我们怎样组织这个信息会影响到应用的其他方面。格式化 Lexi是怎样将文本和图形安排在行和列上的?哪些对象负责执行不同的格式策略?这些策略又是怎样和内部表述相互作用的?修饰用户界面 Lexi的用户界面包括滚动条、边界和用来修饰WYSIWYG文档界面的阴影。这些修饰有可能... 阅读全文

posted @ 2012-04-25 15:45 lufangtao 阅读(5539) 评论(4) 推荐(0)

设计模式 一 引言
摘要:如何描述一个设计模式: 模式名和分类 模式名简洁地描述了模式的本质。意图 设计是做什么的?它的基本原理和意图是什么?他解决的是什么样的特定的设计问题别名动机 用以说明以俄国设计问题以及如何用模式中的类、对象来解决该问题的特定情景。该情景会帮助你理解随后对模式更抽象的描述。适用性 什么情况下可以使用该设计模式?该设计模式可用来改进那些不良的设计?你怎样识别这些情况?结构 采用基于对象建模技术的表示法对模式中的类进行图形描述。我们也使用了交互图来说明对象之间的请求序列和协作关系。参与者 指设计模式的类和或对象以及它们各自的职责协作 模式的参与者怎样协作以实现它们的职责效果 模式怎样支持它的目标.. 阅读全文

posted @ 2012-04-24 22:13 lufangtao 阅读(453) 评论(0) 推荐(0)

Head First--设计模式 单件模式 独一无二的对象
摘要:单件模式(Singleton Pattern):用来创建独一无二的,只能有一个实例的对象的入场券。 经典的一个单件 public class Singleton{ private static Singleton uniqueInstance; private Singleton(){} public static Singleton getInstance(){ if(uniqueInstance==null) { uniqueInstance=new Singleton(); } returnuniqueInstance; } } 单件模式:确保一个类只有一个... 阅读全文

posted @ 2012-04-24 19:37 lufangtao 阅读(471) 评论(0) 推荐(0)

Head First--设计模式 工厂模式 烘烤OO的精华
摘要:工程(factory)除了创建对象的细节。我觉得还是先记下书上的例子吧,再说了,这个例子很有意思。我们创建一个简单的披萨工厂类(simplePizzaFactory)。 public class SimplePizzaFactory { public Pizza CreatePizza(string type) { Pizza pizza=null; if(type.equals("cheese")) pizza=new CheesePizza(); else if(type.equals("pepperoni")) pizza=new Pepperon 阅读全文

posted @ 2012-04-24 16:00 lufangtao 阅读(492) 评论(0) 推荐(0)

Head First--设计模式(装饰者模式)
摘要:从现在开始,我将以写一个小软件的方式来进行模式识别的学习,包含需求分析,功能模块设计,原理图设计,程序实现这个几个部分,可能具体的模式模块不可能都包括在内。 需求分析:星巴兹咖啡店已经遍布全世界的很多对方,我们需要写个软件对它的咖啡店进行管理,主要是客户需要咖啡种类的管理,例如,我想要一个奶油咖啡,另一个人可能需要一个摩卡咖啡,所有,咖啡的种类会有很多,也就是可以理解为,咖啡加上它的修饰者,会产生很多的咖啡种类。并且,咖啡的不同的修饰者的添加数目不定,相同的修饰者添加数目也不定。所以,如果使用类继承,会产生类爆炸的情况,我们将使用装饰者模式进行设计。 装饰者模式:动态地将责任附加到对象上... 阅读全文

posted @ 2012-04-21 16:44 lufangtao 阅读(252) 评论(0) 推荐(0)

Head First--设计模式(观察者模式Observer)
摘要:我们首先给出观察者模式的定义: 观察者模式:定义了对象之间的一对多的依赖,这样一来,当一个对象改变状态时,它的所有的依赖者都会收到通知并自动更新。 通过这个模式,我们创建了一种松耦合的程序,当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此的细节。 这也是一条设计原则:为了交互对象之间的松耦合设计而努力。 下面,我把我认为好的一张示意图放在下面,一张很好的队观察者模式进行说明的一张图:同过这张图,我觉就可以完全传递了这个模式了,关于完整代码,我将放到后面。Weather.rar 阅读全文

posted @ 2012-04-20 22:30 lufangtao 阅读(229) 评论(0) 推荐(0)

Head First--设计模式
摘要:看了第一章的入门内容,我觉得真的很有意思,下面我就把书上那个对Duck类的学习总结一下,我们从问题的提出开始。问题一开始是这样的:设计一个Duck类,这个类时很多种类鸭子的超类,于是,我们不加思索的设计了下面的代码: public class Duck{ void quack();//鸭子叫声virtual void display();//鸭子的外观显示 void swim();//鸭子都会游泳}public class MallardDuck:Duck{void override display(){//显示为绿鸭子}}public class ReadheadDuck:Duck{... 阅读全文

posted @ 2012-04-17 19:52 lufangtao 阅读(277) 评论(0) 推荐(0)

.NET 设计规范--.NET约定、惯用法与模式--附录:C#编程风格约定
摘要:1.通用风格约定 1.1 花括号的使用 要把左括号放在前一条语句的末尾 if(someExpression){ DoSomething(); } 要使右括号与左括号所在行的首行对齐,除非花括号内只有一条语句 要把右括号放在新的一行的开始处 考虑把只有一条语句的代码块和左右花括号写在同一行中。属性的访问方法经常使用这种风格 public int Foo{ get {return foo;} set{foo=value;}} 考虑把只有一个访问方法的属性的所有的花括号写在同一行中。 public int Foo{get{return foo;}} 要使花括号单独占一行,除... 阅读全文

posted @ 2012-04-17 14:39 lufangtao 阅读(452) 评论(0) 推荐(0)

.NET 设计规范--.NET约定、惯用法与模式--8.使用规范
摘要:这里就如何在公用API中使用常用类型提供提供一些规范。 8.1数组 要在公用API中优先使用集合,而不是优先使用数组。 不要使用只读的数组字段。虽然字段本身是只读的,用户不能对其进行修改,但对用户可以修改数组中的元素 有两种方法可以避免使用只读的数组字段,一种是使用只读的集合,另一种是在返回数组之前对其进行复制 考虑使用不规则数组(jagged array),而不是要使用多维数组 //jagged arrays int [][] jaggedArray={ new int[]{1,2,3,4}, new int[]{5,6,7}, new int[]{8}, new ... 阅读全文

posted @ 2012-04-17 09:53 lufangtao 阅读(322) 评论(0) 推荐(0)

.NET 设计规范--.NET约定、惯用法与模式--7.异常
摘要:7.1 抛出异常 操作失败就是成员不能完成应该完成的任务(成员的名字所暗示的任务)。 不要返回错误码 要通过抛出异常的方式来报告操作失败 考虑用过调用System.Environment.FailFast来终止进程,而不要抛出异常,如果代码遇到了严重问题,已经无法继续安全地执行。 不要将正常的控制流中使用异常,如果能够避免的话 考虑抛出异常可能会对性能造成的影响 要为所有的异常撰写文档,并把它们作为协定的一部分,前提是这些异常时由于违反了公有成员的协定而抛出的。 不要让公有成员根据某个选项来决定是否抛出异常 不要把异常用作公有成员的返回值或输出参数 考虑使用辅助方法来创建异... 阅读全文

posted @ 2012-04-16 21:32 lufangtao 阅读(343) 评论(0) 推荐(0)

.NET 设计规范--.NET约定、惯用法与模式--6.为扩展性而设计
摘要:6.1 扩展机制 6.1.1 非密封类 密封类即无法派生子类,也无法扩展。与此相反,非密封类可以派生子类进行扩展 //string cannot be inherited from public sealed class String{} //TraceSource can be inherited from public class TraceSource{} 正因为如此,如果需要既简单有开销不大的扩展方法,那么没有声明任何虚成员或保护成员的非密封类时不错的选择。 考虑用不包含任何虚成员或保护成员的非密封类来为框架提供扩展性,这种方法的开销不高,用户也喜欢。 6.1.2 保... 阅读全文

posted @ 2012-04-10 20:51 lufangtao 阅读(281) 评论(0) 推荐(0)

.NET 设计规范--.NET约定、惯用法与模式--5.成员设计
摘要:方法、属性、事件、构造函数已经字段统称为成员。 5.1 成员设计的一般规范 5.1.1 成员重载 成员重载是指在同一个类型中创建两个或两个以上的成员,这些成员有相同的名字,唯一不同的是参数的数量或参数的类型。因为只有方法、构造函数以及索引属性可以有参数,所以只有这些成员可以被重载。 要尽量用描述性的参数名来说明在较短的重载中使用的默认值。在一族对参数的数量进行重载的成员中年,较长的重载应该用参数名来说明与之对应的较短的重载所使用的默认值,这最适用于布尔型参数。 避免在重载中随意地给参数命名。如果两个重载中的某个参数表示相同的输入,那么该参数的名字应该相同。 避免使重载成员的参数顺... 阅读全文

posted @ 2012-04-09 20:58 lufangtao 阅读(297) 评论(0) 推荐(0)

.NET 设计规范--.NET约定、惯用法与模式--4.类型设计规范
摘要:要确每个类型有一组定义明确、相互关联的成员组成,而不仅仅是一些无关功能的随机集合。 4.1 类型和名字空间 要用名字空间把类型组织成一个相关的特性域的层次结构,该层次结构应该为开发人员更容易地浏览框架并找到想要的API而优化。 避免非常深的名字空间层次。这样的层次难于浏览,因为用户不得不经常的回溯。 避免有太多的名字空间。在最常见的场景中,框架的用户应该不需要导入许多的名字空间。只要有可能,就应该把常见场景中一起使用的类型放在一个单独的名字空间中。 避免把为高级场景而设计的类型和为常见编程任务而设计的类型放在同一个名字空间中。 不要不指定名字空间就定义类型 标准子名字空间的命... 阅读全文

posted @ 2012-04-09 14:31 lufangtao 阅读(349) 评论(0) 推荐(0)

.NET 设计规范--.NET约定、惯用法与模式--3.命名规范
摘要:1.大小写约定 1.1标示符的大小写规则 为了区分一个标示符中的多个单词,把标示符中每个单词的首字母大写。不要用下划线来区分单词,或者在标示符中的任何地方使用下划线。PascalCasing约定被用于处理参数名以外的所有标示符,它把标示符中每个单词的首字母(包括长度为两个字符以上的首字母缩写词)大写,两个字母长的首字母缩写词是一个特例,在这种情况下两个字母都要大写,例如IOStream.camelCasing约定仅用于参数的名字,它把标示符中除了第一个单词之外的所有单词的首字母大写,如果camelCasing风格的标示符以两个字母长的首字母缩写词开始,那么两个字母都要小写。要把Pasca... 阅读全文

posted @ 2012-04-08 16:54 lufangtao 阅读(594) 评论(0) 推荐(0)

.NET 设计规范--.NET约定、惯用法与模式-2.框架设计基础
摘要:要设计既功能强大又易于使用的框架 要明确的为具有不同编程风格、需求、技能以及使用不同编程语言的开发人员设计框架 要了解那些使用多语言框架的广大开发人员1.框架设计的基本原则场景驱动设计原则:必须从一组使用场景以及实现这些场景的样例代码开始。要确保对任何包含公有API的特性的设计来说,其核心部分都是API设计规范。要为每一个主要的特性域定义一些最常见的使用场景。要确保使用场景与适当的抽象层次相对性。场景应该大致与最终用户的用例相对应。要以这样的方式来设计API:先为主要的使用场景编写样例代码,然后再定义对象模型来支持这些样例代码。要用至少两种不同的编程语言来为主要的场景编写样例代码,最好... 阅读全文

posted @ 2012-04-08 11:43 lufangtao 阅读(310) 评论(0) 推荐(0)

.NET 设计规范--.NET约定、惯用法与模式--1.概述
摘要:当可重用程序库的供应商为了开发其高层API而采纳面向对象编程时,就产生了框架(framework)的概念。框架的引入使得开发人员不再需要重头开始编写应用程序。框架会提供所需的大部分功能,这些功能经过开发人员的定制和连接,就得到了最终的应用程序。 这些规范为我们这些框架设计者提供了一套工具,可以在自己和使用框架的开发者之间形成一种共同语言。精心设计的框架所具备的品质 简单设计代价高充满利弊权衡借鉴过去考虑未来发展良好的集成性一致性 阅读全文

posted @ 2012-04-08 10:24 lufangtao 阅读(269) 评论(0) 推荐(1)

Microsoft.NET框架程序设计--20 CLR寄宿、应用程序域、反射
摘要:应用程序域是CLR提供的一种旨在减少内存使用、提高系统系能的新型机制。而反射使得我们可以很容易使用自己活着第三方的类型来增强应用程序的功能,从而帮助我们设计出可动态扩展的应用程序。1.元数据:.NET框架的基石元数据描述了一个类型的字段和方法。元数据使得一种语言开发的类型可以被另一种不同的语言所使用。反射允许我们构建可动态扩展的应用程序。一个方法可以使用反射从其他代码中获取信息来改变自己的行为。一个方法还可以使用反射来根据调用者的信息改变自己的行为。2.CLR寄宿 在开发CLR时,微软实际上是将其作为以一个COM服务器实现在一个DLL内。也就是说,微软为CLR定义了一个标准的COM接口,并.. 阅读全文

posted @ 2012-04-07 10:36 lufangtao 阅读(386) 评论(0) 推荐(0)

Microsoft.NET框架程序设计--19 自动内存管理(垃圾收集)
摘要:1.垃圾收集平台基本原理解析访问一个资源所需要的几个步骤: 调用中间语言(IL)中的newobj指令,为表示某个特定资源的类型实例分配一定的内存空间。当我们在C#或者Visual Basic 以及其他一些编程语言中调用new操作符时,编译器将产生newobj指令初始化上一步所得的内存,设置资源的初始化状态,从而使其可以为程序所用。一个类型的实例构造器负责这样的初始化工作。通过访问类型成员来使用资源,这根据需要会有一些反复。销毁资源状态,执行清理工作释放内存,这一步右垃圾回收器全权负责。(注意这里的内存指的是分配在托管堆上的引用类型实例所占有的内存资源。处理托管堆中的内存,系统运行时还有一类内. 阅读全文

posted @ 2012-04-06 10:54 lufangtao 阅读(247) 评论(0) 推荐(0)

Microsoft.NET框架程序设计--18 异常
摘要:异常处理的好处: 1.利用异常处理,我们可以将资源清理代码放在一个固定的位置,并且确保它们得到执行。 2.利用异常处理,我们可以将处理异常的代码放在一个集中的位置。 3.利用异常处理,我们可以很容易定位和修复代码中的bug。1.异常处理的演化大多数Win32 API都返回FALSE来表示函数调用出现了问题,而调用者则可以通过调用GetLastError函数来获得这些问题的相关信息。另一方面,COM选择了返回一个HRESULT来描述问题。如果HRESULT的高位为1,则表示一个假设被违反,HRESULT的其余位表示的值则可以帮助我们判断问题的原因。异常对象相较于32位的错误码值有这诸多的优... 阅读全文

posted @ 2012-04-05 09:01 lufangtao 阅读(254) 评论(0) 推荐(0)

Microsoft.NET框架程序设计--17 委托
摘要:1.认识委托 在.NET框架中,回调函数仍然像在非托管Windows编程中一样有用和普遍。但是,.NET框架为回调函数提供了一种称为委托的类型安全的机制。在这里,我copy一下书籍上的一个很好的例子:namespace @delegate{ class Set { private Object[] items; public Set(int numItems) { items = new Object[numItems]; for (int i = 0; i < numItems; i++) ... 阅读全文

posted @ 2012-04-04 19:13 lufangtao 阅读(342) 评论(0) 推荐(0)

Microsoft.NET框架程序设计--16 定制特性
摘要:定制特性(custom attribute)任何人都可以使用定制特性来定义一下信息,并将这些信息用于几乎所有的元数据表项上,然后在运行时通过查询这些可扩展的元数据信息来动态地改变代码的执行方式。1.使用定制特性定制特性仅仅是为了目标元素提供关联附加信息的一种方式。编译器仅仅只是检测源代码中的定制特性,然后产生相应的元数据。.NET框架(FCL)发布的时候带有很多预定义特性。例如System.FlagsAttribute,System.SerializeableAttribute等。C#中,将定制特性放在紧挨着目标元素前的一个方括号[,]中,表示将该定制特性应用到目标元素上了。在VB中使用的.. 阅读全文

posted @ 2012-04-04 16:05 lufangtao 阅读(332) 评论(0) 推荐(0)

Microsoft.NET框架程序设计--15 接口
摘要:1.接口与继承将一个对象看成多个类型的能力通常称为多继承。CLR支持单实现继承和多接口继承。CLR规定一个类型只能有一个基类型,System.Obejct是所有类型的最终基类型。这种继承称为实现继承(implementation inheritance),因为派生类型继承了基类型所有的行为和能力;派生类型可以有像基类型一样的行为。接口继承(interface inheritance)意味着一个类型继承的是接口中的方法签名,而非方法实现。当一个类型继承了一个接口时,它只是在许诺提供其中的方法实现;如果类型没有提供接口方法的实现,那么类型将被认为是抽象的,从而不可能被执行实例化。接口不会继承来自任 阅读全文

posted @ 2012-04-04 14:09 lufangtao 阅读(247) 评论(0) 推荐(0)

Microsoft.NET框架程序设计--14 数组
摘要:通用语言运行时(CLR)支持一维数组、多维数组以及交错数组(jagged array ,也就是数组的数组)。所有的数组类型都隐含继承自System.Array,System.Array本身继承自System.Object。这一晚这数组总是分配在托管堆上的引用类型,并且应用程序中的数组变量包含的是一个指向数组的引用,而非数组本身。 数组元素为值类型时,代码返回的是这些值的内存块的地址,而当数组元素为引用类型时,代码返回的是保存这些对象引用的内存块的地址。多维数组的创建形式:String[,,] myStrings=new String[5,3,10];1.所有数组的基类:System.Arra. 阅读全文

posted @ 2012-04-04 10:16 lufangtao 阅读(226) 评论(0) 推荐(0)

导航