空对象模式在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。概要意图使用一个空对象代替 null 值,这个空对象实现了相同的接口,但对请求不做任何操作或提供默认操作。主要解决的问题
空对象模式解决的是在系统中使用null值可能导致的问题,如NullPointerException异常。它允许系统在没有合适对象时,使用一个”安全”的空对象继续运行,而不是失败。
使用场景
当系统中需要处理null对象,但又希望避免null检查或处理null值时。
实现方式
定义协议:定义一个协议或接口,规定需要实现的行为。创建具体对象:实现协议的具体对象,提供实际的行为。创建空对象:也实现相同的协议,但提供”空”的实现,即不执行任何有意义的操作。
关键代码
协议或接口:规定对象需 ...
状态模式在状态模式(State Pattern)中,类的行为是基于它的状态改变的,这种类型的设计模式属于行为型模式。在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。状态模式允许对象在内部状态改变时改变其行为,使得对象在不同的状态下有不同的行为表现。通过将每个状态封装成独立的类,可以避免使用大量的条件语句来实现状态切换。介绍意图允许一个对象在其内部状态改变时改变其行为,看起来就像是改变了其类一样。主要解决的问题
状态模式解决对象行为依赖于其状态的问题,使得对象可以在状态变化时切换行为。
使用场景
当代码中存在大量条件语句,且这些条件语句依赖于对象的状态时。
实现方式
定义状态接口:声明一个或多个方法,用于封装具体状态的行为。创建具体状态类:实现状态接口,根据状态的不同实现具体的行为。定义上下文类:包含一个状态对象的引用,并在状态改变时更新其行为。
关键代码
状态接口:声明行为方法。具体状态类:实现状态接口,封装具体行为。上下文类:维护一个状态对象,并提供方法以改变其状态。
应用实例
篮球运动员状态:运动员可以有正常、不正常和超常等状态。曾 ...
模板模式在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。介绍意图 在父类中定义了算法的骨架,并允许子类在不改变算法结构的前提下重定义算法的某些特定步骤。主要解决的问题
解决在多个子类中重复实现相同的方法的问题,通过将通用方法抽象到父类中来避免代码重复。
使用场景
当存在一些通用的方法,可以在多个子类中共用时。
实现方式
定义抽象父类:包含模板方法和一些抽象方法或具体方法。实现子类:继承抽象父类并实现抽象方法,不改变算法结构。
关键代码
模板方法:在抽象父类中定义,调用抽象方法和具体方法。抽象方法:由子类实现,代表算法的可变部分。具体方法:在抽象父类中实现,代表算法的不变部分。
应用实例
建筑流程:地基、走线、水管等步骤相同,后期建筑如加壁橱、栅栏等步骤不同。西游记的81难:菩萨定好的81难代表一个顶层逻辑骨架。Spring对Hibernate的支持:封装了如开启事务、获取Session、关闭Session等通用方法。
优点
封装不 ...
桥接模式桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类,这两种类型的类可被结构化改变而互不影响。桥接模式的目的是将抽象与实现分离,使它们可以独立地变化,该模式通过将一个对象的抽象部分与它的实现部分分离,使它们可以独立地改变。它通过组合的方式,而不是继承的方式,将抽象和实现的部分连接起来。我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法。其中,可以使用相同的抽象类方法但是不同的桥接实现类,来画出不同颜色的圆。介绍意图用于将抽象部分与实现部分分离,使得它们可以独立地变化。。主要解决的问题避免使用继承导致的类爆炸问题,提供更灵活的扩展方式。使用场景当系统可能从多个角度进行分类,且每个角度都可能独立变化时,桥接模式是合适的。实现方式
分离多角度分类:将不同角度的分类逻辑分离,允许它们独立变化。减少耦合:降低抽象与实现之间的耦合度。
关键代码
抽象类:定义一个抽象类,作为系统的一部分。实现类:定 ...
服务定位器模式服务定位器模式(Service Locator Pattern)用在我们想使用 JNDI 查询定位各种服务的时候。考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术。在首次请求某个服务时,服务定位器在 JNDI 中查找服务,并缓存该服务对象。当再次请求相同的服务时,服务定位器会在它的缓存中查找,这样可以在很大程度上提高应用程序的性能。以下是这种设计模式的实体。
服务(Service) - 实际处理请求的服务。对这种服务的引用可以在 JNDI 服务器中查找到。Context / 初始的 Context - JNDI Context 带有对要查找的服务的引用。服务定位器(Service Locator) - 服务定位器是通过 JNDI 查找和缓存服务来获取服务的单点接触。缓存(Cache) - 缓存存储服务的引用,以便复用它们。客户端(Client) - Client 是通过 ServiceLocator 调用服务的对象。
概要意图用于在应用程序中提供一个中心化的服务访问点,用以获取各种服务或资源。主要解决的问题
解决在应用程序中需要访问各 ...
数据访问对象模式数据访问对象模式(Data Access Object Pattern)或 DAO 模式用于把低级的数据访问 API 或操作从高级的业务服务中分离出来。以下是数据访问对象模式的参与者。
数据访问对象接口(Data Access Object Interface) - 该接口定义了在一个模型对象上要执行的标准操作。数据访问对象实体类(Data Access Object concrete class) - 该类实现了上述的接口。该类负责从数据源获取数据,数据源可以是数据库,也可以是 xml,或者是其他的存储机制。模型对象/数值对象(Model Object/Value Object) - 该对象是简单的 POJO,包含了 get/set 方法来存储通过使用 DAO 类检索到的数据。
概要意图将数据访问逻辑从业务逻辑中分离出来,并将数据访问操作封装在一个专用的类中。主要解决的问题
解决业务逻辑与数据访问逻辑紧密耦合的问题,提高代码的可维护性和可重用性。
使用场景
当需要将应用程序的数据访问逻辑集中管理,以便简化业务逻辑并易于进行数据操作时。
实 ...
拦截过滤器模式拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。
过滤器(Filter) - 过滤器在请求处理程序执行请求之前或之后,执行某些任务。过滤器链(Filter Chain) - 过滤器链带有多个过滤器,并在 Target 上按照定义的顺序执行这些过滤器。Target - Target 对象是请求处理程序。过滤管理器(Filter Manager) - 过滤管理器管理过滤器和过滤器链。客户端(Client) - Client 是向 Target 对象发送请求的对象。
概要意图用于在请求到达最终目的地之前,通过一系列过滤器对请求进行预处理和后处理。主要解决的问题
解决Web应用程序中需要在请求处理前后执行通用操作(如日志记录、安全检查、事务管理等)的问题。
使用场景
当需要在请求处理流程中插入额外的逻辑,而这些逻辑与业 ...
抽象工厂模式抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体实现类。通过使用抽象工厂模式,可以将客户端与具体产品的创建过程解耦,使得客户端可以通过工厂接口来创建一族产品。概要意图提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。主要解决接口选择的问题。适用场景当系统需要创建多个相关或依赖的对象,而不需要指定具体类时。解决方案在一个产品族中定义多个产品,由具体工厂实现创建这些产品的方法。关键代码在一个工厂中聚合多个同类产品的创建方法。应用实例假设有不同类型的衣柜,每个衣柜(具体工厂)只能存放一类衣服(成套的具体产品),如商务装、时尚装等。每套衣服包括具体的上衣和裤子(具体产品)。所有衣柜都是衣柜类(抽象工厂)的具体实现,所有上衣和裤子分别实现 ...
建造者模式建造者模式是一种创建型设计模式,它允许你创建复杂对象的步骤与表示方式相分离。建造者模式是一种创建型设计模式,它的主要目的是将一个复杂对象的构建过程与其表示相分离,从而可以创建具有不同表示形式的对象。概要意图将一个复杂的构建过程与其表示相分离,使得同样的构建过程可以创建不同的表示。主要解决在软件系统中,一个复杂对象的创建通常由多个部分组成,这些部分的组合经常变化,但组合的算法相对稳定。何时使用当一些基本部件不变,而其组合经常变化时。如何解决将变与不变的部分分离开。关键代码建造者:创建并提供实例。导演:管理建造出来的实例的依赖关系和控制构建过程。应用实例去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出不同的”套餐”。Java 中的 StringBuilder。优点分离构建过程和表示,使得构建过程更加灵活,可以构建不同的表示。可以更好地控制构建过程,隐藏具体构建细节。代码复用性高,可以在不同的构建过程中重复使用相同的建造者。缺点如果产品的属性较少,建造者模式可能会导致代码冗余。增加了系统的类和对象数量。使用场景需要生成的对象具有复杂的内部结构。需要生成的对 ...
工厂模式工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,它提供了一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。
工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。通过使用工厂模式,可以将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和可扩展性。工厂模式的类型简单工厂模式(Simple Factory Pattern):简单工厂模式不是一个正式的设计模式,但它是工厂模式的基础。它使用一个单独的工厂类来创建不同的对象,根据传入的参数决定创建哪种类型的对象。工厂方法模式(Factory Method Pattern):工厂方法模式定义了一个创建对象的接口,但由子类决定实例化哪个类。工厂方法将对象的创建延迟到子类。抽象工厂模式(Abstract Factory Pattern):抽象工厂模式提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。概要意图定义一个创建对象的接口,让其子类决定实例化哪一个具体的类。工厂模式使对象的创建过程延迟到子类。主要解决接口选择的问题。何时使用 ...