<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Spring on 方糖猫Blog</title>
    <link>https://ftmao.com/blog/tags/spring/</link>
    <description>AI 视频、AI Agent 与工程实践笔记</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Tue, 28 May 2019 14:00:00 +0800</lastBuildDate><atom:link href="https://ftmao.com/blog/tags/spring/index.xml" rel="self" type="application/rss+xml" /><item>
      <title>设计模式全景图：六大原则、23 种 GoF 模式与 J2EE 模式</title>
      <link>https://ftmao.com/blog/posts/design-patterns-intro/</link>
      <pubDate>Tue, 28 May 2019 14:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/posts/design-patterns-intro/</guid>
      <description>&lt;h1 id=&#34;设计模式全景图六大原则23-种-gof-模式与-j2ee-模式&#34;&gt;设计模式全景图：六大原则、23 种 GoF 模式与 J2EE 模式&lt;/h1&gt;
&lt;p&gt;设计模式是面向对象设计中反复出现问题的&lt;strong&gt;可复用解决方案&lt;/strong&gt;。掌握它们能够帮助我们写出更易扩展、更易维护、更清晰的代码。本文从六大设计原则出发，完整梳理 GoF 23 种设计模式以及 8 种 J2EE 模式，并配合类图、意图说明和 JDK/Spring 中的典型应用，帮助建立系统性的知识地图。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一设计模式的六大原则&#34;&gt;一、设计模式的六大原则&lt;/h2&gt;
&lt;h3 id=&#34;1-开闭原则open-close-principle&#34;&gt;1. 开闭原则（Open Close Principle）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;对扩展开放，对修改关闭。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当程序需要新增功能时，应通过增加新代码实现，而不是修改已有代码。核心手段是抽象化：使用接口和抽象类。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
    A[业务调用方] --&amp;gt; B[抽象接口]
    B --&amp;gt; C[旧实现]
    B --&amp;gt; D[新实现]
    style D fill:#e1f5e1&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;2-里氏代换原则liskov-substitution-principle&#34;&gt;2. 里氏代换原则（Liskov Substitution Principle）&lt;/h3&gt;
&lt;p&gt;任何基类可以出现的地方，子类一定可以出现。子类替换基类后，程序功能不应受影响。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Animal { +eat() }
    class Dog { +eat() }
    class Cat { +eat() }
    Animal &amp;lt;|-- Dog
    Animal &amp;lt;|-- Cat&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;3-依赖倒转原则dependence-inversion-principle&#34;&gt;3. 依赖倒转原则（Dependence Inversion Principle）&lt;/h3&gt;
&lt;p&gt;高层模块和低层模块都应依赖抽象；要针对接口编程，而不是针对实现编程。&lt;/p&gt;
&lt;h3 id=&#34;4-接口隔离原则interface-segregation-principle&#34;&gt;4. 接口隔离原则（Interface Segregation Principle）&lt;/h3&gt;
&lt;p&gt;使用多个职责单一的接口，优于使用一个庞大臃肿的接口，降低类之间的耦合。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph TD
    A[大接口] --&amp;gt;|拆分为| B[接口A]
    A --&amp;gt;|拆分为| C[接口B]
    A --&amp;gt;|拆分为| D[接口C]
    B --&amp;gt; E[实现类1]
    C --&amp;gt; F[实现类2]
    D --&amp;gt; G[实现类3]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;5-迪米特法则--最少知道原则demeter-principle&#34;&gt;5. 迪米特法则 / 最少知道原则（Demeter Principle）&lt;/h3&gt;
&lt;p&gt;一个实体应尽量少地与其他实体发生直接交互，降低模块耦合，提高独立性。&lt;/p&gt;
&lt;h3 id=&#34;6-合成复用原则composite-reuse-principle&#34;&gt;6. 合成复用原则（Composite Reuse Principle）&lt;/h3&gt;
&lt;p&gt;优先使用组合/聚合来复用功能，而不是继承。组合更灵活，耦合更低。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Car { -Engine engine; +run() }
    class Engine { +start() }
    Car *-- Engine : 组合&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;二设计模式分类概览&#34;&gt;二、设计模式分类概览&lt;/h2&gt;
