代码改变世界

随笔档案-2011年07月

设计模式之--责任链模式

2011-07-29 14:28 by java线程例子, 294 阅读, 收藏,
摘要: 在一些情况下,对一个消息(含事件)的响应和处理需要很多对象来参与,这些对象对消息的处理有前后顺序,形成一个处理链条,但对象是否真正处理消息有赖于在它之前的对象的处理策略,前一个对象处理后,后一个对象则不需参与处理,这就是责任链模式。现实中有很多类似的场景,比如上访,上访一般是从最基层的信访部门接受信访开始进行处理,如果下一级信访部门无法处理,则交给上一级部门进行处理,这样一级一级的处理,知道最高信访部门。这样所有层级的信访部门就构成了一个责任链。 责任链模式在设计中的应用很多,比如Delphi中对系统对消息的处理,对异常的处理等。只是建立责任链的方式可能不同,有的是建立明确的处理责任链,如消息 阅读全文

设计模式之--中介者模式

2011-07-29 14:25 by java线程例子, 268 阅读, 收藏,
摘要: 在很多情况下对象之间的交互是很复杂的,在开始设计的时候,你根本不知道它需要交互的对象是谁,是什么类型。我们知道如果要对象A与对象B之间能相互交互,A与B就会构成相互依赖,如果对象一多,这种依赖就会很复杂,况且很多时候我们都不知道需要互相交互的对象有哪些,因此,在设计的时候也没办法考虑这些情况。既然在设计的时候无法预先知道对象之间的交互具体情况,我们可以将这种交互放到一个“中间平台”进行,这个中间平台知道所有对象的(依赖于所有对象,但对象是否必须依赖于平台不是必须的),这样就将对象之间的依赖简化成对象与“平台”之间的依赖,因而会大大降低对象之间的复杂度。当然,对象在平台能够进行交互,必须遵守一定 阅读全文

设计模式之--观察者模式

2011-07-29 14:20 by java线程例子, 285 阅读, 收藏,
摘要: 在日常生活中,有很多需要我们关注的事务(比如,股市,楼市等),这些事务我们可以称之为主题或者叫信息发布者,观察主题的目的是想了解主题的变化(消息)。一种方法当然是采用盯人策略,但这种方法有个固有的缺点,就是你盯住主题的时候,无法干其他事情,如果需要了解的主题比较多,这种办法就很麻烦了;另外一种就是主题广播,我想听的时候我就去听,不想听的时候我就不听,这种方式的好处就是可以使得观察者不用盯住主题,但缺点是如果信息发布者的信息发布是不固定的,观察者(信息接收者)可能会漏掉信息。这两种方式都各有利弊,局域网中的信息传送采用的其实就是主题广播方式,只是接收者也是盯人战术。还有一种方式就是信息发布者提供 阅读全文

WCF RIA Services---学习记录(1)

2011-07-28 11:23 by java线程例子, 183 阅读, 收藏,
摘要: 客户端得实体能否进行插入,修改和更新,在于对应的services服务端是否有对应的函数,可用Delete,Insert,Update元属性标签来指定对应方法。这种控制,估计是WCF RIA services安全的一部分。实际上,也只是简单的标签化,至于你的实际插入,修改和删除采不采用这些函数是无关紧要的。但至少可以通过这种标签来确定客户端能对你暴露的实体做什么事情,有个控制机制。其实通过这种方式控制客户端实体的IUD,完全可以通过另外的元属性来指定为好,因为按它要求的插入,删除和修改函数都不能返回值,这确实是个不好的特征。希望在以后的版本中,能克服这个缺点。 阅读全文

设计模式之--访问者模式

