申艳超-博客

搜索引擎、分布式、高性能、NLP、ElasticSearch、Solr

0%

定义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义这个算法的某些特定步骤。
简单的说,就是你首先定义一下算法的各部分之间的执行顺序或者调用关系,然后在子类中实现具体每一部分是如何实现的。

采用什么算法作为例子呢?就是用把动物放进冰箱这个算法吧。

Read more »

工厂模式,直接按名字来说,就是负责专门生产产品的。
大致分为3类:

  • 工厂方法
  • 简单工厂
  • 抽象工厂

同时,也有人认为简单工厂只是工厂方法的一种特列,那么就分为两种了。本文就按3种分别进行介绍了。

工厂方法

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法让一个类的实例化延迟到其子类。

Read more »

定义:建造者模式,又叫生成器模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.
适用性:

a.当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式.
b.当构建过程必须允许构造的对象有不同的表示.

构建者模式的核心思想:

将一个“复杂对象的构建算法”与它的“部件及组装方式”分离,使得构件算法和组装方式可以独立应对变化;复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用相同的部件组装方式。

建造者者模式有4个角色:

  • Product产品类:
    要构建的对象
  • Builder抽象构建者:
    定义操作接口
  • ConcreteBuilder具体建造者:
    实现Builder所有方法
  • Director导演类:
    每个观察者在接收到消息后的更新操作是不同的。
Read more »

定义:中介者模式,用一个中介对象封装一系列的对象交互,中介者使各对象不需要显式的相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互.

相关角色

  • Mediator抽象中介者角色
    抽象中介者角色定义统一的接口,用于各个角色之间的通信.
  • Concrete Mediator具体中介者
    具体中介者角色通过协调各同事角色实现协作行为,因此它必须依赖于各个同事角色.
  • Colleague同事角色
    每一个同事角色都知道中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作.

定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

访问者模式有以下几个角色:

  • Visitor抽象访问者
    抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就visit方法的参数定义哪些对象是可以被访问的。
  • ConcreteVisitor具体访问者
    它影响访问者访问到一个类后该怎么办,要做什么事情。
  • Element抽象元素
    接口或者抽象类,声明接受哪一类访问者访问。程序上是通过accept方法中的参数来定义的。
  • ConcreteElement具体元素
    实现accept方法,通常是visitor.visit(this),基本都形成一个模式了。
  • ObjectStruture结构对象
    元素产生者,一般容纳在多个不同类,不同接口的容器。项目中,一般很少抽象这个角色。
Read more »

定义:当一个对象内在状态改变时允许其改变行为,这个对象看起来想改变了其类。
状态模式的核心是封装,状态的变更引起了行为的变更,从外部看起来就好像这个对象对应的类发生了改变一样。

状态模式有3个角色:

  • State抽象状态角色
    接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态转换。
  • ConcreteState具体状态角色
    每一个具体状态必须完成2个职责:本状态的行为管理以及趋向状态处理。简单说,就是本状态下要做的事情,以及本状态如何过渡到其他状态。
  • Context环境角色
    定义客户端需要的接口,并且负责具体状态的切换。
Read more »

定义:策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(Policy Pattern)。定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。

策略模式有3个角色:

  • Context封装角色
    它叫上下文角色,起承上启下封装的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
  • Strategy抽象策略角色
    策略、算法的家族的抽象,通常为接口。
  • ConcreteStrategy具体策略角色
    实现抽象策略中的操作,该类含有具体的算法。

下面借用刘备江东娶亲,诸葛亮给赵云3个妙计的故事来说明这个问题。

Read more »

定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

备忘录模式有以下三个角色:

  • Originator发起人角色
    记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。
  • Memento备忘录角色
    负责存储Originator发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。
  • Caretaker备忘录管理员角色
    对备忘录进行管理、保存和提供备忘录。
Read more »

相信大家一定在开发中见过并且写过类似这样的代码:

1
2
3
4
5
6
7
8
9
10
public Book getBook(int id) {  
if (id < 0) {
return null;
}
return new Book(1, "Design Pattern", 100);
}

Book book = getBook(-1);
if (book != null) {
}

系统在使用对象的相关功能时,总要检查对象是否为null,如果不为null,我们才会调用它的相关方法,完成某种逻辑。这样的检查在一个系统中出现很多次,相信任何一个设计者都不愿意看到这样的情况。为了解决这种问题,我们可以可以引入空对象,这样,我们就可以摆脱大量程式化的代码,对代码的可读性也是一个飞跃。

Read more »

定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

责任链由2个角色组成:

  • Handler抽象处理者角色

    它定义了一个处理请求的接口。当然对于链子的不同实现,也可以在这个角色中实现后继链。

  • Concrete Handler具体处理者角色

    实现抽象角色中定义的接口,并处理它所负责的请求。如果不能处理则访问它的后继者。

比如Filter就类似这种,每个Filter都对请求进行处理,如果解决不了,则交给下一个进行处理。