0%

迭代器模式(Iterator Pattern):统一访问集合元素的方式

迭代器模式是行为型设计模式的一种,核心思想是提供一种统一的方法顺序访问容器对象(如集合、数组)中的各个元素,而不暴露容器的内部结构。这种模式就像 “遥控器”—— 无论电视机的内部构造如何,用户只需通过遥控器的按键(迭代器方法)就能逐频道切换(遍历元素),无需了解电视的内部细节。

迭代器模式的核心结构

迭代器模式

迭代器模式通过四个核心角色实现对容器元素的统一遍历,职责明确且解耦了容器与遍历逻辑:

迭代器接口(Iterator)

  • 定义遍历容器元素的标准接口,通常包含以下方法:
    • hasNext():判断是否还有下一个元素。
    • next():返回当前元素,并移动到下一个位置。
    • (可选)remove():移除当前元素(视容器支持情况)。
  • 示例:java.util.Iterator(Java 集合框架的迭代器接口)。

具体迭代器(ConcreteIterator)

  • 实现迭代器接口,封装具体的遍历逻辑,记录当前遍历位置,与特定容器绑定。
  • 示例:ArrayList的内部迭代器(遍历数组)、LinkedList的内部迭代器(遍历链表)。

容器接口(Collection/Aggregate)

  • 定义容器的核心接口,声明创建迭代器的方法(iterator()),是所有容器的抽象父类。
  • 示例:java.util.Collection(Java 集合的根接口)。

具体容器(ConcreteCollection)

  • 实现容器接口,存储元素并提供创建对应迭代器的方法,负责管理元素的增删改查。
  • 示例:ArrayList(数组容器)、HashSet(哈希表容器)。

代码实现示例

以 “自定义列表容器” 为例,展示迭代器模式的实现:自定义MyList容器,通过迭代器遍历元素,不暴露内部存储结构(如数组)。

阅读全文 »

策略模式(Strategy Pattern):算法的封装与灵活切换

策略模式是行为型设计模式的一种,核心思想是定义一系列算法,将每个算法封装成独立的策略类,使它们可以相互替换,从而让算法的变化独立于使用算法的客户端。这种模式就像 “出行方式的选择”—— 无论是步行、骑车还是开车,目的都是到达目的地,只是方式不同,客户端可根据需求灵活切换。

策略模式的核心结构

策略模式

策略模式通过三个核心角色实现算法的封装与切换,结构清晰且职责分明:

策略接口(Strategy)

  • 定义所有算法的公共接口,声明算法的核心方法(如计算、执行等)。
  • 示例:PaymentStrategy(支付策略接口,定义pay(double amount)方法)。

具体策略(ConcreteStrategy)

  • 实现策略接口,封装具体的算法逻辑,是策略模式的 “可替换单元”。
  • 示例:AlipayStrategy(支付宝支付)、WechatPayStrategy(微信支付)。

上下文(Context)

  • 使用策略的客户端角色,持有策略接口的引用,负责将具体策略传递给客户端,或根据场景选择策略。
  • 上下文不直接实现算法,而是委托给具体策略执行,自身仅关注 “何时使用算法” 而非 “如何实现算法”。
  • 示例:Order(订单上下文,通过支付策略完成支付)。

代码实现示例

以 “订单支付系统” 为例,展示策略模式的应用:订单可通过支付宝、微信等不同方式支付,客户端可动态选择支付方式。

阅读全文 »

中介者模式(Mediator Pattern):封装交互,解耦对象

中介者模式是行为型设计模式的一种,核心思想是通过一个中介对象封装多个对象(同事)之间的交互,使同事对象无需直接相互引用,从而降低耦合度,且可以独立地改变它们之间的交互方式。这种模式就像 “聊天室主持人”—— 多个用户(同事)通过主持人(中介者)传递信息,无需知道彼此的存在,所有交互由主持人协调,本质是 “集中管理交互,减少直接依赖”。

中介者模式的核心结构

中介者模式

中介者模式通过四个核心角色实现对象间的间接交互,职责分明且解耦效果显著:

中介者接口(Mediator)

  • 定义同事对象之间交互的接口,声明用于协调同事的方法(如changed(Colleague)—— 当同事状态改变时通知中介者)。
  • 示例:ChatMediator(聊天室中介者接口,声明sendMessage(String msg, User user)方法)。

具体中介者(ConcreteMediator)

  • 实现中介者接口,维护所有同事对象的引用,并实现具体的协调逻辑:当某个同事状态改变时,中介者负责通知其他相关同事做出响应。
  • 示例:ConcreteChatMediator(具体聊天室中介者,管理用户列表并转发消息)。

同事类抽象(Colleague)

  • 定义同事对象的抽象接口,持有中介者的引用(通过构造方法注入),提供与中介者交互的方法(如通知中介者自身状态改变)。
  • 示例:User(用户抽象类,包含send(String msg)receive(String msg)方法)。

具体同事类(ConcreteColleague)

  • 实现同事类抽象,代表具体的交互对象,当自身状态改变时,通过中介者通知其他同事,而不直接与其他同事交互。
  • 示例:ChatUser(具体用户,发送消息时通过中介者转发,接收中介者传递的消息)。

代码实现示例

以 “聊天室” 为例,展示中介者模式的实现:多个用户通过聊天室中介者发送和接收消息,用户之间无需直接关联,所有消息通过中介者转发。

阅读全文 »

命令模式(Command Pattern):封装请求的艺术

命令模式是行为型设计模式的一种,核心思想是将请求(方法调用)封装为一个独立的对象,使请求的发送者与接收者解耦。通过命令对象,可实现请求的参数化、排队、日志记录及撤销等功能,本质是 “将操作封装为对象,实现请求的灵活管理”。

命令模式的核心结构

命令模式

命令模式通过四个核心角色实现请求的封装与解耦,分工明确且扩展性强:

命令接口(Command)

  • 定义命令的抽象接口,声明执行命令的方法(通常为execute()),是所有具体命令的父类。
  • 示例:OrderCommand(订单命令接口,声明execute()方法)。

具体命令(ConcreteCommand)

  • 实现命令接口,封装具体的请求逻辑,通常持有接收者(Receiver)的引用,并在execute()方法中调用接收者的相关方法完成请求。
  • 示例:PayOrderCommand(支付订单命令)、CancelOrderCommand(取消订单命令)。

接收者(Receiver)

  • 真正执行命令的对象,包含完成命令所需的业务逻辑(如支付、取消等操作)。
  • 示例:OrderService(订单服务,提供pay()cancel()等方法)。

调用者(Invoker)

  • 触发命令执行的对象,持有命令对象的引用,通过调用命令的execute()方法触发请求,不直接与接收者交互。
  • 示例:OrderController(订单控制器,接收用户请求并触发对应命令)。

代码实现示例

以 “订单管理系统” 为例,展示命令模式的实现:支持支付订单和取消订单操作,通过命令对象封装这些操作,实现解耦和日志记录。

阅读全文 »

原型模式(Prototype Pattern):通过克隆高效创建对象

原型模式是创建型设计模式的一种,核心思想是通过复制(克隆)现有对象(原型)来创建新对象,而非通过new关键字重新实例化。这种模式特别适合创建复杂对象或频繁创建相似对象的场景,能有效提高创建效率并简化流程。

原型模式的核心结构

原型模式

原型模式的实现依赖两个关键要素,结构简洁但功能明确:

原型接口 / 类(Prototype)

  • 声明克隆自身的方法(通常名为clone())。
  • 在 Java 中,通常通过实现Cloneable接口(标识接口)并重写Object.clone()方法实现。

具体原型(Concrete Prototype)

  • 实现原型接口,具体定义克隆逻辑(深拷贝或浅拷贝)。
  • 示例:UserProduct等需要被克隆的类。

原型模式的实现步骤

在 Java 中实现原型模式需遵循以下步骤:

1. 实现Cloneable接口

Cloneable是一个标识接口(无任何方法),用于通知 JVM:该类可以被安全克隆。若未实现此接口,调用clone()会抛出CloneNotSupportedException

阅读全文 »