0%

门面模式(Facade Pattern):简化复杂系统的访问接口

门面模式(又称外观模式)是结构型设计模式的一种,核心思想是为多个复杂的子系统提供一个统一的高层接口,通过这个接口简化客户端与子系统的交互,屏蔽内部细节。这种模式就像 “前台服务员”,客户端无需直接与后台多个部门打交道,只需通过前台即可完成所有操作。

门面模式的核心结构

外观模式

门面模式的结构简单清晰,主要包含两个角色:

门面角色(Facade)

  • 定义一个统一的接口,负责协调多个子系统的交互。
  • 客户端通过调用门面角色的方法间接访问子系统,无需了解子系统的具体实现。

子系统角色(Subsystem)

  • 由多个相互关联或独立的类组成,实现具体的业务逻辑。
  • 子系统不知道门面角色的存在,仅关注自身功能的实现。

代码实现示例

以 “家庭影院系统” 为例,子系统包括投影仪、音响、播放器等,门面角色 “影院控制器” 提供一键播放功能,简化操作:

子系统角色(各类设备)

阅读全文 »

访问者模式(Visitor Pattern):数据与操作的分离艺术

访问者模式是行为型设计模式的一种,核心思想是封装作用于数据结构中各元素的操作,使这些操作可以独立于数据结构变化。它通过 “双分派” 机制,在不修改元素类的前提下,为元素添加新的操作,本质是 “预留访问通路,通过回调实现操作扩展”。

访问者模式的核心结构

访问者模式

访问者模式通过五个核心角色实现数据与操作的分离,分工明确且支持灵活扩展:

抽象元素(Element)

  • 定义数据结构中元素的抽象接口,声明一个accept(Visitor visitor)方法,用于接受访问者的访问(核心方法,实现双分派的关键)。
  • 示例:Shape(图形抽象类,声明accept(Visitor v))。

具体元素(ConcreteElement)

  • 实现抽象元素接口,重写accept方法,并在方法中调用访问者的对应visit方法(将自身作为参数传递)。
  • 示例:Circle(圆形)、Rectangle(矩形)。

抽象访问者(Visitor)

  • 定义对所有具体元素的访问接口,每个方法对应一种具体元素(方法名通常为visitConcreteElementX)。
  • 示例:ShapeVisitor(图形访问者接口,声明visitCircle(Circle c)visitRectangle(Rectangle r))。

具体访问者(ConcreteVisitor)

  • 实现抽象访问者接口,封装对具体元素的操作逻辑(如计算面积、绘制图形等)。
  • 示例:AreaCalculator(计算面积的访问者)、ShapeDrawer(绘制图形的访问者)。

5对象结构(ObjectStructure)

  • 管理元素的集合(如列表、树等),提供遍历元素的方法,并可触发访问者对所有元素的访问。
  • 示例:ShapeGroup(图形组,包含多个图形元素)。

核心机制:双分派(Double Dispatch)

访问者模式的关键是 “双分派” 机制,通过两次分发决定最终执行的操作:

阅读全文 »

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

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

迭代器模式的核心结构

迭代器模式

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

迭代器接口(Iterator)

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

具体迭代器(ConcreteIterator)

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

容器接口(Collection/Aggregate)

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

具体容器(ConcreteCollection)

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

代码实现示例

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

阅读全文 »

观察者模式(Observer Pattern):对象间的联动通知机制

观察者模式是行为型设计模式的一种,核心思想是定义对象间的一对多依赖关系:当一个对象(目标)的状态发生改变时,所有依赖它的对象(观察者)会自动收到通知并更新。这种模式就像 “订阅 - 发布” 系统 —— 订阅者(观察者)关注发布者(目标),当发布者有新内容时,所有订阅者都会收到推送,核心是 “状态联动,自动更新”。

观察者模式的核心结构

观察者模式

观察者模式通过四个核心角色实现对象间的联动,分工明确且耦合度低:

目标接口 / 类(Subject)

  • 定义被观察对象的接口,提供注册、移除观察者及通知所有观察者的方法。
  • 示例:NewsPublisher(新闻发布者,定义addSubscriber()removeSubscriber()notifySubscribers())。

具体目标(ConcreteSubject)

  • 实现目标接口,维护自身状态,当状态改变时调用notify()方法通知所有观察者。
  • 示例:TechNewsPublisher(科技新闻发布者,状态为最新新闻内容)。

观察者接口(Observer)

  • 定义观察者的接口,声明接收通知并更新自身的方法(通常名为update())。
  • 示例:Subscriber(订阅者,定义update(String news)方法)。

具体观察者(ConcreteObserver)

  • 实现观察者接口,在收到通知时执行具体的更新逻辑,通常会保存对目标的引用以获取最新状态。
  • 示例:EmailSubscriber(邮件订阅者,收到新闻后发送邮件)、AppSubscriber(APP 订阅者,收到新闻后推送通知)。

代码实现示例

以 “新闻订阅系统” 为例,展示观察者模式的实现:新闻发布者(目标)发布新闻时,所有订阅者(观察者)会自动收到通知。

阅读全文 »

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

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

策略模式的核心结构

策略模式

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

策略接口(Strategy)

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

具体策略(ConcreteStrategy)

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

上下文(Context)

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

代码实现示例

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

阅读全文 »