过滤器模式过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。概要意图用于将对象的筛选过程封装起来,允许使用不同的筛选标准动态地筛选对象。主要解决的问题当需要根据多个不同的条件或标准来筛选一组对象时,过滤器模式提供了一种灵活的方式来定义这些条件,避免在客户端代码中硬编码筛选逻辑。使用场景
当对象集合需要根据不同的标准进行筛选时。当筛选逻辑可能变化,或者需要动态地组合多个筛选条件时。
实现方式
定义筛选接口:创建一个筛选接口,定义一个筛选方法。实现具体筛选器:为每个筛选标准实现筛选接口,封装具体的筛选逻辑。组合筛选器:允许筛选器之间进行组合,形成复杂的筛选逻辑。
关键代码
筛选接口:定义筛选方法,如 matches()。具体筛选器类:实现筛选接口,封装具体的筛选逻辑。组合筛选器:实现筛选器的组合逻辑,如逻辑与(AND)、逻辑或(OR)等。
应用实例
图书管理系统:根据作者、出版年份、类 ...
责任链模式责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。责任链模式通过将多个处理器(处理对象)以链式结构连接起来,使得请求沿着这条链传递,直到有一个处理器处理该请求为止。责任链模式允许多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。介绍意图允许将请求沿着处理者链传递,直到请求被处理为止。。主要解决的问题
解耦请求发送者和接收者,使多个对象都有可能接收请求,而发送者不需要知道哪个对象会处理它。
使用场景
当有多个对象可以处理请求,且具体由哪个对象处理由运行时决定时。当需要向多个对象中的一个提交请求,而不想明确指定接收者时。
实现方式
定义处理者接口:所有处理者必须实现同一个接口。创建具体处理者:实现接口的具体类,包含请求处理逻辑和指向链中下一个处理者的引用。
关键代码
Handler接口:定义一个方法用于处理请求。ConcreteHandler类: ...
访问者模式在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。介绍意图旨在将数据结构与在该数据结构上执行的操作分离,从而使得添加新的操作变得更容易,而无需修改数据结构本身。主要解决的问题
解决在稳定数据结构和易变操作之间的耦合问题,使得操作可以独立于数据结构变化。
使用场景
当需要对一个对象结构中的对象执行多种不同的且不相关的操作时,尤其是这些操作需要避免”污染”对象类本身。
实现方式
定义访问者接口:声明一系列访问方法,一个访问方法对应数据结构中的一个元素类。创建具体访问者:实现访问者接口,为每个访问方法提供具体实现。定义元素接口:声明一个接受访问者的方法。创建具体元素:实现元素接口,每个具体元素类对应数据结构中的一个具体对象。
关键代码
访问者接口:包含访问不同元素的方法。具体访问者:实现了访问者接口,包含对每个元素类的访问逻辑。元素接口:包含一个接受访问者的方法。具体元 ...
设计模式简介
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。
什么是 GOF(四人帮,全拼 Gang of Four)?在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements ...
解释器模式解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。解释器模式给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。这种模式被用在 SQL 解析、符号处理引擎等。介绍意图定义一种语言的文法表示,并创建一个解释器,该解释器能够解释该语言中的句子。。主要解决的问题
解释器模式用于构建一个能够解释特定语言或文法的句子的解释器。
使用场景
当某一特定类型的问题频繁出现,并且可以通过一种简单的语言来表达这些问题的实例时。
实现方式
定义文法:明确语言的终结符和非终结符。构建语法树:根据语言的句子构建对应的语法树结构。创建环境类:包含解释过程中所需的全局信息,通常是一个HashMap。
关键代码
终结符与非终结符:定义语言的文法结构。环境类:存储解释过程中需要的外部环境信息。
应用实例编译器:解释器模式可以用于编译器设计,将源代码解释为目标代码。正则表达式:解释器模式可以用于解析和执行正则表达式。SQL解析:解释器模式可以用于解析和执行SQL语句。优点
可扩展性好:容易添加新的解释表达式的方式 ...
观察者模式观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。介绍意图创建了对象间的一种一对多的依赖关系,当一个对象状态改变时,所有依赖于它的对象都会得到通知并自动更新。。主要解决的问题
观察者模式解决的是一个对象状态改变时,如何自动通知其他依赖对象的问题,同时保持对象间的低耦合和高协作性。
使用场景
当一个对象的状态变化需要同时更新其他对象时。
实现方式
定义观察者接口:包含一个更新方法。创建具体观察者:实现观察者接口,定义接收到通知时的行为。定义主题接口:包含添加、删除和通知观察者的方法。创建具体主题:实现主题接口,管理观察者列表,并在状态改变时通知它们。
关键代码
观察者列表:在主题中维护一个观察者列表。
应用实例
拍卖系统:拍卖师作为主题,竞价者作为观察者,拍卖价格更新时通知所有竞价者。西游记故事:菩萨洒水作为状态改变,老乌龟作为观察者,观察到这一变 ...
装饰器模式装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。装饰器模式通过将对象包装在装饰器类中,以便动态地修改其行为。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。概要意图动态地给一个对象添加额外的职责,同时不改变其结构。装饰器模式提供了一种灵活的替代继承方式来扩展功能。主要解决的问题
避免通过继承引入静态特征,特别是在子类数量急剧膨胀的情况下。允许在运行时动态地添加或修改对象的功能。
使用场景
当需要在不增加大量子类的情况下扩展类的功能。当需要动态地添加或撤销对象的功能。
实现方式
定义组件接口:创建一个接口,规定可以动态添加职责的对象的标准。创建具体组件:实现该接口的具体类,提供基本功能。创建抽象装饰者:实现同样的接口,持有一个组件接口的引用,可以在任何时候动态地添加功能。创建具体装饰者:扩展抽象装饰者,添加额外的职责 ...
组合模式组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的层次结构。介绍意图将对象组合成树形结构以表示”部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。主要解决的问题
简化树形结构中对象的处理,无论它们是单个对象还是组合对象。解耦客户端代码与复杂元素的内部结构,使得客户端可以统一处理所有类型的节点。
使用场景
当需要表示对象的层次结构时,如文件系统或组织结构。当希望客户端代码能够以一致的方式处理树形结构中的所有对象时。
实现方式
统一接口:定义一个接口,所有对象(树枝和叶子)都实现这个接口。组合结构:树枝对象包含一个接口的引用列表,这些引用可以是叶子或树枝。
关键代码
Component接口:定义了所有对象必须实现的操作。Leaf类:实现Compon ...
组合实体模式组合实体模式(Composite Entity Pattern)用在 EJB 持久化机制中。一个组合实体是一个 EJB 实体 bean,代表了对象的图解。当更新一个组合实体时,内部依赖对象 beans 会自动更新,因为它们是由 EJB 实体 bean 管理的。以下是组合实体 bean 的参与者。
组合实体(Composite Entity) - 它是主要的实体 bean。它可以是粗粒的,或者可以包含一个粗粒度对象,用于持续生命周期。粗粒度对象(Coarse-Grained Object) - 该对象包含依赖对象。它有自己的生命周期,也能管理依赖对象的生命周期。依赖对象(Dependent Object) - 依赖对象是一个持续生命周期依赖于粗粒度对象的对象。策略(Strategies) - 策略表示如何实现组合实体。
概要意图将数据库中的表转换为应用程序中的组合对象,这些对象可以表示表中的单个记录或一组记录。主要解决的问题
解决在对象关系映射中,如何高效地表示和管理数据库中的复杂数据结构,特别是当存在一对多或多对多关系时。
使用场景
当数据库表具有复杂的关系,或者需要将数据 ...
策略模式在策略模式(Strategy Pattern)中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需要修改客户端代码。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。介绍意图将每个算法封装起来,使它们可以互换使用。主要解决的问题
解决在多种相似算法存在时,使用条件语句(如if…else)导致的复杂性和难以维护的问题。
使用场景
当一个系统中有许多类,它们之间的区别仅在于它们的行为时。
实现方式
定义策略接口:所有策略类都将实现这个统一的接口。创建具体策略类:每个策略类封装一个具体的算法或行为。上下文类:包含一个策略对象的引用,并通过该引用调用策略。
关键代码
策略接口:规定了所有策略类必须实现的方法。具体策略类:实现了策略接口,包含具体的算法实现。
应用实例
锦囊妙计:每个锦囊代表一个策略,包含不同的计策。旅行方式选择 ...