2011-07-28 09:18 by java线程例子, 175 阅读, 收藏,
摘要: 《设计模式》一书对于访问者模式给出的定义为:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。从定义可以看出结构对象是使用访问者模式必须条件,而且这个结构对象必须存在遍历自身各个对象的方法。设想一个场景,就是学校,学校里有老师和学生,老师和学生可以称为两种元素,我们可以对这些元素进行很多操作(注意,这些操作都是外部性质的,不属于元素本身,这个至关重要),比如评价,问卷调查,采访和体检等,如果我们把这些操作定义在元素层次,显然不合理,一是这些操作不是元素对象的固有属性和行为,而是一些外部操作,不符合面向对象的封装和责任单一原则。如果把这些操 阅读全文

设计模式之--命令模式

2011-07-28 08:42 by java线程例子, 358 阅读, 收藏,
摘要: 命令模式的意图一是将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;二是对请求排队或记录请求日志,以及支持可撤消的操作。简略图如下:命令模式通过对命令的封装,将命令的请求(调用者Invoker)和执行(接收者Receiver)进行了责任分离,委派给不同的对象,不仅使得调用者和执行者之间实现了解耦(命令的请求方就不需要知道接收方的接口,也不需要知道命令是如何执行的具体情况),还使得可以记录命令的执行记录,添加执行日志,使得命令的控制、执行、取消和重做变得容易。Delphi的Action就采用了这种模式,其中Windows控件(比如按钮,菜单)是调用者,Action是命令,而接收者 阅读全文

设计模式之--适配器模式.

2011-07-26 21:00 by java线程例子, 340 阅读, 收藏,
摘要: 在日常生活中,我们时常会遇到一些兼容性的问题,比如我的笔记本的电源插头就是欧标的,在很多场合我都没法用,买一个可以用的插座当然是可选手段,但到那里去都拿这么大个家伙一是不方便,二也未必有地方可以插,所以我只好买个电源适配插座带在身上。再比如电脑的输入电压一般都只有20伏左右,而日常电源基本都是220伏,所以就需要一个电源适配器,来降低电压。这些都是为了解决不同标准之间的兼容性问题。设计模式中的适配器模式就是我们在设计中用来解决标准兼容性问题的一种重要手段。适配器的角色分为适配器,适配对象和适配目标。适配对象是具体功能的执行者,但因接口原因用户无法直接调用,适配目标是用户希望的调用接口,适配器就 阅读全文

设计模式之--组合模式

2011-07-26 20:52 by java线程例子, 284 阅读, 收藏,
摘要: 有时候我们需要维护一些对象,这些对象具有一定的层次结构,它们之间虽然差异很大,但在使用的时候我们希望能构一致的对待,比如Windows控件,绘图中的图形等,这个时候我们就可以采用组合模式来进行管理。组合模式就是将要管理的对象按树型结构来进行组织,表示成一种“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。组合模式的结构图如下:角色: 组件接口:提供一致的访问接口,注意组件接口可以是抽象类,也可以是具体类,还可以用接口实现; 组合对象:含有孩子对象的对象; 叶子对象:不含孩子对象的对象。组合对象自己维护一个子对象池,并按照组件接口的要求提供一致的访问方式,组合对象充当容器类 阅读全文

设计模式之-代理模式

2011-07-26 20:43 by java线程例子, 399 阅读, 收藏,
摘要: 代理模式(Proxy) ,英文又叫Surrogate。 代理在日常生活中很普遍,比如办身份证代理,产品销售代理,通信收费代理等,在计算机中也普遍存在,比如上网代理,远程调用代理,注册申请代理等。在代理过程中主要涉及的角色包括代理者,被代理者和事务,通过代理者和被代理者在是否参与事务,可以将代理分为职责代理和接口代理,所谓职责代理就是代理者完全行使被代理者的职责,被代理者不参与事务过程(至少在代理期间),比如代理总统,代理加工等,而接口代理就是被代理者和代理者都会参与事务过程,只是被代理者不直接面对用户,比如代理注册,代理收费,远程调用代理等。前者的实现不在本模式讨论范围之内,在程序设计中的代理 阅读全文

设计模式之-装饰模式