&lt;p&gt;设计模式通常分为三大类：创建型、结构型、行为型。J2EE 模式则专注于企业应用和表示层。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;mindmap
  root((设计模式))
    创建型模式 5种
      工厂模式
      抽象工厂模式
      单例模式
      建造者模式
      原型模式
    结构型模式 8种
      适配器模式
      桥接模式
      过滤器/标准模式
      组合模式
      装饰器模式
      外观模式
      享元模式
      代理模式
    行为型模式 13种 
      责任链模式
      命令模式
      解释器模式
      迭代器模式
      中介者模式
      备忘录模式
      观察者模式
      状态模式
      空对象模式
      策略模式
      模板模式
      访问者模式
    J2EE模式 8种 
      MVC模式
      业务代表模式
      组合实体模式
      数据访问对象模式
      前端控制器模式
      拦截过滤器模式
      服务定位器模式
      传输对象模式&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;三创建型模式creational-patterns&#34;&gt;三、创建型模式（Creational Patterns）&lt;/h2&gt;
&lt;p&gt;创建型模式关注对象的创建过程，隐藏创建逻辑，使程序在判断需要创建哪些对象时更灵活。&lt;/p&gt;
&lt;h3 id=&#34;1-工厂模式factory-pattern&#34;&gt;1. 工厂模式（Factory Pattern）&lt;/h3&gt;
&lt;p&gt;定义一个创建对象的接口，让子类决定实例化哪一个类。工厂方法使类的实例化延迟到子类。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Product { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +use() }
    class ConcreteProductA { +use() }
    class ConcreteProductB { +use() }
    class Creator { +factoryMethod() Product }
    class ConcreteCreatorA { +factoryMethod() Product }
    class ConcreteCreatorB { +factoryMethod() Product }
    Product &amp;lt;|.. ConcreteProductA
    Product &amp;lt;|.. ConcreteProductB
    Creator &amp;lt;|-- ConcreteCreatorA
    Creator &amp;lt;|-- ConcreteCreatorB
    Creator ..&amp;gt; Product
    ConcreteCreatorA ..&amp;gt; ConcreteProductA
    ConcreteCreatorB ..&amp;gt; ConcreteProductB&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;java.text.DateFormat.getDateInstance()&lt;/code&gt;、&lt;code&gt;KeyGenerator.getInstance()&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;2-抽象工厂模式abstract-factory-pattern&#34;&gt;2. 抽象工厂模式（Abstract Factory Pattern）&lt;/h3&gt;
&lt;p&gt;提供一个创建一系列相关或相互依赖对象的接口，而无需指定它们具体的类。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class AbstractFactory { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +createProductA() +createProductB() }
    class ConcreteFactory1 { +createProductA() +createProductB() }
    class ConcreteFactory2 { +createProductA() +createProductB() }
    class AbstractProductA
    class AbstractProductB
    AbstractFactory &amp;lt;|.. ConcreteFactory1
    AbstractFactory &amp;lt;|.. ConcreteFactory2
    ConcreteFactory1 ..&amp;gt; AbstractProductA
    ConcreteFactory1 ..&amp;gt; AbstractProductB
    ConcreteFactory2 ..&amp;gt; AbstractProductA
    ConcreteFactory2 ..&amp;gt; AbstractProductB&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;3-单例模式singleton-pattern&#34;&gt;3. 单例模式（Singleton Pattern）&lt;/h3&gt;
&lt;p&gt;确保一个类只有一个实例，并提供一个全局访问点。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Singleton {
        -static Singleton instance
        -Singleton()
        +static getInstance() Singleton
    }&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;Runtime.getRuntime()&lt;/code&gt;。&lt;strong&gt;Spring 应用：&lt;/strong&gt; 默认 Bean 作用域为单例。&lt;/p&gt;
&lt;h3 id=&#34;4-建造者模式builder-pattern&#34;&gt;4. 建造者模式（Builder Pattern）&lt;/h3&gt;
&lt;p&gt;将一个复杂对象的构建与它的表示分离，使得同样的构建过程可以创建不同的表示。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Product { +partA +partB +partC }
    class Builder { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +buildPartA() +buildPartB() +getResult() }
    class ConcreteBuilder { +buildPartA() +buildPartB() +getResult() }
    class Director { +construct(builder) }
    Builder &amp;lt;|.. ConcreteBuilder
    ConcreteBuilder ..&amp;gt; Product
    Director ..&amp;gt; Builder&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;5-原型模式prototype-pattern&#34;&gt;5. 原型模式（Prototype Pattern）&lt;/h3&gt;
