自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(93)
  • 收藏
  • 关注

原创 【转】话说状态模式和策略模式

 图1:策略模式类图      图2:状态模式类图 熟悉uml类图的朋友,可以看出,策略模式的类图和状态模式的类图实现是很相似的,这也是为什么设计模式中,我们把这两种模式比喻成为孪生兄弟,很多时候,我们在运用上述模式来解决实际问题的时候,也经常混淆他们,其实,个人倒是认为,就算大家用法不同其实也没有必要介意,因为设计模...

2008-11-26 17:07:17 128

温习-策略模式

下面的情况考虑使用策略模式: 1、一个系统中有许多类,他们的区别仅在于他们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种,那么这些算法可以包装到一个个具体的算法类里面,而这些算法类都是一个抽象算法类的子类。换言之,这些具体算法类都有统一的接口,由于多态性原则,客户端可以选择使用任何一个具体算法类。并只持有一个数据类型是抽象...

2008-11-26 16:04:49 127

用例的粒度

用例没有粒度,不要把步骤当作用例。尽量不要用CRUD为用例,因为它们一般不提供价值,过于在乎细节,是从数据库角度进行考虑的。 多个用例也可能操作同样的数据,一个用例背后可能隐藏多个数据操作。如果确定为CRUD,则合并为管理***,可以把Create当作主路径,Read,Update,Delete当作其它可选的路径。不要牵涉界面细节。...

2008-11-19 16:11:58 521

如何发现用例

1、一组用例实例,每个实例是系统执行的一系列活动,以此产生对特定参与者具有价值的可观察结果。 2、关注系统的用户或参与者来编写需求。 3、关注理解参与者所考虑的有价值结果。 发现用例的过程: 1、选择系统边界。 2、确定主要参与者。 3、确定每个主要参与者的目标。 4、定义满足用户目标的用例,根据目标对用例命名。...

2008-11-19 10:53:51 962

准则:采用参与者与参与者目标的视点

1、一组用例实例,每个实例是系统所执行的一系列活动,以此产生对特定参与者具有价值的可观察结果。 2、关注系统的用户或参与者来编写需求,询问其目标和典型情况。 3、关注理解参与者所考虑的有价值结果。...

2008-07-06 11:20:43 102

准则:编写黑盒用例

1、黑盒用例是最常用的和推荐使用的类型。它不对系统内部的工作、构件或设计进行描述。 2、黑盒用例以职责来描述系统,这是面向对象思想中普遍统一的隐喻主题-软件元素具有职责,并与其他具有职责的元素进行协作。 3、黑盒用例定义系统职责,可以规定系统必须做什么,而不必关心系统如何去做。 4、分析与设计的区别,就在于”什么“和”如何“。 5、在分析中应避免进行”如何“的决策,而是规定系统的外...

2008-07-06 11:12:09 113

准则:编写简洁的用例

1、应该编写简洁的用例,删除“噪音”词汇。 2、即使是一些细微之处也会积累为繁琐。

2008-07-06 11:07:28 134

准则:以无用户界面约束的本质风格编写用例

1、通过对目标层次的研究,系统分析员会发现与实现机制无关的目标。 2、这种对根源目标的发现过程能够扩展视野,以促成新的和改进的解决方案。 3、摈除用户界面于思考范围之外,集中于意图。 4、以本质风格编写用例,摈除用户界面并且关注参与者的意图。 5、具体风格的用例编写方式,不适合于早期的需求分析工作,应该避免。...

2008-07-06 11:03:56 198

知识丰富的设计

1、业务活动与规则对于一个领域来说与其涉及的实体同样重要。 2、领域也会包含各种类别的概念。对知识的消化要能够产生出反映这种理解的模型。 3、超越实体与值之上的变化可能会对知识消化产生剧烈的影响,因为业务规则之间可能存在不一致。 4、领域专家通过与软件专家的密切合作,进行知识消化,才使得规则明晰化。 5、提炼隐藏概念,将业务规则可以放到一个领域对象中。 6、任何业务专家都不可能...

2008-07-06 10:05:30 90

Replace Array with Object 以对象取代数组

1、如果一个数组中的各个元素代表了不同的东西,考虑用Object来代替数组。 2、数组应该只用于容纳一组相似对象。 3、如果一个数组容纳了不同对象,会给array用户带来麻烦。...

2008-07-05 20:26:54 110

常见的软件隐喻