2011-07-25 22:27 by java线程例子, 227 阅读, 收藏,
摘要: 装饰的含义就是在原有的物件上增加饰品,使得物件能呈现出不同的特征。当然在类设计中,采用装饰模式,是用来为类增加新的特征和行为。结构如下: * * | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| * | Component |<-------------------------------------------------------------------| * |----------------------- -----| | * | Operation() | | * |________________| | * △ | * | | * | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | * | ̄ ̄ ̄ ̄ ̄ ̄.. 阅读全文

设计模式之-策略模式

2011-07-25 22:16 by java线程例子, 249 阅读, 收藏,
摘要: 如果一个类(CA)的方法存在不同的算法(F),而这些算法用户都可能用到,那么就可以将这种算法独立出来自我演变,既提供一个算法的抽象接口,再定义具体的算法类,而CA保持对算法的一个引用,CA中的方法不直接实现算法,而是调用用户所选的算法类中的算法来实现,这就是策略模式。也既定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 * * | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| * | Context | | Strategy | * |-----------------------------|◇-strategy---聚合------- 阅读全文

设计模式之-桥模式

2011-07-24 21:11 by java线程例子, 237 阅读, 收藏,
摘要: 顾名思义,桥的作用就是将两条相互独立的路桥接到一起,而两条路可以保持各自的相对独立。在程序设计中,“桥”模式中的桥只是一种形象的比喻。根据桥模式的定义,桥模式实现了一个主题(可以是一个类,也可以是一中设计上的概念)的抽象部分和实现部分的分离(有的地方定义为抽象与具体行为的分离)。抽象部分的基类和实现部分的基类充就当着桥(接口对接)的作用,而抽象部分的子类和实现部分的子类就是桥两边的路,可以各自相对独立的发展(变化)(之所以是相对独立,从实现上来讲就是这种变化不能脱离最终能够实现桥接这个目标)。 我们知道,对于对象的研究,我们可以用这样的模型来表达对象:属性和行为。行为和属性都是对象的特征,其中 阅读全文

学无止境,温故而知新

2011-07-22 22:21 by java线程例子, 273 阅读, 收藏,
摘要: 从开始学习这些常用的设计模式到现在有8年多时间了,每次回头看看这些设计模式都有新的收获,有新的理解,从实践中来,到实践中去,再到理论上来,如此反复,获益不少。也许是自己比较笨,又比较喜欢技术的缘故吧,这次把原来的笔记拿出来再看看,体会一下技术发展的脉络,希望能有所收获。作为一位Coder,也以此纪念一下自己的码字母的人生。 阅读全文

怀念Delphi--希望它能雄起!

2011-07-22 21:44 by java线程例子, 197 阅读, 收藏,
摘要: 前些天跟一个人聊起我自己的一个系统,我说是delphi做的,他说那太落后了,然后说了一堆,我只能汗。虽然我现在主要在dotnet平台上做事情,但我对delphi还是有感情的,毕竟用了那么多年,而且至今我觉得从开发速度上来说,至少在桌面系统开发方面,无人能及。Delphi至少有几个地方还是非常的经典:1、UI组织,Delphi的Form是可以继承的,这个东东非常有用,在提高开发速度方面简直就一个神器。2、BDE:这个东东的Query和TUpdateSQL结合,再加上datasource可以跨form引用query,对开发速度上的提高不是一点点。dotnet的dataset+command就有这个 阅读全文

silverlight学习日记--第一个试水架构

2011-07-22 20:59 by java线程例子, 163 阅读, 收藏,
摘要: 采用微软提供的silverlight+wcf ria service+ado.net entity或者是linqtosql对于开发小的,且业务逻辑不太复杂的系统来说确实很简单,也很快,在这两天的学习中,有些小体会,但采用已有的框架(比如,nhibernate,sprint.net等)一向来都不是我的风格,因为我比较喜欢可控性,虽然说这些框架都是非常好的东西,但毕竟:一、它们都是为全世界服务的,想得太全就必然“不精”,而我的选择只需要对我自己的系统负责,那里面太多的东西对我来说要么没有用,要么就太累赘;二、东西是好,但毕竟被封起来了,要增加一些适合自己系统的快速开发功能,就不太容易了。通过这几天 阅读全文