&lt;p&gt;通过复制现有对象来创建新对象，而不是新建实例。适用于创建成本较高的对象。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Prototype { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +clone() }
    class ConcretePrototype { +clone() }
    Prototype &amp;lt;|.. ConcretePrototype&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;Object.clone()&lt;/code&gt;、&lt;code&gt;Cloneable&lt;/code&gt; 接口。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四结构型模式structural-patterns&#34;&gt;四、结构型模式（Structural Patterns）&lt;/h2&gt;
&lt;p&gt;结构型模式关注对象之间的组合和关系，解决如何构建灵活且可复用的类和对象结构。&lt;/p&gt;
&lt;h3 id=&#34;1-适配器模式adapter-pattern&#34;&gt;1. 适配器模式（Adapter Pattern）&lt;/h3&gt;
&lt;p&gt;将一个类的接口转换成客户希望的另外一个接口，使得原本由于接口不兼容而不能一起工作的类可以协同工作。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Target { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +request() }
    class Adapter { +request() }
    class Adaptee { +specificRequest() }
    Target &amp;lt;|.. Adapter
    Adapter --&amp;gt; Adaptee&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;Arrays.asList()&lt;/code&gt;、&lt;code&gt;InputStreamReader&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;2-桥接模式bridge-pattern&#34;&gt;2. 桥接模式（Bridge Pattern）&lt;/h3&gt;
&lt;p&gt;将抽象部分与它的实现部分分离，使它们都可以独立地变化。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Abstraction { -Implementor impl +operation() }
    class RefinedAbstraction { +operation() }
    class Implementor { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +operationImpl() }
    class ConcreteImplementorA { +operationImpl() }
    class ConcreteImplementorB { +operationImpl() }
    Abstraction &amp;lt;|-- RefinedAbstraction
    Abstraction o-- Implementor
    Implementor &amp;lt;|.. ConcreteImplementorA
    Implementor &amp;lt;|.. ConcreteImplementorB&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;3-过滤器模式--标准模式filter--criteria-pattern&#34;&gt;3. 过滤器模式 / 标准模式（Filter / Criteria Pattern）&lt;/h3&gt;
&lt;p&gt;使用不同的标准来过滤一组对象，并通过逻辑运算以解耦的方式把它们连接起来。常用于集合筛选。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Criteria { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +meetCriteria(list) }
    class CriteriaMale { +meetCriteria(list) }
    class CriteriaFemale { +meetCriteria(list) }
    class AndCriteria { +meetCriteria(list) }
    class OrCriteria { +meetCriteria(list) }
    Criteria &amp;lt;|.. CriteriaMale
    Criteria &amp;lt;|.. CriteriaFemale
    Criteria &amp;lt;|.. AndCriteria
    Criteria &amp;lt;|.. OrCriteria
    AndCriteria --&amp;gt; Criteria
    OrCriteria --&amp;gt; Criteria&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;4-组合模式composite-pattern&#34;&gt;4. 组合模式（Composite Pattern）&lt;/h3&gt;
&lt;p&gt;将对象组合成树形结构以表示&amp;quot;部分-整体&amp;quot;的层次结构，使得用户对单个对象和组合对象的使用具有一致性。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Component { +operation() }
    class Leaf { +operation() }
    class Composite { -children +add() +remove() +operation() }
    Component &amp;lt;|-- Leaf
    Component &amp;lt;|-- Composite
    Composite o-- Component&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;java.awt.Container&lt;/code&gt; 与 &lt;code&gt;Component&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;5-装饰器模式decorator-pattern&#34;&gt;5. 装饰器模式（Decorator Pattern）&lt;/h3&gt;
&lt;p&gt;动态地给一个对象添加一些额外的职责，比生成子类更灵活。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Component { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +operation() }
    class ConcreteComponent { +operation() }
    class Decorator { -Component component +operation() }
    class ConcreteDecoratorA { +operation() }
    class ConcreteDecoratorB { +operation() }
    Component &amp;lt;|.. ConcreteComponent
    Component &amp;lt;|.. Decorator
    Decorator &amp;lt;|-- ConcreteDecoratorA
    Decorator &amp;lt;|-- ConcreteDecoratorB
    Decorator o-- Component&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; Java IO 流 &lt;code&gt;BufferedInputStream&lt;/code&gt;、&lt;code&gt;DataInputStream&lt;/code&gt;、&lt;code&gt;ZipOutputStream&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;6-外观模式facade-pattern&#34;&gt;6. 外观模式（Facade Pattern）&lt;/h3&gt;