1、重要的研发成果常常产自类比。通过把你不太理解的东西和你较为理解、十分类似的东西进行比较,你可以对这些不太理解的东西产生更深刻的理解。这种使用隐喻的方法叫做“建模”。 2、软件隐喻不会告诉你到哪里去找答案,仅告诉你该如何找到答案。隐喻的作用更像启示,而不是算法。 3、“增量的”、“迭代的”、“自适应的”、“演进的”,以增量的方式进行设计、编码和测试,是目前已知的最强有力的软件开发概念。...

2008-07-05 20:14:40 363

知识消化

1、高效的建模人员就是知识的消化器。 2、知识消化并不是一个孤立的行动,它由开发团队与领域专家共同合作,由开发人员领导。 3、老式的瀑布方法中,业务专家与分析人员会谈,分析人员提取摘要,进行抽象后将结果转达给程序员,由程序员进行编码。这种方法并不成功,因为没有反馈机制。 4、优秀的程序员会自然地开始进行抽象来开发一个模型。 5、在团队成员一起讨论模型的过程中,他们之间的交互也会发生...

2008-07-05 19:52:46 140

有效建模的因素

1. 模型与实现相互绑定。未经加工的原型建立了早期必需的联系,在随后的迭代中始终对它进行维护和完善。 2. 基于模型生成了一种语言。随着项目的进行,我们中的每个人都可以自如地使用来自模型的术语,将它们组织成与模型结构一致的句子,不需翻译,也不会引起歧义。 3. 开发了一个包含丰富知识的模型。对象都具有行为和一些强制性的规则。模型并不仅仅是一个数据方案,它是解决一个复杂问题必不可缺的。它捕获...

2008-07-05 19:43:45 167

用例的编写

1、用例、UML图等保证不会是完美的。它们可能会遗漏关键信息或者包含错误陈述。解决方案并不是以瀑布的态度试图近乎完美地记录规格说明并且在开始阶段就完成此项工作。 2、编写用例的折中方案是介于瀑布和即兴编程之间的迭代和进化式开发。 3、以增量式进化、验证用例和其他模型,并且通过及早的编程和测试加以明确。 4、如果在第一次开发迭代之前,小组就视图详尽地编写所有或大部分用例时,此时要意识到你...

2008-07-05 19:36:16 134

JDK5新特性--java.util.concurrent ExecutorCompletionSe

考虑以下场景:浏览网页时,浏览器了5个线程下载网页中的图片文件,由于图片大小、网站访问速度等诸多因素的影响,完成图片下载的时间就会有很大的不同。如果先下载完成的图片就会被先显示到界面上,反之,后下载的图片就后显示。Java的并发库的CompletionService可以满足这种场景要求。该接口有两个重要方法:submit()和take()。submit用于提交一个runnable或者c...

2008-07-04 10:25:56 101

JDK5新特性--java.util.concurrent CyclicBarrier(3)

在实际应用中,有时候需要多个线程同时工作以完成同一件事情,而且在完成过程中,往往会等待其他线程都完成某一阶段后再执行,等所有线程都到达某一个阶段后再统一执行。比如有几个旅行团需要途经深圳、广州、韶关、长沙最后到达武汉。旅行团中有自驾游的,有徒步的,有乘坐旅游大巴的;这些旅行团同时出发,并且每到一个目的地,都要等待其他旅行团到达此地后再同时出发,直到都到达终点站武汉。这时候CyclicBarr...

2008-07-03 15:13:33 109

java基础--Java 5.0多线程编程(3)

Lock接口ReentrantLock是Lock的具体类,Lock提供了以下一些方法:lock(): 请求锁定,如果锁已被别的线程锁定,调用此方法的线程被阻断进入等待状态。 tryLock():如果锁没被别的线程锁定,进入锁定状态,并返回true。若锁已被锁定,返回false,不进入等待状态。此方法还可带时间参数,如果锁在方法执行时已被锁定,线程将继...

2008-07-03 14:35:54 83

java基础--Java 5.0多线程编程(2)

*1: 定义了几个任务*2: 初始了任务执行工具。任务的执行框架将会在后面解释。*3: 执行任务,任务启动时返回了一个Future对象,如果想得到任务执行的结果或者是异常可对这个Future对象进行操作。Future所含的值必须跟Callable所含的值对映,比如说例子中Future对印Callable*4: 任务1正常执行完毕,future1...

2008-07-03 14:30:33 107

java基础--Java 5.0多线程编程(1)

