代码改变世界

随笔分类 -  Design Pattern & SA

设计模式之静态工厂方法

2013-07-15 10:17 by youxin, 696 阅读, 收藏, 编辑
摘要: 工厂模式非常实用,但是为每一个类创建一个工厂方法方法类会引起工厂类的泛滥,此时,我们可以使用静态工厂方法来避免--在每个类里实现一个静态的工厂方法,就不需要额外的工厂类了。静态工厂方法在"Effective Java" 一书中有详细的介绍,我们也经常使用它们。例如,在Java 5版本里,为创建基本类型Integer、Long、Boolean对象都提供了静态工厂方法,以Integer类为例,它的静态工厂方法如下所示。publicstaticIntegervalueOf(inti){ if(i>=-128&&ithreadConfig=newThreadL 阅读全文

DCI架构

2013-06-24 17:08 by youxin, 612 阅读, 收藏, 编辑
摘要: 提出的文章:DCI架构:一个面向对象编程的新图景http://wenku.baidu.com/view/a7b5e401de80d4d8d15a4fed.htmlhttp://www.360doc.com/content/11/0728/01/1542811_136251663.shtmlhttp://www.jdon.com/37976 阅读全文

设计模式之中介者模式

2013-06-24 00:27 by youxin, 643 阅读, 收藏, 编辑
摘要: 对于那些存在对象之间复杂交互关系的系统,中介者模式提供了一种简化复杂交互的解决方案,他通过引入一个中介者,将原本对象之间的两两交互转化为每个对象与中介者之间的交互,中介者可以对对象之间的通信进行控制与协调,极大地降低了原有系统的耦合度,使得系统更加灵活,也更易于扩展。模式定义: 中介者模式(mediator pattern)定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互,中介者模式又称为调停者模式,他是一个对象行为型模式。Define an object that encapsulates how a set 阅读全文

MVC模式已死

2013-06-22 17:20 by youxin, 730 阅读, 收藏, 编辑
摘要: MVC模式:Model模型 View试图 Control控制器,是目前主流模式,被当作服务器软件入门基本模式学习和掌握,主流框架Struts 1/2 JSF Wicket基本都顺理成章支持MVC模式。但是,随着时间推移,MVC模式也暴露出大量缺点,因为MVC模式本质上是一个结构型模式,结构模式相比行为模式而言,实际就是静止的,相对固定的,而随着B/S和互联网应用不断普及,Web 2.0和社会化媒体 以及游戏等大量频繁交互应用普及,相对静止的MVC模式已经不适合高度交互注重行为的应用了。DDD领域建模本身比较重视结构,它的实体 值对象和服务器是也是一种结构划分,但是没有强调对象职责行为的重要性, 阅读全文

MVC 优缺点

2013-06-22 17:04 by youxin, 352 阅读, 收藏, 编辑
摘要: MVC是一个架构,或者说是一个设计模式,它就是强制性使应用程序的输入,处理和输出分开。将一个应用程序分为三个部分:Model,View,Controller。1、 MVC的优点 (1) 可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。 (2) 视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。 (3) 模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修... 阅读全文

贫血模型or领域模型

2013-06-22 16:47 by youxin, 302 阅读, 收藏, 编辑
摘要: 参考:http://lifethinker.iteye.com/blog/283668http://www.uml.org.cn/mxdx/200907132.asphttp://www.ituring.com.cn/article/125http://blog.csdn.net/educast/article/details/7248891 阅读全文

贫血领域模型和充血领域模型

2013-06-22 16:39 by youxin, 1089 阅读, 收藏, 编辑
摘要: 这两个概念是早些时候Martin Fowler总结出来的两种常见模型设计类型,没有说谁好谁不好,为不同的模型类别选择合适的场景是设计者的工作。没有工具本身的问题,只有工具使用者的问题。贫血模型 (http://www.martinfowler.com/bliki/AnemicDomainModel.html)是指领域对象里只有get和set方法(POJO),所有的业务逻辑都不包含在内而是放在Business Logic层。 优点是系统的层次结构清楚,各层之间单向依赖,Client->(Business Facade)->Business Logic->Data Access( 阅读全文

转:命令和查询责任分离(CQRS)架构模式

2013-06-22 16:05 by youxin, 425 阅读, 收藏, 编辑
摘要: 读了“蓝皮书”距今差不多一年,它改变了我的软件开发和构建软件架构观。在我作为一名程序员期间,我尝试了许多不同的方式来构建软件。方法有很多,包括一个贫血的域模型(Anemic Domain Model)。构建贫血领域模型并无什么不妥,但对于较为复杂的业务逻辑应用,它可能不是最好的选择。最终结果只能是代码间高耦合的很多“意大利面条式的代码”。贫血领域模型使得其业务逻辑遍布整个代码,如果业务规则改变,需要经常更新多个地方的代码,想避免这种情况,编码时请牢记这点。“编程的时候,总是想着那个维护你代码的人会是一个知道你住在哪儿的有暴力倾向的精神病患者。”—— Martin Golding。典型的富领域模 阅读全文

命令查询分离原则Command-query separation principle

2013-06-22 13:08 by youxin, 2195 阅读, 收藏, 编辑
摘要: 在UML和模式应用一书中,发送给Die的roll消息之后跟随着第二个消息getFaceValue用于提取其新的faceValue,特别是:roll()方法是void的,没有返回值,例如:public void roll(){ faceValue=//生成随机数}public int getFaceValue(){ return faceValue;}为什么不将两个方法合并起来,使roll()方法返回新的faceValue呢?如下所示://为什么这种方法不好public int rolll(){faceValue=//生成随机数return faceValue;}第二种方式违反了命令-查询分离原 阅读全文

转:控制反转(IoC)与依赖注入(DI)

2013-05-27 18:59 by youxin, 313 阅读, 收藏, 编辑
摘要: 控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。IoC是一个很大的概念,可以用不同的方式来实现。其主要实现方式有两种:<1>依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都使用这种方式。<2>依赖注入(Dependency Injection):组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。后者是时 阅读全文

设计模式之备忘录模式

2013-05-26 20:26 by youxin, 507 阅读, 收藏, 编辑
摘要: 为了使软件的使用更加人性化,对于误操作,我们需要提供一种类似“后悔药”的机制,让软件系统可以回到误操作前的状态,因此需要保存用户每一次操作时系统的状态,一旦出现误操作,可以把存储的历史状态取出即可回到之前的状态。ü现在大多数软件都有撤销(Undo)的功能,快捷键一般都是Ctrl+Z,目的就是为了解决这个后悔的问题。定义:备忘录模式(Memento Pattern):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。它是一种对象行为型模式,其别名为Token。Without violating encapsulation 阅读全文

领域模型-谈实体对象和值对象

2013-05-25 18:54 by youxin, 7467 阅读, 收藏, 编辑
摘要: 对于实体Entity和值对象Value Object是领域驱动设计里面两个重要的模型对象。所以有必要对两者的关系和区别进行理解。以下部分内容直接引用自《领域驱动设计》一书相关内容。首先对于实体Entity,实体核心是用唯一的标识符来定义,而不是通过属性来定义。即即使属性完全相同也可能是两个不同的对象。同时实体本身有状态的,实体又演进的生命周期,实体本身会体现出相关的业务行为,业务行为会实体属性或状态造成影响和改变。真正的现实世界,每个事物都一定会有唯一的标识,关键点是我们实际的业务场景和需求是否需要管理到唯一标识。书里面举了一个例子,当我们发放的门票上有座位号的时候,座位需要作为独立的实体,座 阅读全文

php设计模式-注册表模式

2013-05-25 18:04 by youxin, 725 阅读, 收藏, 编辑
摘要: 注册表模式其实是一个单例模式,注册表类提供静态方法(或单例对象的实例化方法)来让其它对象访问其中的数据(通常是对象)。整个系统中的每个对象都可以访问这些数据对象。 下面是基本的注册表类的代码:<?phpclass Registry {private static $instance;private $request;//注册表的内容类private function __construct(){}//本类,不可实例化static function instance(){//单例类,通过这个方法返回实例if (!isset(self::$instance)){self::$instance 阅读全文

面向对象语言的多分派、单分派、双重分派

2013-05-25 16:11 by youxin, 2600 阅读, 收藏, 编辑
摘要: 1. 分派的概念变量被声明时的类型叫做变量的静态类型(Static Type) 又叫明显类型(Apparent Type)。变量所引用的对象的真实类型又叫做变量的实际类型(Actual Type)。根据对象的类型而对方法进行的选择,就是分派(Dispatch)。根据分派发生的时期,可以将分派分为两种,即分派分静态分派和动态分派。静态分派(Static Dispatch) 发生在编译时期,分派根据静态类型信息发生。方法重载(Overload)就是静态分派。(所谓的:编译时多态)动态分派(Dynamic Dispatch) 发生在运行时期,动态分派动态地置换掉某个方法。面向对象的语言利用动态分.. 阅读全文

桥接模式与工厂模式区别

2013-05-24 17:29 by youxin, 2627 阅读, 收藏, 编辑
摘要: 工厂模式主要负责创建对象而桥模式主要负责将抽象的不同形式与具体实现部分分离。问题关键是如何理解桥接模式,理解了桥接模式就能明确他们之间的区别,而要理解桥接模式,你应该从宏观而不能从微观的角度去看一个架构的设计,举个桥接模式的例子:最典型的例子就是JDBC。JDBC API(Sun)提供抽象部分,各个JDBC驱动厂商(Oracle, Mysql...)提供实现部分。新的JDBC驱动可以“即插即用”在JDBC API中,而不需要修改我们调用者的代码。这就是所谓的抽象部分(JDBC API)与它的实现部分(JDBC Driver)分离。从宏观角度JDBC可以称为桥模式,但是从微观角度,JDBC中又使 阅读全文

设计模式之访问者模式

2013-05-24 16:24 by youxin, 569 阅读, 收藏, 编辑
摘要: 模式动机对于系统中的某些对象,它们存储在同一个集合中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同,访问者模式为解决这类问题而诞生。在现在世界也存在类似的情况,如医院里面的药单(处方单),可以将其看成是药品信息的集合,这些药品的类型并不相同,划价人员拿到药单之后根据药品名称和数量计算总价,药房工作人员根据药品名称和数量准备药品,不同类型的工作人员对同一个集合对象可以有不同的操作,而且可能还会增加新的类型工作人员操作药单。在这里,药单是集合对象,而里面的药品信息是一个个需要访问的元素,工作人员是访问者,他们需要访问存储在药单中的 阅读全文

设计模式之职责链模式

2013-05-24 15:36 by youxin, 743 阅读, 收藏, 编辑
摘要: 模式动机:在很多情况下,可以处理某个请求的对象不止一个,如大学里的奖学金审批,学生在向辅导员提交审批表之后,首先是辅导员签字审批,然后交给系主任签字审批,接着是院长审批,最后可能是校长审批,在这个过程中,奖学金申请表可以看成是一个请求对象,而不同级别的审批者都可以处理该请求对象,除了辅导员之外,学生不需要一一和其他审批者交互,只需等待结果即可。在审批过程中如果某一个审批者任务不符合条件,则请求中止;否则将请求递交给下一个审批者,最后由校长来确定谁能够授予奖学金。该过程如下:在图中,从辅导员直到校长都可以处理申请表,而且他们构成了一条链,申请表沿着这条链传递,这条链就叫职责链。职责链可以是一条直 阅读全文

设计模式之构造者模式

2013-05-21 10:31 by youxin, 610 阅读, 收藏, 编辑
摘要: 构造者模式用于创建一个包含多个组成部分的复杂对象,可以返回一个完整的产品对象给用户。建造者模式关注该复杂对象时如何一步一步创建而成的,对于用户而言,无需知道创建过程和内部组成细节,只需直接使用创建好的完整对象即可。模式动机:无论在现实生活中还是在软件系统中,都存在一些复杂的对象,他们拥有多个组成部分,如汽车,他包括方向盘,车轮,发送机等各种部件,而对于大多数用户而言,无需知道这些部件的装配细节,也几乎不会使用单独某个部件,而是使用一台完整的汽车,如图:在软件开发中,也存在大量类似汽车一样的复杂对象,他们拥有一系列成员属性,这些成员属性有些是引用类型的成员对象,而且在这些对象中,还可能存在... 阅读全文

什么是分层架构模式及常见的分层架构模式

2013-05-20 18:13 by youxin, 10057 阅读, 收藏, 编辑
摘要: 什么是分层架构模式分层(Layer)模式是最常见的一种架构模式。甚至说分层模式是很多架构模式的基础,本章下面讲到的一些内容实际上都和分层模式相关联。分层描述的是这样一种架构设计过程:从最低级别的抽象开始,称为第1层。这是系统的基础。通过将第J层放置在第J-1层的上面逐步向上完成抽象阶梯,直到到达功能的最高级别,称为第N层。因而分层模式就可以定义为:将解决方案的组件分隔到不同的层中。每一层中的组件应保持内聚性,并且应大致在同一抽象级别。每一层都应与它下面的各层保持松散耦合。分层模式的关键点在于确定依赖:即通过分层,可以限制子系统间的依赖关系,使系统以更松散的方式耦合,从而更易于维护。相对于分层, 阅读全文

三层架构理解

2013-05-20 18:08 by youxin, 477 阅读, 收藏, 编辑
摘要: 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。参见百度:http://baike.baidu.cn/view/687468.htm三层架构与mvc的区别:MVC(模型Model-视图View-控制器Controller)是一种设计模式,我们可以用它来创建在域对象和UI表示层对象之间的区分。同样是架构级别的,相同的地方在于他们都有一个表现层,但是他们不同的地方在于其他的两个层。在三层架构中没有定义Controller的概念。这是我认为最不同 阅读全文