访问者模式在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。介绍意图旨在将数据结构与在该数据结构上执行的操作分离,从而使得添加新的操作变得更容易,而无需修改数据结构本身。主要解决的问题
解决在稳定数据结构和易变操作之间的耦合问题,使得操作可以独立于数据结构变化。
使用场景
当需要对一个对象结构中的对象执行多种不同的且不相关的操作时,尤其是这些操作需要避免”污染”对象类本身。
实现方式
定义访问者接口:声明一系列访问方法,一个访问方法对应数据结构中的一个元素类。创建具体访问者:实现访问者接口,为每个访问方法提供具体实现。定义元素接口:声明一个接受访问者的方法。创建具体元素:实现元素接口,每个具体元素类对应数据结构中的一个具体对象。
关键代码
访问者接口:包含访问不同元素的方法。具体访问者:实现了访问者接口,包含对每个元素类的访问逻辑。元素接口:包含一个接受访问者的方法。具体元 ...
解释器模式解释器模式(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)导致的复杂性和难以维护的问题。
使用场景
当一个系统中有许多类,它们之间的区别仅在于它们的行为时。
实现方式
定义策略接口:所有策略类都将实现这个统一的接口。创建具体策略类:每个策略类封装一个具体的算法或行为。上下文类:包含一个策略对象的引用,并通过该引用调用策略。
关键代码
策略接口:规定了所有策略类必须实现的方法。具体策略类:实现了策略接口,包含具体的算法实现。
应用实例
锦囊妙计:每个锦囊代表一个策略,包含不同的计策。旅行方式选择 ...
状态模式在状态模式(State Pattern)中,类的行为是基于它的状态改变的,这种类型的设计模式属于行为型模式。在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。状态模式允许对象在内部状态改变时改变其行为,使得对象在不同的状态下有不同的行为表现。通过将每个状态封装成独立的类,可以避免使用大量的条件语句来实现状态切换。介绍意图允许一个对象在其内部状态改变时改变其行为,看起来就像是改变了其类一样。主要解决的问题
状态模式解决对象行为依赖于其状态的问题,使得对象可以在状态变化时切换行为。
使用场景
当代码中存在大量条件语句,且这些条件语句依赖于对象的状态时。
实现方式
定义状态接口:声明一个或多个方法,用于封装具体状态的行为。创建具体状态类:实现状态接口,根据状态的不同实现具体的行为。定义上下文类:包含一个状态对象的引用,并在状态改变时更新其行为。
关键代码
状态接口:声明行为方法。具体状态类:实现状态接口,封装具体行为。上下文类:维护一个状态对象,并提供方法以改变其状态。
应用实例
篮球运动员状态:运动员可以有正常、不正常和超常等状态。曾 ...
空对象模式在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。概要意图使用一个空对象代替 null 值,这个空对象实现了相同的接口,但对请求不做任何操作或提供默认操作。主要解决的问题
空对象模式解决的是在系统中使用null值可能导致的问题,如NullPointerException异常。它允许系统在没有合适对象时,使用一个”安全”的空对象继续运行,而不是失败。
使用场景
当系统中需要处理null对象,但又希望避免null检查或处理null值时。
实现方式
定义协议:定义一个协议或接口,规定需要实现的行为。创建具体对象:实现协议的具体对象,提供实际的行为。创建空对象:也实现相同的协议,但提供”空”的实现,即不执行任何有意义的操作。
关键代码
协议或接口:规定对象需 ...
模板模式在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。介绍意图 在父类中定义了算法的骨架,并允许子类在不改变算法结构的前提下重定义算法的某些特定步骤。主要解决的问题
解决在多个子类中重复实现相同的方法的问题,通过将通用方法抽象到父类中来避免代码重复。
使用场景
当存在一些通用的方法,可以在多个子类中共用时。
实现方式
定义抽象父类:包含模板方法和一些抽象方法或具体方法。实现子类:继承抽象父类并实现抽象方法,不改变算法结构。
关键代码
模板方法:在抽象父类中定义,调用抽象方法和具体方法。抽象方法:由子类实现,代表算法的可变部分。具体方法:在抽象父类中实现,代表算法的不变部分。
应用实例
建筑流程:地基、走线、水管等步骤相同,后期建筑如加壁橱、栅栏等步骤不同。西游记的81难:菩萨定好的81难代表一个顶层逻辑骨架。Spring对Hibernate的支持:封装了如开启事务、获取Session、关闭Session等通用方法。
优点
封装不 ...