NULL Object空对象模式:当你在处理可能会出现null的对象时,可能要产生相对乏味的代码来做相应的处理,使用空对象模式可以接受null,并返回相应的信息。 空对象模式通常会作为一个单独的空对象类,封装一个默认的行为。
Interface Log{public void log();}
class FileLog extends Log{public void log(){}}
class ConsoleLog extends Log{public void l ...
proxy代理模式,其意图是"为其他对象提供一种代理以控制对这个对象的访问",通俗的讲就是,一个类A请一个代言人C去跟另一个类B打交道。在"四人帮"的《设计模式》中代理一章有关代理的"动机"的那节,举文档编辑器加载图像为例,说得很形象、透彻。
根据不同的用途,proxy代理模式又可以分为:远程代理、虚代理、访问控制(保护)代理、引用代理、审计代理、同步化代理、copy-on-write代理、缓存代理。 ...
visitor访问者模式的意图,在《设计模式》里这样描述:“表示一个作用于某个对象结构中的各元素的操作。它使可以在不改变各元素的类的前提下定义作用于这些元素的新操作。”。就是说:在坚持“开闭原则”的情况下,访问者可以用来扩展一个现有的类层次结构来实现新的行为。更通俗的讲,如果不愿意修改类层次结构内部代码或者类层次结构的代码难以修改的情况下,如果该类层次结构在设计实现时使用了visitor访问者模式,那么可以实现“在不修改类层次结构代码的前提下”进行扩展。
&n ...
command命令模式,将请求封装成对象,通过对象的形式来实现对请求的控制,例如排序、执行和取消等。 command命令模式也是一个遵循开闭原则的模式,避免了传统的if else的硬代码,又可以容易地把新的命令加入系统。 先声明一个公共接口,各个命令各自实现该接口。要使用该命令时,触发该命令或者向命令的使用者注册该命令,执行相应的方法即可。 & ...
template method模版方法模式,说白了,就是抽象类的运用。模版方法模式很多时候都在用,利用该模式可以实现提高代码的复用率。它把各子类相同的方法放在抽象类,避免了编写重复的代码,而其他可变的方法强制型地在各子类各自实现,实现代码规范性。 在我们使用的一些软件包的时候,有一些要求我们继承其某个类,并实现其方法,例如struts的Action,要求实现execute方法。原因是在Action内部定义了一个实现其功能的代码架构,用户不必做其他的事情,只要在继承并实现ex ...
state状态模式,在代码的结构上跟策略模式没什么区别,只是它们的应用则重点不同。一个对象的行为依赖以一些状态的变化而随之变化,一种传统的做法就是if else的条件判定硬代码,这样的代码级不美观,也不好扩展维护。采用state状态模式就是把各个不同状态的所以执行的代码分别放到不同的类中。
strategy策略模式,策略即算法,策略模式是对算法的封装,把使用算法的使用者和算法本身分割开,分派给不同的对象管理。一系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类或接口的实现类。换句话说:就是准备一组算法,当条件或环境变化,需要不同的算法时,则向算法的使用者注册该算法,使得其可以在使用者的内部使用该算法。 传统的作法,是使用if else语句在方法中实现并选择不同的算法(很多使用面向对象语言编写程序的人还是停留在结构化的思维定势),这与面向对象 ...
observer观察者模式,取名为观察者可能会让人费解,该模式的思想跟订阅/发布服务的思想是相近的,所以称为订阅/发布模式更为通俗贴切。 存在着这样的类:类A的某个状态发生改变,或者触发了某个事件,会影响到其他的n个类(一般是实现了相同的接口)的状态;或者n个类的某些状态是在某一时刻内“同时”发生的。一种不明智的作法就是,在类A中编写硬代码,如果n增加了,就要向类A添加相应的代码,并且这些代码会是跟前n-1次前添加的基本上是一样的。
public ...
memento备忘录模式,就是利用平常所说的备忘录的思想,把一些可能在以后要用到的东西先记起来,等到要用的时候就可以查询备忘录,再次利用。在软件设计中就是将对象的状态存储起来,根据需要,这个对象只要向备忘录发出一个请求就能够从备忘录读取数据并恢复到先前的状态。 既然是备忘录就会有一个或以上的信息来源,一条或以上的记录和一个记录集(记录管理)。需要存储信息的对象就是信息的来源。 因为隐私的原因,备忘录只有,记录人才能看到。同样的,备忘录对象 ...
mediator中介者模式,用来管理很多对象之间的相互作用,将一系列对象中对象之间传递消息的细节封装在一个独立的类中,从而减少这些对象之间直接交互所带来的复杂度,和集成测试的难度。 mediator调停者模式,是用在这种情况下的,有n个对象,他们之间形成了复杂的相互引用的关系,在最坏的情况下,可能形成了n*(n-1)/2的关系链,随着n的增大,n*(n-1)/2也就随之不断递增,从而就形成了一种高耦合的复杂结构。如果用一个调停者来管理这些对 ...
interator迭代模式,学过数据结构的,都知道迭代是怎么一回事,最简单的链表也是用到迭代来一个一个地读取数据。利用迭代模式来读取一系列按一定规则来存储的数据,而你不必理会封装的数据存储的结构是怎么样的,一般都会提供一个叫next的函数,要读取数据,只要next个若干次就行了。
如果原本是对List编码的,但后来要修改为Set,如果你在读取元素的地方使用了Iterator,那么就不用修改此处的代码,这一点在《java编程思想》也提到了。
ChainOfResponsiblity责任链模式。 一系列对象之间的消息传递形成了线性的或循环的传递结构,例如A可以传给B,B可以传给C,C可以传给D……当条件不满足传递时,就停止传递。 例如,客户端对象发出一个请求给服务端处理,而客户端只知道服务端有n个服务对象可以对这个请求作出响应,但是客户端并不清楚哪个服务端对象是最合适处理这个请求的。最原始的处理方式,就是在客户端程序进行n个if else的语句判断。当服务端在添加一个服务处理对象时,便在 ...
facade外观模式,简单明了的讲是,子系统封装聚集模式。facade外观模式遵循了迪米特法则,体现了松耦合原则。facade所面对的往往是多个类或其它程序单元,通过重新组合各类及程序单元,对外提供统一的接口,以便维护管理,减少复杂度和依赖性。 facade外观模式有点像数据库中视图的味道。在数据库中的视图对n个表的组合,客户端程序通过访问数据库的视图,而不必直接访问表,这样就减少了sql语句的编写,也可以减少很多代码量。如果数据的表万一有所改动,一般修改对应的视图就行了, ...
flyweight享元模式是实现对象的共享,减少重复数据的存储,从而减少内存分配的开销。享元模式融合了工厂模式和单例模式的思想,实际上也可以说享元模式是特殊的工厂模式。 如果要创建同个对象的n个实例,而通常这n个实例中的m个属性的值大部分或全部是相同的,那么最坏的情况就会有n*m个相同的数据占据了不同的内存空间,如果n*m的值较大的话,就可以考虑flyweight享元模式了。享元模式就把这m个相同的属性提取出来,结合单例模式和工厂模式,来实现相同属性值的实例分配 ...
composite合成模式可以使用户对象以同样的方式对待单独的对象或复合的对象,合成模式要设计一个公共接口,即可提供给单独的对象使用,也可以供给复合对象使用。 使得用户类一致地使用单独的对象或者复合的对象,也不必关系要如何处理复合对象,只需要向复合对象添加单独对象即可。 junit的Test接口的两个子类TestCase和TestSuite就是使用了合成模式。
&n ...
bridge桥接模式的目的和decorator装饰器模式是一样的,都是避免过多的子类,只是它们的实现的方法有所不同,桥接模式采用聚合的方式来实现。要对类的功能进行扩展,可以修改现有的代码来做,但是如果一个父类的n个子类都要该功能,那么就得修改n次,不但工作量大而且重复代码量很多。这也违反了面向对象的开放/封闭原则(对扩展来说是开放的,对修改来说是封闭的)。在前面的《decorator装饰器模式》中提到的“父类的n个子类的都要派生出子类并实现这些功能”,这种方来处理但然也是不合理的。 &nb ...
decorator装饰器模式,动态地扩展一个对象的功能,而不需要改变原始的类代码或使用继承。是通过创建一个跟目的类同一等级(继承目的类的父类)的称为装饰器的封装对象来实现的。要新添加的功能类继承这个装饰器,这样用户类可以像使用原来的类那样使用新添加的功能类。 decorator装饰器模式可以动态地添加功能,也可以动态地撤销功能。如果一个父类的n个子类,都需要有一个或若干个功能,而它们操作该功能的代码结构基本一致,这个时候就可以考虑使用decorator装饰器模式。如使用继承来实现的话,父类的n个子类的都要派生出子类并实现 ...
adapter适配器模式,目的在于扩展。是在原系统上进行扩展时用到的方法。 adapter适配器模式,个人认为在其名前加两个字,命名为接口适配模式。其用意是在保留原有类的前提下(即不改变原来的代码)把一个类的接口转换另一个接口,这样可以让具有不同接口的(原本接口不匹配的)多个类可以一起工作。而如果没有这样的转换,将不能使用到新的类提供的服务。 适配器可分为类适配器和对象适配器。
两种方式都实现了原接口或继承了原抽象类;在对新类的方法的重写的方式上 ...
prototype原型模式,简单明了的讲是,克隆并复用原型对象模式。 当客户机需要创建对象集时,其中对象是相似的,或仅在状态方面有所不同,并且创建此类对象将花费很多的时间,所涉及的处理也较多。比如,通过复制具有类似结构代码,并进行修改,来创建一个新的实例,这时可以考虑采用原型模式,这样就不必通过复制修改代码来实现新的实例,只要克隆一下另一个实例,通过修改相应的属性的值来到达你的目的。 克隆有浅克隆和深克隆。
class Person implements Cloneable {
...
builder构造模式,简单明了的讲就是一个对象(或者说是一个部件)实例化过程的提取模式。目的在于方便维护和扩展。 如果要创建的对象是复杂的,而且组成对象创建工程的一系列步骤可以按不同的方式来生成不同的对象,这是就应该要考虑使用构造模式,否则你把构造的所有的过程都放在一个对象里面,代码可能会变得很臃肿,这时应该把系统模块化。允许创建复杂的对象,可以只提供要创建的对象类型的相关信息,并且使有关对象创建的详细信息对客户机保持透明,这种方式方式允许相同的过程生成不同的对象。 在jdon里面讲的设计模式之Builder的例子(h ...
singleton单例设计模式,目的在于类之间的信息共享。 singleton单例设计模式也是相当容易理解的模式之一。就是在整个系统中,只有一个实例。更确切的讲,应该是让jvm一旦为某对象创建了一个引用,就不会在创建的一种模式。举一个在本人的项目中比较典型的例子,就是用户在某个类中就行了一些信息处理,接着用户可能会频繁的使用到这些处理后的信息而且这些信息占用的空间较小,那么就应该把这些信息保存在一个单例中。 sin ...
factory工厂设计模式,目的在于方便系统扩展。 这是设计模式里面最容易理解的模式之一。工厂就是可以生产东西的地方,然而一个工厂也是限定生产成品的,例如生产鞋子和袜子的工厂,你只能定鞋子和袜子的货。for example,在我的一个项目里面,有这样的功能,就是多格式文件处理,并获取一定信息,由于各种格式的文件的格式不同,所以读取方式不同,就要对应的类进行读取。我是这样处理的,根据传进来的文件名,判断其文件的后缀,然后在工厂类中获取一个对应的读取类的实例。 我的代码大概架 ...
- 浏览: 2424 次
- 性别:

- 来自: 深圳

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
POI读取EXCEL文件的错误 ...
用程序做转换,暂时还不知道
-- by linbzh -
POI读取EXCEL文件的错误 ...
那么该怎么用程序来实现这个转换呢?我也碰到这样的问题...
-- by computerceo -
finally里的return与java ...
infile()函数的异常在只在infile()函数捕抓,而抛出的异常throw ...
-- by gaoran2008 -
struts的ActionForm的一个 ...
struts.do?type=all---你的URL都是这样的,也就是说你的ty ...
-- by gaoran2008 -
finally里的return与java ...
这是语法规则,不是缺陷
-- by jsyx






评论排行榜