What is Software Consturction 定义问题 problem definition 需求分析 requirements planning 规划构建 construction planning 软件构架 software architecture ,高层设计 high-level design 编码与调试 coding and debugging 单元测试 unit testing 集成测试 integration testing 集成 integration 系统测试 system testing 保障维护 corrective mai ...
 在JAVA中,通过其对线程类的内嵌支持,编程人员编写多线程程序是很简易的。然而,在编程人员面前,多线程呈现出一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的、难以发现的错误。在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程。 背景   中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序。   虽然初次看来它可能显得简单,但是,你必须进行一些预警以实现期望的结果。你最好还是牢记以下的几点告诫。   首先,忘掉T ...
Thread.stop , Thread.suspend , Thread.resume 和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经被废弃,使用它们是极端不安全的!   现在,如果你要安全有效地终止一个线程,应该采用以下这些方法:   1,线程正常执行完毕,正常结束。 也就是让run方法执行完毕,该线程就会正常结束。   2,监视某些条件,结束线程的不间断运行。 然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。 通常,它们执 ...
作者:老王 Eric Evans所著的《领域驱动设计》(Domain-Driven Design:通常简称为“DDD”)一书可以说是经典中的经典,虽然“领域”的概念早就存在,但是直到这本书的出现,才让人们真正开始认真审视软件的构 建,相信你看了这本书后会真正体会领域的力量,也正是这个力量决定了软件最终的价值。 领域的含义: 简单的说,每个软件程序都会与其用户的活动或兴趣相关,其中使用程序的主要环境称为软件的“领域”。 领域中形形色色的业务逻辑构成了软件丰富多采的行为。举例来说,银行财务系统中,领域逻辑就 ...
  越来越多人开始使用Java,但是他们大多数人没有做好足够的思想准备(没有接受OO思想体系相关培训 ),以致不能很好驾驭Java项目,甚至 导致开发后的Java系统性能缓慢甚至经常当机。很多人觉得这是Java复杂导致,其实根本原因在于:我们原先掌握的关于软件知识(OO方面)不是太贫乏就是不恰当,存在认识上和方法上的误区。 软件的生命性   软件是有生命的,这可能是老调重弹了,但是因为它事关分层架构的原由,反复强调都不过分。   一个有生命的软件首先必须有一个灵活可扩展的基础架构,其次才是完整的功能。    目前很多人对软件的焦点还是落 ...
  当Java世界提供的可选择性框架平台越来越多时,我们可能被平台架构所深深困扰,而无暇顾及软件的真正核心:业务建模,其实,业务领域建模同样是一个比平台架构更复杂,更需要学习的新的领域。    相反,在实践中,我们技术人员在经过冗长的平台架构学习和实践后,就匆忙开始项目开发,这时是什么指导他们进行软件业务实现呢?大部分可能是依赖数据库 建模,甚至是复杂冗长的数据库存储过程设计,这些已经开始走向面向对象分析设计的反方向,走上了一条错误的软件开发方向,最终开发出缓慢的、经常当机的 Java企业系统。   如果你没有恰当的OO设计思想,Java就会用性能惩罚你,这可能是Java世界的一个潜 ...
  板桥里人 http://www.jdon.com 2006/12/6(转载请保留)   多变且复杂的需求   如果没有多变的需求,也许就没有今天的面向对象软件,我们曾经试图通过需求管理、需求跟踪等等管理方式约束和减少需求频繁更新带给软件的冲击,可是这样下去的结果只有一个:使得软件更加僵化;或者程序员更加 劳累。   需求不但多变,而且经常是不可能第一次就能掌握,需求反映了某个领域的专业知识,例如数学、管理、财务或 电子商 ...
    我们知道:一个软件从无到有需要经过如下几个阶段:分析、设计、编程、调试、部署和运行。    编程阶段我们通常使用Java/.NET这样面向对象语言工具,可以带来很多设计上的好处,但是也存在一个奇怪的现象: 很多程序员虽然在使用OO语言,但是却在code非OO的代码,最终导致系统性能降低或失败,这个现象在Java语言尤其 显得突出,难怪有些人就把问题归结于Java语言本身 ...
最近用到了,所以依然是转载 ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动 等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要 差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快! 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基 ...
  一、引子   这是一个很简单的模式,却被非常广泛的使用。之所以简单是因为在这个模式中仅仅使用到了继承关系。   继承关系由于自身的缺陷,被专家们扣上了“罪恶”的帽子。“使用委派关系代替继承关系”,“尽量使用接口实现而不是抽象类继承”等等专家警告,让我们这些菜鸟对继承“另眼相看”。   其实,继承还是有很多自身的优点所在。只是被大家滥用的似乎缺点更加明显了。合理的利用继承关系,还是能对你的系统设计 起到很好的作用的。而模板方法模式就是其中的一个使用范例。   二、定 ...
