设计模式学习(九)——职责链模式

职责链模式定义

职责链模式(Chain of Responsibility Pattern)避免请求发送者和接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

在客户端创建好传递链之后,发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。

值得注意的是,如果建链不当,可能会造成循环调用,将导致系统陷入死循环。

阅读全文 »

设计模式学习(八)——代理模式

代理模式定义

代理模式(Proxy Pattern)为另一个对象提供一个替身或占位符以控制对这个对象的访问。

在一些情况下,客户端不想或不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介作用,去掉客户不能看到的内容和服务或者增添客户需要的额外服务。

阅读全文 »

设计模式学习(七)——外观模式

外观模式定义

外观模式(Facade Pattern)提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

外观模式允许我们让客户和子系统之间避免紧耦合,它遵守“最少知识”原则。这个原则希望我们在设计中,不要让太多的类耦合在一起,免得修改系统中一部分,会影响到其他部分。如果许多类之间相互依赖,那么这个系统就会变成一个易碎的系统,它需要花许多成本维护,也会因为太复杂而不容易被其他人了解。

外观模式对客户屏蔽子系统组件,减少了客户处理的对象数目,使得子系统使用起来更加容易。

阅读全文 »

设计模式学习(六)——组合模式

组合模式定义

组合模式(Composite Pattern)通过组合多个对象形成树型结构,以表示“整体-部分”的结构层次。组合模型对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性。换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别。

组合结构内的任意对象称为组件,组件可以是组合,也可以是叶子节点。

阅读全文 »

设计模式学习(五)——备忘录模式

备忘录模式定义

备忘录模式(Memento Pattern)确保在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

备忘录模式有两个目标:

  • 储存系统关键对象的重要状态;

  • 维护关键对象的封装。

阅读全文 »

设计模式学习(四)——解释器模式

解释器模式定义

解释器模式(Interpreter Pattern)描述了如何为语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。这里的语言意思是使用规定格式和语法的代码。

简单说来,解释器模式用来为语言创建解释器。

阅读全文 »

设计模式学习(三)——访问者模式

访问者模式定义及优缺点

访问者模式(Visitor Pattern)用于表示一个作用于某对象结构中的各元素的操作,它使得用户可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

访问者模式使得对对象的操作变得更为灵活,它将数据结构和作用于结构上的操作之间的耦合解脱开,使得增加一个新的访问者类变得很方便。

访问者模式的优点:

  • 允许你对组合结构加入新的操作,而无需改变结构本身;
阅读全文 »

设计模式学习(二)——策略模式

策略模式定义

策略模式(Strategy Pattern)中定义一系列算法,并将每一个算法封装起来,使它们可以相互替换,策略模式让算法独立于使用它的客户而变化。

有许多算法可以实现同一功能,比如存在多种搜索算法、排序算法等。如果将这些算法硬编码在程序中,则会导致系统变得庞大而难以维护,在增加新的算法或改变现有算法时也将变得十分困难。为了解决类似问题,可以定义一些独立的类来封装不同的算法,每一个封装算法的类成为策略

阅读全文 »

滑稽的大雨

(一)

记得唐代诗人李约的《观祈雨》是这么写的:“桑条无叶土生烟,箫管迎龙水庙前。朱门几处看歌舞,犹恐春阴咽管弦。”这是一首悯农诗,写观看春日祈雨的感慨,前两句写农民春旱祈雨的场面,后两句写朱门看歌舞的情景。同样是面对久旱无雨,两种不同生活的描绘,足见当时的阶级对立和贫富悬殊。农民们由于天旱而忧虑一年生计,豪门权贵却日夜笙歌,犹恐天阴下雨使乐器受潮。

有时候很佩服古人,三言两语就能把眼前所见之景和想要表达的意思抒发出来,言简意赅,意犹未尽。我喜欢这样简短的表达,留有空白,引人思索。我厌烦喋喋不休、长篇大论的赘述,把简单变为复杂,让人听得云里雾里。

阅读全文 »

设计模式学习(一)——命令模式

命令模式定义

命令模式(Command Pattern)将一个 [ 请求 | 命令 | 调用方法 ] 封装为一个对象,从而可用不同的 [ 请求 | 命令 | 调用方法 ] 对客户进行参数化,对 [ 请求 | 命令 | 调用方法 ] 排队或记录其日志,以及支持可撤销的操作。

命令模式可以对发送者(Sender)和接收者(Receiver)完全解耦(Decoupling)发送者是请求操作(发出命令)的对象,接收者是接收请求(接收命令)并执行某相应操作的对象。

阅读全文 »