Java自1995年面世以来得到了广泛得一个运用,但是对多线程编程的支持Java很长时间一直停留在初级阶段。在Java 5.0之前Java里的多线程编程主要是通过Thread类,Runnable接口,Object对象中的wait()、 notify()、 notifyAll()等方法和synchronized关键词来...

2008-07-03 14:13:15 87

关于用信号量Semaphore完成互斥锁Mutex

本文探讨用信号量Semaphore实现互斥锁Mutex的问题    在Doug lea的那本著名的《Java并发编程—设计原则与模式》,英文名"Concurrent Programming in Java™: Design Principles and Patterns, Second Edition",书中提到可以用信号量Semaphore实现互斥锁Mutex。虽然java中是通过sync...

2008-07-03 11:26:05 162

JDK5新特性--java.util.concurrent Semaphore(8)

操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java并发库的Semaphore可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,acquire()获取一个许可,如果没有就等待,而release()释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。在...

2008-07-03 10:43:23 125

使用Callable返回结果

         本文是Sun官方以Blog形式发布的Java核心技术窍门(JavaCoreTechTip)中的一个。本文主要介绍了Callable及其相关接口和类的使用,篇幅不长且易于理解,故翻译在了此处,相信对于准备或刚接触java.util.concurrent的朋友会有所帮助。   自从Java平台的最开始,Runnable接口就已存在了。它允许你定义一个可由线程完成的任务。如...

2008-07-02 14:50:42 215

Java线程join()方法的用处