关键字: uml 读书笔记       通俗地讲,用例是文本形式的情节描述, 用以说明某参与者使用系统以实现某些目标。       注意:用例不是图形,而是文本。 用例初学者的常见错误就是注重于次要的UML用例图,而非重要的用例文本。         本质上,用例是通过编写使用系统实现用户目标的情节来发现和记录功能性需求 ,也就是使用的案例(cases of use) ...
关键字: uml 读书笔记 定义:需求        需求(Requirement)就是系统(更广义的说法是项目)必须提供的能力和必须遵从的条件[JBR99] "Requirements are capabilities and conditions to which the system—and more broadly, the project—must conform". [JBR99]       UP(Unifi ...
关键字: uml 读书笔记 初始阶段是建立项目共同设想和基本范围的比较简短的起始步骤。是为在随后的细化阶段能够开始编程,他将包括对10%的用例进行分析、关键的非功能性需求的分析、业务案例创建和开发环境的准备。 用一句话来概括初始阶段: 预见项目的范围、设想和业务案例。 用一句话来概括初始阶段要解决的主要问题: 涉众是否就项目设想基本达成一致、项目是否值得研究进行认真研究。 简单的来说,从未来新系统的总体目的和可行性而言,项目的初期只进行足以形成合理判断的调查。并能够确定是否值得继续深入研究即可。而深 ...
2008-06-19

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

关键字: 命令模式
一,命令模式的实现: 命令模式里边一般都有以下几个角色:客户端,请求者,命令接口,命令实现,接受者, 下边是简单命令模式的实现代码实现:  1  public class Client{  2      public static void main(String[] args){  3         Receiver receiver = new Receiver();  4 &n ...
深入理解abstract class和inter   abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了 Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因 此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们 的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正 ...
ξ 3.1 软件系统的可维护性 ☆ 导致一个软件设计的可维护性较低,也就是说会随着性能要求的变化二“腐烂”的真正原因有四个:  ① 过于僵硬  加入一个新性能,不仅仅意味着建造一个独立的模块,而且因为这个新性能会波及很多其他的模块,最好变成跨越几个模块的改动。  ② 过于脆弱  对一个地方的修改,往往会导致看上去没什么关系的另外一个地方发生故障。尽管在修改之前,设计师会尽力预测可能的故障点,当是修改完成之前,系统的原始设计师们甚至都无法预测到可能会波及的地方。  ③ 复用率低  每当程序员发 ...
ξ 4.1 什么是开闭原则 ☆ 开闭原则指的是一个软件实体应对对扩展开发,对修改关闭(Software entities should be open for extension, but closed for modification)。这个原则是说在设计一个模块的时候,应对使这个模块可以在不被修改的前提下被扩展,换言之,应对可以不必修改源代码的情况下 改变这个模块的行为。 ☆ 满足开闭原则的软件系统的优越性: ① 通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性。 ② 已有的软件模块,特别是最重要的抽象层模块不能再 ...
☆ 依赖倒转原则,要依赖于抽象,而不要依赖于具体实现。 ξ 8.3 依赖倒转原则 ☆ 三种耦合关系 ① 零耦合关系,如果两个类没有耦合关系,就称之为零耦合; ② 具体耦合,具体耦合发生在两个具体的类之间,经由一个类对另外一个具体类的直接引用造成的。 ③ 抽象耦合关系,抽象耦合关系发生在一个具体类和一个抽象类之间,使用两个必须发生关系的类之间存在有最大的灵活性。 ☆ 依赖倒转原则的另外一种表述是: 要针对接口编程,不要针对实现编程(Program to an interface, not an implementation)[GOF95]。同样,在处理类之间的耦合关系时,尽量 ...
1.开—闭原则(Open-Closed Principle, short for OCP)    该原则讲一个软件实体应当对扩展开放,对修改关闭。说的是在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。换言之,应当可以在不必修 改源代码的情况下改变这个模块的行为。实现开闭原则的关键是抽象化。在"开—闭"原则中,不允许修改的是抽象的类或者接口,允许扩展的是具体的实现类,抽 象类和接口在"开—闭"原则中扮演着极其重要的角色,在设计过程中既要预知可能变化的需求,又要预见所有可能 ...
“is a”代表的是类之间的继承关系,比如PC机是计算机,工作站也是计算机。PC机和工作站是两种不同类型的计算机,但都继承了计算机的共同特性。因此在用 Java语言实现时,应该将PC机和工作站定义成两种类,均继承计算机类。 “has a”代表的是对象和它的成员的从属关系。同一种类的对象,通过它们的属性的不同值来区别。比如一台PC机的操作系统是Windows,另一台PC机的操作系统是Linux。操作系统是PC机的一个成员变量,根据这一成员变量的不同值,可以区分不同的PC机对象。 再比如张三和李四都是人,但他们的名字不 ...
复用的基本种类: 合成/聚合复用 : 优点: * 新对象存取成分对象的唯一方法是通过成分对象的接口。 * 这种复用是黑箱复用,因为成分对象的内部细节是新对象所看不见的。 * 这种复用支持包装。 * 这种复用所需的依赖较少。 * 每一个新的类可以将焦点集中在一个任务上。 * 这种复用可以在运行时间内动态进行,新对象可以动态的引用与成分对象类型相同的对象。 缺点: * 系统中会有比较多的对象需要管理。 通过继承的复用: 合成/聚合作为复用手段可以应用到几乎任何环境中去,而继承只能在有限的环境中使用。尽管继承是一种非常重要的复用手段,但应当首先考虑合成/聚合,而 ...
☆ 合成/聚合复用原则经常又叫做合成复用原则。该原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分:新的对象通过向这些对象的委派达到复用已有功能的目的。 ξ 10.1 合成与聚合的区别 合成和聚合均是关联的特殊情况。聚合用来表示“拥有”关系或者整体与部分的关系;而合成则用来表示一种强得 多的“拥有”关系。在一个合成关系里面,部分和整体的生命周期是一样的。一个合成的新的对象完全拥有对其组成部分的支配权,包括它们的创建和销毁等。使用 程序语言的术语来说,组合而成的新对象对组成部分的内存分配、内存释放有绝对的责任。 & ...
第五个设计模式:合成模式 合成模式 把部分和整体关系用树结构表示,是属于对象的结构模式。合成模式 要对组合的对象进行管理,所以在一定位置给予对象的相关管理方法,如:add(),remove()等.合成模式 中对象的管理有两种方案。 1.安全方式:此方式只允许树枝构件有对象的管理方法。 2.透明方式:此方式只允许树枝和树叶都有对象的管理方法,但树叶对象中的管理方法无实际意义。 一.UML 示意图 二.组成部分 抽象构件:抽象组合对象的公共行为接口 树叶构件:树叶对象,没有下级子对象 树枝构件:树枝对象,树枝对象可以包含一个或多个其他 ...
  这个代码成功编译,但是因为基类不知道关于stack指针堆栈的情况,这个stack对象当前在一个未定义的状态。下一个对于push()调用 把新的项放入索引2的位置。(stack_pointer的当前值),所以stack有效地有三个元素-下边两个是垃圾。(Java的stack类正是有 这个问题,不要用它).   对这个令人讨厌的继承的方法问题的解决办法是为Stack覆盖所有的ArrayList方法,那能够修改数组的状态,所以覆盖正确的操作Stack指针或者抛出一个例外。(removeRange()方法对于抛出一个例外一个好的候选方法)。    这个方法有两个缺点。第一,如果你覆盖 ...
 作为另一个例子,比较下面两段代码:    f() { Collection c = new HashSet(); //... g( c ); } g( Collection c ) { for( Iterator i = c.iterator(); i.hasNext() ) do_something_with( i.next() ); } 和    f2() { Collection c = new HashSet(); //... g2( c.iterator( ...
原文:http://blog.csdn.net//softwarezhang/archive/2005/04/25/362832.aspx   大多数好的设计者象躲避瘟疫一样来避免使用实现继承(extends 关系)。实际上80%的代码应该完全用interfaces写,而不是通过extends。“JAVA设计模式”一书详细阐述了怎样用接口继承代替实现继承。这篇文章描述设计者为什么会这么作。   Extends是有害的;也许对于Charles Manson这个级别的不是,但是足够糟糕的它应该在任何可能的时候被避开。“JAVA设计模式”一书 ...
  我们要得到一个对象,马上想到构造方法,其实,静态工厂方法也可以替我们做到。 例如,在jdk1.4里面,Boolean用了一个静态方法来得到一个boolean对象: public static Boolean valueOf(boolean b) question:这个方法实际上并不返回一个object? 对 的, sun的jdk 帮助里面讲: If a new Boolean instance is not required, this method should generally be used in preference to the constrUCtor Boo ...
工厂模式总述   工厂模式属于类的创建模式,工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,而不必事先知道每次要实例化哪一个类。工厂模式有三个基本形态: 1. 简单工厂(Simple Factory)模式,又称静态工厂方法模式(Static Factory Method Pattern)。 2. 工厂方法(Factory Method)模式,又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virtual Constructor)模式。 3. 抽象工厂(Abstract Factory)模式,又称工具箱(Kit 或To ...
jokermanager
搜索本博客
最近加入圈子
存档
最新评论