设计模式之-原型模式

2011-07-22 20:19 by java线程例子, 142 阅读, 收藏,
摘要: 原型提供了另外一种创建对象的方式:通过已有的对象的自身提供的克隆功能来创建新的对象。这样做的好处很明显:1.使用克隆来创建对象的用户不需要知道对象的构造细节;2.性能上有利。但采用克隆来生成对象也要注意需要克隆的内容,如果采用全复制的话,有些业务上可能会产生逻辑错误,比如对象ID冲突等。克隆分为深度克隆和浅度克隆。一般来讲使用浅度克隆比较好,不会使得业务逻辑变得很复杂。===============================================================在实际开发中,对于实体类提供克隆方法有很多好处,比如,有的时候我们需要将获取的一系列实体修改部分关键字 阅读全文

设计模式之--生成器模式与抽象工厂模式的比较

2011-07-22 20:12 by java线程例子, 310 阅读, 收藏,
摘要: 从形式上来讲,通过角色合并,方法功能的转变,抽象工厂可以和生成器模式形式上取得一致(比如抽象工厂只处理一个产品族,工厂方法都处理同一个产品)。但注意,这仅仅是形式上的,实际上,抽象工厂和生成器模式有着本质的区别:1、生成器模式是为了构造一个复杂的产品,而且购造这个产品遵循一定的规则(相同的过程),而抽象工厂则是为了创建成族的产品(系列产品),同族产品的构造在逻辑上并不存在必然的联系(唯一必然的联系就是大家都属于一族)。2、生成器模式的构造方法是为了构造同一个产品,因此必须有指导者来协调进行工作,构造方法之间存在必然的业务联系,而抽象工厂的构造方法都是独立去构建自己的产品对象,因此他们不存在必然 阅读全文

设计模式之-生成器模式

2011-07-22 20:09 by java线程例子, 233 阅读, 收藏,
摘要: 在产品结构比较复杂,构造过程比较繁琐,一次性构造比较难的时候,我们可以采取分而治之的原则,将产品组件化,每个组件由专门的厂商来生产,最后的产品指派给制定的车间进行最后装配.这种方式其实是现代制造业的一种典型的模式.比如汽车,飞机的制造等.这样做的好处是: 1.产品的部件由专门的生产厂商来生产,这样分工更加明确,更加精细,生产专业化,可以降低成本; 2.整个产品的生产更加简单,也可增加零件的复用. 3.转换生产比较容易,比如产品的材质发生变化,只需要找相应提供该材质的厂商即可.这其实就是典型的生成器模式.生成器模式有4个角色:A.抽象生成器:提供生成器的抽象表达,具体的生成由子类完成.抽象生成器 阅读全文

设计模式-单例模式

2011-07-22 20:03 by java线程例子, 175 阅读, 收藏,
摘要: 单例模式的目的是保证类在系统中只被实例化一次,由该唯一的实例来为系统提供服务.单例模式主要用于保证服务的统一,比如获取统一的编号服务,模仿Oracle的序列生成等.但单例的使用需要谨慎,特别是在需要作负载均衡的地方,因为这种程序级的单例模式实际上只能保证在一个应用中为单例.如果被多个应用加载,还是会被多次实例化. 同时如果采用懒汉式还需要注意线程安全. 多例模式跟单例模式类似,但在实现上要复杂很多,需要维护自己的实例池和分配使用策略,还包括使用状态等的维护,多例模式主要用于有限个资源的管理,比如数据库连接池等。 下面是单例模式例子:using System;using System.Colle 阅读全文