&lt;p&gt;为子系统中的一组接口提供一个一致的入口，定义了一个高层接口，使子系统更容易使用。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Facade { +simplifiedOperation() }
    class SubSystemA { +operationA() }
    class SubSystemB { +operationB() }
    class SubSystemC { +operationC() }
    Facade --&amp;gt; SubSystemA
    Facade --&amp;gt; SubSystemB
    Facade --&amp;gt; SubSystemC&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;7-享元模式flyweight-pattern&#34;&gt;7. 享元模式（Flyweight Pattern）&lt;/h3&gt;
&lt;p&gt;运用共享技术有效地支持大量细粒度对象，减少内存占用。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class FlyweightFactory { -pool +getFlyweight(key) }
    class Flyweight { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +operation() }
    class ConcreteFlyweight { +operation() }
    FlyweightFactory o-- Flyweight
    Flyweight &amp;lt;|.. ConcreteFlyweight&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;Integer.valueOf()&lt;/code&gt; 缓存（-128-127）、&lt;code&gt;String&lt;/code&gt; 常量池。&lt;/p&gt;
&lt;h3 id=&#34;8-代理模式proxy-pattern&#34;&gt;8. 代理模式（Proxy Pattern）&lt;/h3&gt;
&lt;p&gt;为其他对象提供一种代理以控制对这个对象的访问。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Subject { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +request() }
    class RealSubject { +request() }
    class Proxy { -RealSubject real +request() }
    Subject &amp;lt;|.. RealSubject
    Subject &amp;lt;|.. Proxy
    Proxy --&amp;gt; RealSubject&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; JDK 动态代理 &lt;code&gt;Proxy.newProxyInstance()&lt;/code&gt;。&lt;strong&gt;Spring 应用：&lt;/strong&gt; AOP 使用 JDK 动态代理和 CGLIB。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五行为型模式behavioral-patterns&#34;&gt;五、行为型模式（Behavioral Patterns）&lt;/h2&gt;
&lt;p&gt;行为型模式关注对象之间的通信和交互，解决对象之间的责任分配和算法封装。&lt;/p&gt;
&lt;h3 id=&#34;1-责任链模式chain-of-responsibility-pattern&#34;&gt;1. 责任链模式（Chain of Responsibility Pattern）&lt;/h3&gt;
&lt;p&gt;使多个对象都有机会处理请求，从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链，并沿着这条链传递请求。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Handler { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +setNext(handler) +handle(request) }
    class ConcreteHandlerA { +handle(request) }
    class ConcreteHandlerB { +handle(request) }
    Handler &amp;lt;|.. ConcreteHandlerA
    Handler &amp;lt;|.. ConcreteHandlerB
    Handler --&amp;gt; Handler : next&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;2-命令模式command-pattern&#34;&gt;2. 命令模式（Command Pattern）&lt;/h3&gt;
&lt;p&gt;将请求封装为对象，从而可以用不同的请求、队列或日志来参数化其他对象，同时支持可撤销操作。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Command { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +execute() }
    class ConcreteCommand { -receiver +execute() }
    class Invoker { -command +setCommand() +invoke() }
    class Receiver { +action() }
    Command &amp;lt;|.. ConcreteCommand
    Invoker --&amp;gt; Command
    ConcreteCommand --&amp;gt; Receiver&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;3-解释器模式interpreter-pattern&#34;&gt;3. 解释器模式（Interpreter Pattern）&lt;/h3&gt;
&lt;p&gt;给定一个语言，定义它的文法表示，并定义一个解释器，这个解释器使用该表示来解释语言中的句子。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class AbstractExpression { +interpret(context) }
    class TerminalExpression { +interpret(context) }
    class NonterminalExpression { +interpret(context) }
    AbstractExpression &amp;lt;|-- TerminalExpression
    AbstractExpression &amp;lt;|-- NonterminalExpression
    NonterminalExpression o-- AbstractExpression&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; Java 正则表达式 &lt;code&gt;Pattern&lt;/code&gt; 与 &lt;code&gt;Matcher&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;4-迭代器模式iterator-pattern&#34;&gt;4. 迭代器模式（Iterator Pattern）&lt;/h3&gt;
