桥接模式桥接(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):抽象工厂模式提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。概要意图定义一个创建对象的接口,让其子类决定实例化哪一个具体的类。工厂模式使对象的创建过程延迟到子类。主要解决接口选择的问题。何时使用 ...
外观模式外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。介绍意图为一个复杂的子系统提供一个一致的高层接口。这样,客户端代码就可以通过这个简化的接口与子系统交互,而不需要了解子系统内部的复杂性。
主要解决的问题
降低客户端与复杂子系统之间的耦合度。简化客户端对复杂系统的操作,隐藏内部实现细节。
使用场景
当客户端不需要了解系统内部的复杂逻辑和组件交互时。当需要为整个系统定义一个清晰的入口点时。
实现方式
创建外观类:定义一个类(外观),作为客户端与子系统之间的中介。封装子系统操作:外观类将复杂的子系统操作封装成简单的方法。
关键代码
Facade类:提供高层接口,简化客户端与子系统的交互。子系统类:实现具体的业务逻辑,被Facade类调用。
应用实例
医院接待:医院的接待人员简化了挂号、门诊、划价、取药等复杂流程。Java三层架构:通过外观模式,可以简化对表示层、业 ...
备忘录模式备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象,备忘录模式属于行为型模式。备忘录模式允许在不破坏封装性的前提下,捕获和恢复对象的内部状态。介绍意图在不破坏封装性的前提下,捕获一个对象的内部状态,并允许在对象之外保存和恢复这些状态。主要解决的问题
允许捕获并保存一个对象的内部状态,以便在将来可以恢复到该状态,实现撤销和回滚操作。
使用场景
当需要提供一种撤销机制,允许用户回退到之前的状态时。
实现方式
创建备忘录类:用于存储和封装对象的状态。创建发起人角色:负责创建备忘录,并根据需要恢复状态。创建备忘录管理类(可选):负责管理所有备忘录对象。
关键代码
备忘录:存储发起人的状态信息。发起人:创建备忘录,并根据备忘录恢复状态。
应用实例
后悔药:提供一种撤销操作的功能。游戏存档:保存游戏进度,允许玩家加载之前的存档。Windows中的Ctrl+Z:实现撤销操作。IE浏览器的后退:允许用户回退到之前的页面。数据库事务管理:通过事务日志保存状态,实现回滚。
优点
提供状态恢复机制:允许用户方便地回到历史状态。封装状态信息:用户不需要关心状 ...
命令模式命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。命令模式将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。命令模式结构示意图:
介绍意图将请求封装为一个对象,允许用户使用不同的请求对客户端进行参数化。主要解决的问题
解决在软件系统中请求者和执行者之间的紧耦合问题,特别是在需要对行为进行记录、撤销/重做或事务处理等场景。
使用场景
当需要对行为进行记录、撤销/重做或事务处理时,使用命令模式来解耦请求者和执行者。
实现方式
定义命令接口:所有命令必须实现的接口。创建具体命令:实现命令接口的具体类,包含执行请求的方法。调用者:持有命令对象并触发命令的执行。接收者:实际执行命令的对象。
关键代码
接收者(Receiver):执行命令的实际对象。命令(Command):定义执行命令的接口。调用者(Invoker):使用命令对象的入口点。
应用实例
Struts 1:ActionServlet作为Invoker,模型层的类作为具体的Command。
优点
降低耦合度: ...