saville

博客园 首页 新随笔 联系 订阅 管理

2013年5月19日 #

摘要: 一、概述在软件开发中,有时需要保存一个对象的状态,以便于允许用户取消相关操作或者从以往的状态中恢复过来。比如一个文档版本管理系统,可以根据需要将指定文档恢复到之前保存过的任意一个状态。这时就可以通过备忘录模式来实现。二、备忘录模式备忘录模式可以在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态。其结构图如下:Memento用于保存Originator对象的内部状态。Originator创建Memento,并根据需要决定需要在Memento中保存那些状态,同时还能从Memento中恢复内部状态。Caretaker负责保存Memento对象,但不对Memento对象进行任何操 阅读全文
posted @ 2013-05-19 21:52 saville 阅读(1659) 评论(1) 推荐(0) 编辑

2013年4月14日 #

摘要: 一、概述在软件开发中,我们有时会碰上许多对象互相联系互相交互的情况,对象之间存在复杂的引用关系,当需求更改时,对系统进行修改将会非常困难。为了对系统的对象进行解耦,可以引入一个间接层来管理对象之间的关系,这就是中介者模式。二、中介者模式用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。其结构图如下:Mediator作为中介者定义一个接口用于与各Colleague对象交互。ConcreteMediator实现了Mediator接口,作为具体的中介者通过协调各Colleague对象实现协作行为。每一个Colleague中都 阅读全文
posted @ 2013-04-14 22:24 saville 阅读(2336) 评论(3) 推荐(2) 编辑

2013年3月12日 #

摘要: SQL Server 2008中引入了数据压缩的功能,允许在表、索引和分区中执行数据压缩。这样不仅可以大大节省磁盘的占用空间,还允许将更多数据页装入内存中,从而降低磁盘IO,提升查询的性能。当然,凡事有利有弊,在启用数据压缩后,数据库服务器就需要额外的CPU资源来进行压缩处理。一般说来,数据库服务器的CPU占用率不会太高,而磁盘IO容易成为瓶颈,所以在大多数情况下对大数据库特别是数据仓库启用该项功能还是利大于弊。SQL Server 2008的数据压缩分为行压缩和页压缩两种。行压缩主要是通过将固定长度类型存储为可变长度类型来实现,同时还减少了与记录相关联的元数据开销。页压缩在行压缩的基础上又增 阅读全文
posted @ 2013-03-12 13:34 saville 阅读(5496) 评论(2) 推荐(2) 编辑

2013年2月18日 #

摘要: 一、概述在软件开发中,我们有时需要创建大量细粒度的对象,比如文档处理系统就可能需要创建成千上万的字符对象。但如果对每个字符对象都分配内存,那么在系统运行时就会耗费大量的内存。如何在保留面向对象操作方式优点的同时避免创建大量的对象呢?这就到了享元模式发挥作用的时候了。二、享元模式享元模式运用共享技术有效地支持大量细粒度的对象。例如可以对文档处理系统创建共享池,在共享池中建立字母和代码的对应关系,这样就可以用共享池中的26个对象解决需要创建大量对象的问题。其结构图如下:Flyweight定义了享元接口,外部对象通过这个接口来访问具体的享元对象。ConcreteFlyweight实现Flyweigh 阅读全文
posted @ 2013-02-18 22:17 saville 阅读(3129) 评论(3) 推荐(3) 编辑

2013年1月10日 #

摘要: 一、概述在软件开发中,经常会碰上某些对象,其创建的过程比较复杂,而且随着需求的变化,其创建过程也会发生剧烈的变化,但他们的接口却能比较稳定。对这类对象的创建,我们应该遵循依赖倒置原则,即抽象不应该依赖于实现细节,实现细节应该依赖于抽象。原型模式为我们提供了这样一个解决方案,使得客户程序可以隔离出这些易变的创建过程,从而摆脱创建细节的纠缠。二、原型模式原型模式可以用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其结构图如下:Prototype声明了克隆自身的一个接口。ConcretePrototype继承Prototype并定义了克隆自身的操作。Client通过原先克隆自身来创建 阅读全文
posted @ 2013-01-10 22:21 saville 阅读(1377) 评论(0) 推荐(1) 编辑

2012年12月5日 #