&lt;p&gt;提供一种方法顺序访问一个聚合对象中的各个元素，而又无需暴露该对象的内部表示。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Iterator { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +hasNext() +next() }
    class ConcreteIterator { +hasNext() +next() }
    class Aggregate { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +createIterator() }
    class ConcreteAggregate { +createIterator() }
    Iterator &amp;lt;|.. ConcreteIterator
    Aggregate &amp;lt;|.. ConcreteAggregate
    ConcreteAggregate ..&amp;gt; ConcreteIterator&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;java.util.Iterator&lt;/code&gt;、&lt;code&gt;java.util.Enumeration&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;5-中介者模式mediator-pattern&#34;&gt;5. 中介者模式（Mediator Pattern）&lt;/h3&gt;
&lt;p&gt;用一个中介对象来封装一系列对象交互，使对象不需要显式地相互引用，从而使其耦合松散。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Mediator { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +send(message, colleague) }
    class ConcreteMediator { +send(message, colleague) }
    class Colleague { -Mediator mediator }
    class ConcreteColleagueA
    class ConcreteColleagueB
    Mediator &amp;lt;|.. ConcreteMediator
    Colleague &amp;lt;|-- ConcreteColleagueA
    Colleague &amp;lt;|-- ConcreteColleagueB
    Colleague --&amp;gt; Mediator
    ConcreteMediator --&amp;gt; ConcreteColleagueA
    ConcreteMediator --&amp;gt; ConcreteColleagueB&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;6-备忘录模式memento-pattern&#34;&gt;6. 备忘录模式（Memento Pattern）&lt;/h3&gt;
&lt;p&gt;在不破坏封装性的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态，以便以后恢复。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Originator { +createMemento() +restore(memento) }
    class Memento { -state }
    class Caretaker { -mementos }
    Originator ..&amp;gt; Memento
    Caretaker o-- Memento&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;7-观察者模式observer-pattern&#34;&gt;7. 观察者模式（Observer Pattern）&lt;/h3&gt;
&lt;p&gt;定义对象间的一对多依赖关系，当一个对象状态发生改变时，所有依赖于它的对象都得到通知并自动更新。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Subject { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +registerObserver() +removeObserver() +notifyObservers() }
    class ConcreteSubject { -state +notifyObservers() }
    class Observer { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +update() }
    class ConcreteObserverA { +update() }
    class ConcreteObserverB { +update() }
    Subject &amp;lt;|.. ConcreteSubject
    Observer &amp;lt;|.. ConcreteObserverA
    Observer &amp;lt;|.. ConcreteObserverB
    ConcreteSubject --&amp;gt; Observer&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;java.util.Observer&lt;/code&gt;（已弃用）和 &lt;code&gt;Observable&lt;/code&gt;。&lt;strong&gt;Spring 应用：&lt;/strong&gt; Spring 事件驱动模型 &lt;code&gt;ApplicationEvent&lt;/code&gt;、&lt;code&gt;ApplicationListener&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;8-状态模式state-pattern&#34;&gt;8. 状态模式（State Pattern）&lt;/h3&gt;
&lt;p&gt;允许对象在其内部状态改变时改变它的行为，对象看起来好像修改了它的类。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Context { -State state +request() }
    class State { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +handle() }
    class ConcreteStateA { +handle() }
    class ConcreteStateB { +handle() }
    Context o-- State
    State &amp;lt;|.. ConcreteStateA
    State &amp;lt;|.. ConcreteStateB&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;9-空对象模式null-object-pattern&#34;&gt;9. 空对象模式（Null Object Pattern）&lt;/h3&gt;
&lt;p&gt;用一个空对象取代 &lt;code&gt;null&lt;/code&gt; 检查，提供默认的&amp;quot;什么也不做&amp;quot;的行为，避免空指针异常。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Animal { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +makeSound() }
    class Dog { +makeSound() }
    class NullAnimal { +makeSound() }
    Animal &amp;lt;|.. Dog
    Animal &amp;lt;|.. NullAnimal&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;10-策略模式strategy-pattern&#34;&gt;10. 策略模式（Strategy Pattern）&lt;/h3&gt;