run()和start() 是大家都很熟悉的两个方法。把希望并行处理的代码都放在run() 中;stat()用于自动调用run(),这是JAVA的内在机制规定的。并且run()的访问控制符必须是public,返回值必须是void(这种说法不准确,run() 没有返回值),run()不带参数。闲话少说,我们要讲的是join(),我们首先来看个例子:代码: /**...

2008-07-02 14:24:21 116

JDK5新特性--java.util.concurrent BlockingQueue(4)

并发库中的BlockingQueue是一个比较好玩的类,顾名思义,就是阻塞队列。该类主要提供了两个方法put()和take(),前者将一个对象放到队列中,如果队列已经满了,就等待直到有空闲节点;后者从head取一个对象,如果没有对象,就等待直到有可取的对象。下面的例子比较简单,一个读线程,用于将要处理的文件对象添加到阻塞队列中,另外四个写线程用于取出文件对象,为了模拟写操作耗时长的特点,特...

2008-07-02 10:57:26 66

JDK5新特性--java.util.concurrent CountDownLatch(5)

从名字可以看出,CountDownLatch是一个倒数计数的锁,当倒数到0时触发事件,也就是开锁,其他人就可以进入了。在一些应用场合中,需要等待某个条件达到要求后才能做后面的事情;同时当线程都完成后也会触发事件,以便进行后面的操作。CountDownLatch最重要的方法是countDown()和await(),前者主要是倒数一次,后者是等待倒数到0,如果没有到达0,就只有阻塞等待了。一...

2008-07-02 09:34:04 138

《代码大全》读书笔记之一

What is Software Consturction定义问题 problem definition 需求分析 requirements planning 规划构建 construction planning 软件构架 software architecture ,高层设计 high-level design编码与调试 coding and debugging单元测试 unit...

2008-06-30 23:02:13 91

中断JAVA线程

 在JAVA中,通过其对线程类的内嵌支持,编程人员编写多线程程序是很简易的。然而,在编程人员面前,多线程呈现出一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的、难以发现的错误。在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程。 背景  中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。线程是死亡、还...

2008-06-30 22:44:58 56

JAVA中断线程的方法

Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经被废弃,使用它们是极端不安全的! 现在,如果你要安全有效地终止一个线程,应该采用以下这些方法: 1,线程正常执行完毕,正常结束。也就是让run方法执行完毕,该线程就会正常结束。 2,监视某些条件,结束线程...

2008-06-30 11:26:50 84

浅谈“领域驱动设计”

作者:老王Eric Evans所著的《领域驱动设计》(Domain-DrivenDesign:通常简称为“DDD”)一书可以说是经典中的经典,虽然“领域”的概念早就存在,但是直到这本书的出现,才让人们真正开始认真审视软件的构建,相信你看了这本书后会真正体会领域的力量,也正是这个力量决定了软件最终的价值。领域的含义:简单的说,每个软件程序都会与其用户的活动或兴趣相关,其中使用程序的主要...

2008-06-25 17:52:11 78

当前Java软件开发中几种认识误区

  越来越多人开始使用Java,但是他们大多数人没有做好足够的思想准备(没有接受OO思想体系相关培训),以致不能很好驾驭Java项目,甚至 导致开发后的Java系统性能缓慢甚至经常当机。很多人觉得这是Java复杂导致,其实根本原因在于:我们原先掌握的关于软件知识(OO方面)不是太贫乏就是不恰当,存在认识上和方法上的误区。软件的生命性  软件是有生命的...

2008-06-25 17:24:37 82

领域模型驱动设计(Evans DDD)之模型提炼

  当Java世界提供的可选择性框架平台越来越多时,我们可能被平台架构所深深困扰,而无暇顾及软件的真正核心:业务建模,其实,业务领域建模同样是一个比平台架构更复杂,更需要学习的新的领域。  相反,在实践中,我们技术人员在经过冗长的平台架构学习和实践后,就匆忙开始项目开发,这时是什么指导他们进行软件业务实现呢?大部分可能是依赖数据库建模,甚至是复杂冗长的数据库存储过程设计,这些已经开始走向面向...

2008-06-25 17:14:13 139

面向对象与领域建模

 板桥里人 http://www.jdon.com 2006/12/6(转载请保留) 多变且复杂的需求   如果没有多变的需求,也许就没有今天的面向对象软件,我们曾经试图通过需求管理、需求跟踪等等管理方式约束和减少需求频繁更新带给软件的冲击,可是这样下去的结果只有一个:使得软件更加僵化;或者程序员更加 劳...

2008-06-25 16:26:57 55

面向对象建模与数据库建模两种分析设计方法的比较

   我们知道:一个软件从无到有需要经过如下几个阶段:分析、设计、编程、调试、部署和运行。    编程阶段我们通常使用Java/.NET这样面向对象语言工具,可以带来很多设计上的好处,但是也存在一个奇怪的现象: 很多程序员虽然在使用OO语...

2008-06-25 15:45:34 104

ArrayList Vector LinkedList 区别与用法

最近用到了,所以依然是转载ArrayList和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向...

2008-06-24 11:18:21 74

深入浅出Java模式设计之模板方法模式

  一、引子   这是一个很简单的模式,却被非常广泛的使用。之所以简单是因为在这个模式中仅仅使用到了继承关系。  继承关系由于自身的缺陷,被专家们扣上了“罪恶”的帽子。“使用委派关系代替继承关系”,“尽量使用接口实现而不是抽象类继承”等等专家警告,让我们这些菜鸟对继承“另眼相看”。  其实,继承还是有很多自身的优点所在。只是被大家滥用的似乎缺点更加明显了。合理的利用继承关系,还是能对...

2008-06-24 00:07:20 81

[读书笔记]UML和模式应用 ---- 用例

关键字: uml 读书笔记       通俗地讲,用例是文本形式的情节描述,用以说明某参与者使用系统以实现某些目标。      注意:用例不是图形,而是文本。用例初学者的常见错误就是注重于次要的UML用例图,而非重要的用例文本。       本质上,用例是通过编写使用系统实现用户目标的情节来发现和记录功能性需求,也就是使用的案例(cases of ...

2008-06-22 16:01:01 94

[读书笔记]UML和模式应用 ---- 进化式需求

关键字: uml 读书笔记定义:需求       需求(Requirement)就是系统(更广义的说法是项目)必须提供的能力和必须遵从的条件[JBR99]"Requirements are capabilities and conditions to which the system—and more broadly, the project—must conform". [JBR9...

2008-06-21 11:01:10 99

[读书笔记]UML和模式应用 ---- 初始不是需求阶段

关键字: uml 读书笔记初始阶段是建立项目共同设想和基本范围的比较简短的起始步骤。是为在随后的细化阶段能够开始编程,他将包括对10%的用例进行分析、关键的非功能性需求的分析、业务案例创建和开发环境的准备。 用一句话来概括初始阶段: 预见项目的范围、设想和业务案例。 用一句话来概括初始阶段要解决的主要问题: 涉众是否就项目设想基本达成一致、...

2008-06-21 10:15:22 88

Java中的模式 --- 命令模式

一,命令模式的实现:命令模式里边一般都有以下几个角色:客户端,请求者,命令接口,命令实现,接受者,下边是简单命令模式的实现代码实现:  1  public class Client{ 2      public static void main(String[] args){ 3         Receiver receiver = new Receiver(); 4      ...

2008-06-19 22:26:06 108

深入理解abstract class和interface

深入理解abstract class和inter   abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和i...

2008-06-15 00:27:26 76

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除