摘要: 一、概述在软件开发中,我们有时候会遇上一个对象具有多个变化维度。比如对汽车对象来说,可能存在不同的汽车类型,如公共汽车、轿车等,也可能存在不同的发动机,如汽油发动机、柴油发动机等。对这类对象,可应用桥接模式来增强系统灵活度,避免由于多维度变化带来的复杂性。二、桥接模式桥接模式利用对象的组合关系将不同的变化维度分离,使其可以沿着各自的维度来变化。其结构图如下:Abstraction定义了抽象类,并包含Implementor对象。RefinedAbstraction实现了抽象类。Implementor定义了另一个变化维度。ConcreteImplementor提供了第二个变化维度接口的具体实现。三 阅读全文
posted @ 2012-12-05 18:40 saville 阅读(1531) 评论(0) 推荐(0) 编辑

2012年11月11日 #

摘要: 一、概述在软件开发中,我们往往会遇上类似树形结构的对象体系。即某一对象既可能在树形结构中作为叶节点存在,也可能作为分支节点存在。比如在文件系统中,文件是作为叶节点存在,而文件夹就是分支节点。在设计这类对象时,如果将叶节点和分支节点区别对待,那么在实际开发中会带来较大的复杂性。比如客户端调用时可能会频繁的使用转型操作,同时代码的可维护性和扩展性也较差。在设计中使用组合模式可以解决这一系列弊端。二、组合模式组合模式定义了叶节点和分支节点的一致的接口,将客户端代码与复杂的对象结构解耦,大大降低了客户端调用的复杂性。其结构图如下:Component定义了所有对象的共同接口,可以在Component中定 阅读全文
posted @ 2012-11-11 22:48 saville 阅读(2023) 评论(3) 推荐(0) 编辑

2012年10月18日 #

摘要: 一、概述在系统设计中,某一个系统可能非常庞大,用户要使用该系统就不得不掌握大量的接口,造成使用的不便。这时可以考虑将该系统细分成一系列子系统并使子系统间的耦合降到最低,利用外观模式提供一个外观对象,为这一系列子系统提供一个简单的使用接口,这样用户只需要掌握外观对象上的少量接口即可使用该系统。就以汽车为例,一辆汽车由引擎、车轮、刹车等无数子系统构成,大多数用户在实际使用过程中并不关心这些子系统之间的工作细节,他们只希望能简单的启动、刹车即可。二、外观模式外观模式为系统中的一组接口定义了一个高层接口,这个接口使得这一系统更加容易使用。外观模式能有效简化外部程序和系统间的交互接口,将外部程序的演化和 阅读全文
posted @ 2012-10-18 20:33 saville 阅读(919) 评论(0) 推荐(0) 编辑

2012年9月4日 #

摘要: 一、概述在软件开发中,某一个对象的请求可能会被多个对象处理,但每次最多只有一个对象处理该请求,对这类问题如果显示指定请求的处理对象,那么势必会造成请求与处理的紧耦合,为了将请求与处理解耦,我们可以使用职责链模式,职责链模式可以向多个处理对象提交请求,具体由哪个处理对象进行处理则是在运行过程中动态指定。二、职责链模式职责链模式将多个处理对象连接形成一条链,并沿着该链传递需处理的请求,直到有一个对象被处理或是请求被传递到链的末尾为止。该模式将请求与处理解耦,可以动态的增减处理职责,增加了灵活性。其结构图如下:Handler定义了处理对象的接口,往往通过它来实现后继的职责链。ConcreteHand 阅读全文
posted @ 2012-09-04 20:58 saville 阅读(2411) 评论(0) 推荐(0) 编辑

2012年8月15日 #

摘要: 一、概述在软件设计工作中会存在对象之间的依赖关系,当某一对象发生变化时,所有依赖它的对象都需要得到通知。如果设计的不好,很容易造成对象之间的耦合度太高,难以应对变化。使用观察者模式可以降低对象之间的依赖,以松耦合的方式实现这一目标。二、观察者模式观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。其结构图如下:Subject知道它的所有观察者并提供了观察者注册和删除订阅的接口。Observer为那些在目标发生改变时需获得通知的对象定义一个更新接口。ConcreteSubject实现Subject接口,当改变状态时向依赖于它的Concr 阅读全文
posted @ 2012-08-15 16:33 saville 阅读(5487) 评论(0) 推荐(0) 编辑