&lt;p&gt;定义一系列算法，把它们一个个封装起来，并且使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Strategy { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +execute() }
    class ConcreteStrategyA { +execute() }
    class ConcreteStrategyB { +execute() }
    class Context { -Strategy strategy +setStrategy() +executeStrategy() }
    Strategy &amp;lt;|.. ConcreteStrategyA
    Strategy &amp;lt;|.. ConcreteStrategyB
    Context o-- Strategy&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;Comparator&lt;/code&gt; 接口与 &lt;code&gt;Collections.sort()&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;11-模板模式template-pattern&#34;&gt;11. 模板模式（Template Pattern）&lt;/h3&gt;
&lt;p&gt;定义一个操作中的算法骨架，而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构即可重定义该算法的某些特定步骤。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class AbstractClass { +templateMethod() +primitiveOperation() }
    class ConcreteClass { +primitiveOperation() }
    AbstractClass &amp;lt;|-- ConcreteClass&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;Arrays.sort()&lt;/code&gt; 配合 &lt;code&gt;Comparable&lt;/code&gt;。&lt;strong&gt;Spring 应用：&lt;/strong&gt; &lt;code&gt;RestTemplate&lt;/code&gt;、&lt;code&gt;JmsTemplate&lt;/code&gt;、&lt;code&gt;JpaTemplate&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;12-访问者模式visitor-pattern&#34;&gt;12. 访问者模式（Visitor Pattern）&lt;/h3&gt;
&lt;p&gt;表示一个作用于某对象结构中的各元素的操作，它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Element { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +accept(visitor) }
    class ConcreteElementA { +accept(visitor) }
    class ConcreteElementB { +accept(visitor) }
    class Visitor { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +visitA() +visitB() }
    class ConcreteVisitor { +visitA() +visitB() }
    Element &amp;lt;|.. ConcreteElementA
    Element &amp;lt;|.. ConcreteElementB
    Visitor &amp;lt;|.. ConcreteVisitor
    ConcreteElementA ..&amp;gt; Visitor
    ConcreteElementB ..&amp;gt; Visitor&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;六j2ee-模式&#34;&gt;六、J2EE 模式&lt;/h2&gt;
&lt;p&gt;J2EE 模式专注于企业应用，尤其是表示层和业务层的架构设计。这些模式由 Sun Java Center 鉴定。&lt;/p&gt;
&lt;h3 id=&#34;1-mvc-模式mvc-pattern&#34;&gt;1. MVC 模式（MVC Pattern）&lt;/h3&gt;
&lt;p&gt;将应用程序分为 Model（模型）、View（视图）、Controller（控制器）三层，实现关注点分离。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
    V[View] --&amp;gt; C[Controller]
    C --&amp;gt; M[Model]
    M --&amp;gt; V&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;Spring 应用：&lt;/strong&gt; Spring MVC 是典型实现。&lt;/p&gt;
&lt;h3 id=&#34;2-业务代表模式business-delegate-pattern&#34;&gt;2. 业务代表模式（Business Delegate Pattern）&lt;/h3&gt;
&lt;p&gt;为表示层提供对业务服务的访问抽象，减少表示层与业务层之间的耦合。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
    A[Client/Controller] --&amp;gt; B[Business Delegate]
    B --&amp;gt; C[Business Service]
    C --&amp;gt; D[DAO/数据层]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;3-组合实体模式composite-entity-pattern&#34;&gt;3. 组合实体模式（Composite Entity Pattern）&lt;/h3&gt;
&lt;p&gt;将一组相关的持久化对象组合成一个粗粒度实体，减少网络调用次数，提高性能。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class CompositeEntity { -DependentObjectA a -DependentObjectB b +getData() }
    class DependentObjectA
    class DependentObjectB
    CompositeEntity *-- DependentObjectA
    CompositeEntity *-- DependentObjectB&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;4-数据访问对象模式data-access-object-pattern&#34;&gt;4. 数据访问对象模式（Data Access Object Pattern）&lt;/h3&gt;
&lt;p&gt;将底层数据访问逻辑与高层业务逻辑分离，提供一个统一的接口访问数据库。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
    A[Business Object] --&amp;gt; B[DAO Interface]
    B --&amp;gt; C[DAO Implementation]
    C --&amp;gt; D[Data Source/Database]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;Spring 应用：&lt;/strong&gt; Spring Data JPA、MyBatis Mapper 都是 DAO 模式的具体实现。&lt;/p&gt;
&lt;h3 id=&#34;5-前端控制器模式front-controller-pattern&#34;&gt;5. 前端控制器模式（Front Controller Pattern）&lt;/h3&gt;
&lt;p&gt;提供一个集中的入口点来处理所有请求，通常负责认证、日志、路由等横切关注点。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
    A[所有请求] --&amp;gt; B[Front Controller]
    B --&amp;gt; C[Dispatcher]
    C --&amp;gt; D[具体 Handler]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;Spring 应用：&lt;/strong&gt; &lt;code&gt;DispatcherServlet&lt;/code&gt; 是前端控制器模式的实现。&lt;/p&gt;
&lt;h3 id=&#34;6-拦截过滤器模式intercepting-filter-pattern&#34;&gt;6. 拦截过滤器模式（Intercepting Filter Pattern）&lt;/h3&gt;
&lt;p&gt;在请求到达目标处理器之前，通过一系列过滤器链对请求进行预处理（如编码、认证、日志）。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
    A[Request] --&amp;gt; F1[Filter 1]
    F1 --&amp;gt; F2[Filter 2]
    F2 --&amp;gt; F3[Filter N]
    F3 --&amp;gt; T[Target]
    T --&amp;gt; F3
    F3 --&amp;gt; F2
    F2 --&amp;gt; F1
    F1 --&amp;gt; R[Response]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;Spring 应用：&lt;/strong&gt; Spring 的 &lt;code&gt;HandlerInterceptor&lt;/code&gt;、Servlet Filter。&lt;/p&gt;
&lt;h3 id=&#34;7-服务定位器模式service-locator-pattern&#34;&gt;7. 服务定位器模式（Service Locator Pattern）&lt;/h3&gt;
&lt;p&gt;提供一个中心化的注册表，用于获取服务实例，减少服务依赖的直接查找。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class ServiceLocator { +getService(name) }
    class Cache { -services }
    class InitialContext { +lookup(name) }
    class Service { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +execute() }
    ServiceLocator --&amp;gt; Cache
    ServiceLocator --&amp;gt; InitialContext
    ServiceLocator ..&amp;gt; Service&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;8-传输对象模式transfer-object-pattern&#34;&gt;8. 传输对象模式（Transfer Object Pattern）&lt;/h3&gt;
&lt;p&gt;通过简单的 POJO 对象在不同层之间传输数据，减少远程调用的网络开销，也称为 DTO（Data Transfer Object）。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class UserDTO { -id -name -email +getters/setters }
    class UserService { +getUserDTO(id) }
    class UserController { +showUser(dto) }
    UserService ..&amp;gt; UserDTO
    UserController ..&amp;gt; UserDTO&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;七jdkjava-io-与-spring-中的模式速查&#34;&gt;七、JDK、Java IO 与 Spring 中的模式速查&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模式&lt;/th&gt;
					&lt;th&gt;JDK 示例&lt;/th&gt;
					&lt;th&gt;Spring 示例&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;工厂模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;DateFormat.getDateInstance()&lt;/code&gt;、&lt;code&gt;KeyGenerator.getInstance()&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;BeanFactory&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;单例模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Runtime.getRuntime()&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;默认 Bean 作用域&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;原型模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Object.clone()&lt;/code&gt;、&lt;code&gt;Cloneable&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;@Scope(&amp;quot;prototype&amp;quot;)&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;适配器模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Arrays.asList()&lt;/code&gt;、&lt;code&gt;InputStreamReader&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;MVC 的 Controller 适配器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;装饰器模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;BufferedInputStream&lt;/code&gt;、&lt;code&gt;ZipOutputStream&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;代理模式&lt;/td&gt;
					&lt;td&gt;JDK 动态代理&lt;/td&gt;
					&lt;td&gt;AOP&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;组合模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;java.awt.Container&lt;/code&gt; / &lt;code&gt;Component&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;享元模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Integer.valueOf()&lt;/code&gt;、&lt;code&gt;String&lt;/code&gt; 常量池&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;模板方法模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Arrays.sort()&lt;/code&gt; + &lt;code&gt;Comparable&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;RestTemplate&lt;/code&gt;、&lt;code&gt;JpaTemplate&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;策略模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Comparator&lt;/code&gt;、&lt;code&gt;Collections.sort()&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ResourceLoader&lt;/code&gt; 策略&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;观察者模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Observer&lt;/code&gt; / &lt;code&gt;Observable&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Spring 事件驱动模型&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;解释器模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Pattern&lt;/code&gt; / &lt;code&gt;Matcher&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;SpEL 表达式&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;责任链模式&lt;/td&gt;
					&lt;td&gt;Servlet Filter Chain&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;HandlerInterceptor&lt;/code&gt; 链&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MVC 模式&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
					&lt;td&gt;Spring MVC&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DAO 模式&lt;/td&gt;
					&lt;td&gt;JDBC Template&lt;/td&gt;
					&lt;td&gt;Spring Data JPA / MyBatis&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;前端控制器&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;DispatcherServlet&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;java-io-中使用的模式&#34;&gt;Java IO 中使用的模式&lt;/h3&gt;
&lt;p&gt;Java IO 同时使用了&lt;strong&gt;适配器模式&lt;/strong&gt;和&lt;strong&gt;装饰器模式&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;适配器模式：&lt;/strong&gt; &lt;code&gt;InputStreamReader&lt;/code&gt; 将 &lt;code&gt;InputStream&lt;/code&gt; 字节流适配为 &lt;code&gt;Reader&lt;/code&gt; 字符流。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;装饰器模式：&lt;/strong&gt; &lt;code&gt;BufferedInputStream&lt;/code&gt;、&lt;code&gt;DataInputStream&lt;/code&gt;、&lt;code&gt;ZipOutputStream&lt;/code&gt; 等通过包装 &lt;code&gt;InputStream&lt;/code&gt; 动态增强功能。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 装饰器模式：逐层包装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;InputStream fis &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; FileInputStream(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;file.txt&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;InputStream bis &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; BufferedInputStream(fis);     &lt;span style=&#34;color:#75715e&#34;&gt;// 增加缓冲&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DataInputStream dis &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; DataInputStream(bis);      &lt;span style=&#34;color:#75715e&#34;&gt;// 增加基本类型读取&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 适配器模式：字节流转字符流&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Reader reader &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; InputStreamReader(fis, StandardCharsets.&lt;span style=&#34;color:#a6e22e&#34;&gt;UTF_8&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;八如何选择设计模式&#34;&gt;八、如何选择设计模式&lt;/h2&gt;
&lt;p&gt;设计模式不是越复杂越好。选择时可以从以下角度思考：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;问题类型&lt;/strong&gt;：是对象创建、结构组织，还是行为交互？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;变化方向&lt;/strong&gt;：系统中哪些部分经常变化？把变化的部分封装起来。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开闭原则&lt;/strong&gt;：新增功能时是否能不修改已有代码？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复杂度收益&lt;/strong&gt;：不要为了用模式而增加不必要的抽象。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一张简化的决策地图：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    A[遇到设计问题] --&amp;gt; B{对象创建复杂?}
    B --&amp;gt;|是| C[创建型模式]
    B --&amp;gt;|否| D{对象结构复杂?}
    D --&amp;gt;|是| E[结构型模式]
    D --&amp;gt;|否| F{对象交互复杂?}
    F --&amp;gt;|是| G[行为型模式]
    F --&amp;gt;|否| H[保持简单，遵循原则]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结&lt;/h2&gt;
&lt;p&gt;设计模式是前人总结的设计经验，核心目标是让软件更易扩展、更易维护、更易理解。掌握它们的关键不是背诵每个类图，而是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;理解六大原则，它们是选择模式的判断依据；&lt;/li&gt;
&lt;li&gt;熟悉 23 种 GoF 模式和 J2EE 模式的适用场景；&lt;/li&gt;
&lt;li&gt;多读优秀源码（JDK、Spring），在真实代码中感受模式的应用；&lt;/li&gt;
&lt;li&gt;避免过度设计，合适才是最好的。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;从 &lt;code&gt;BeanFactory&lt;/code&gt; 到 &lt;code&gt;DispatcherServlet&lt;/code&gt;，从 Java IO 的装饰器到 Spring AOP 的代理，设计模式无处不在。理解这些模式，能帮助我们在面对复杂系统时做出更清晰的结构选择。&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.runoob.com/design-pattern/factory-pattern.html&#34;&gt;菜鸟教程 - 设计模式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cnblogs.com/dailyprogrammer/articles/12272717.html&#34;&gt;dailyprogrammer - JDK 类库常用的设计模式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;/em&gt; (GoF)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
  </channel>
</rss>
