<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>archive</title><link>https://archive-w.netlify.app/doc/advance/design-pattern/</link><description>Recent content on archive</description><generator>Hugo</generator><language>zh-CN</language><atom:link href="https://archive-w.netlify.app/doc/advance/design-pattern/index.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://archive-w.netlify.app/doc/advance/design-pattern/01-singleton/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/doc/advance/design-pattern/01-singleton/</guid><description>&lt;h1 id="单例模式">
 单例模式
 &lt;a class="anchor" href="#%e5%8d%95%e4%be%8b%e6%a8%a1%e5%bc%8f">#&lt;/a>
&lt;/h1>
&lt;ul>
&lt;li>
&lt;h2 id="描述">
 描述
 &lt;a class="anchor" href="#%e6%8f%8f%e8%bf%b0">#&lt;/a>
&lt;/h2>
&lt;p class="warn">单例模式（Singleton Pattern）是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式，它提供了一种创建对象的最佳方式。
&lt;br>&lt;br>这种模式涉及到一个单一的类，该类负责创建自己的对象，同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式，可以直接访问，不需要实例化该类的对象。
&lt;br>&lt;br>单例模式是一种创建型设计模式，它确保一个类只有一个实例，并提供了一个全局访问点来访问该实例。&lt;/p>
&lt;/li>
&lt;li>
&lt;h2 id="uml">
 UML
 &lt;a class="anchor" href="#uml">#&lt;/a>
&lt;/h2>
&lt;/li>
&lt;li>
&lt;h2 id="代码实现">
 代码实现
 &lt;a class="anchor" href="#%e4%bb%a3%e7%a0%81%e5%ae%9e%e7%8e%b0">#&lt;/a>
&lt;/h2>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Main {
 public static void main(String[] args) {
 //获取唯一可用的对象
 SingleObject object = SingleObject.getInstance();
 //显示消息
 object.showMessage();
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;h6 id="懒汉式" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="饿汉式" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="双检锁双重校验锁dcl" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="登记式静态内部类" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="枚举" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;div class="docsify-tabs docsify-tabs--classic">&lt;button anchorId="懒汉式" class="docsify-tabs__tab" data-tab="懒汉式">懒汉式&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="懒汉式">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Singleton { 
 private Singleton (){}
 private static Singleton instance; 
 public static /*synchronized*/ Singleton getInstance() { 
 if (instance == null) { 
 instance = new Singleton(); 
 } 
 return instance; 
 } 
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="饿汉式" class="docsify-tabs__tab" data-tab="饿汉式">饿汉式&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="饿汉式">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Singleton { 
 private Singleton (){}
 private static Singleton instance = new Singleton();
 public static Singleton getInstance() {
 return instance;
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="双检锁双重校验锁dcl" class="docsify-tabs__tab" data-tab="双检锁/双重校验锁[DCL]">双检锁/双重校验锁[DCL]&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="双检锁双重校验锁dcl">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Singleton { 
 private Singleton (){}
 private volatile static Singleton singleton; 
 public static Singleton getSingleton() { 
 if (singleton == null) { 
 synchronized (Singleton.class) { 
 if (singleton == null) { 
 singleton = new Singleton(); 
 } 
 } 
 } 
 return singleton; 
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="登记式静态内部类" class="docsify-tabs__tab" data-tab="登记式/静态内部类">登记式/静态内部类&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="登记式静态内部类">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Singleton { 
 private Singleton (){}
 private static class SingletonHolder { 
 private static final Singleton INSTANCE = new Singleton(); 
 } 
 public static final Singleton getInstance() { 
 return SingletonHolder.INSTANCE; 
 } 
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="枚举" class="docsify-tabs__tab" data-tab="枚举">枚举&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="枚举">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public enum Singleton { 
 INSTANCE; 
 public void whateverMethod() { 
 } 
}
&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>&lt;/div>
&lt;/li>
&lt;li>
&lt;h2 id="reference">
 Reference
 &lt;a class="anchor" href="#reference">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>


 &lt;a href="https://www.runoob.com/design-pattern/singleton-pattern.html" rel="noopener" target="_blank">https://www.runoob.com/design-pattern/singleton-pattern.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul></description></item><item><title/><link>https://archive-w.netlify.app/doc/advance/design-pattern/02-factory/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/doc/advance/design-pattern/02-factory/</guid><description>&lt;h1 id="工厂模式">
 工厂模式
 &lt;a class="anchor" href="#%e5%b7%a5%e5%8e%82%e6%a8%a1%e5%bc%8f">#&lt;/a>
&lt;/h1>
&lt;ul>
&lt;li>
&lt;h2 id="描述">
 描述
 &lt;a class="anchor" href="#%e6%8f%8f%e8%bf%b0">#&lt;/a>
&lt;/h2>
&lt;p class="warn"> 工厂模式提供了一种创建对象的方式，而无需指定要创建的具体类。
&lt;br>&lt;br>工厂模式属于创建型模式，它在创建对象时提供了一种封装机制，将实际创建对象的代码与使用代码分离。&lt;/p>
&lt;/li>
&lt;li>
&lt;h2 id="uml">
 UML
 &lt;a class="anchor" href="#uml">#&lt;/a>
&lt;/h2>
&lt;/li>
&lt;li>
&lt;h2 id="代码实现">
 代码实现
 &lt;a class="anchor" href="#%e4%bb%a3%e7%a0%81%e5%ae%9e%e7%8e%b0">#&lt;/a>
&lt;/h2>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Main {
 public static void main(String[] args) {

 ShapeFactory shapeFactory = new ShapeFactory();

 Shape shape1 = shapeFactory.getShape(&amp;quot;CIRCLE&amp;quot;);
 shape1.draw();

 Shape shape2 = shapeFactory.getShape(&amp;quot;RECTANGLE&amp;quot;);
 shape2.draw();

 Shape shape3 = shapeFactory.getShape(&amp;quot;SQUARE&amp;quot;);
 shape3.draw();
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;h6 id="shapefactoryjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="shapejava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="circlejava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="rectanglejava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="squarejava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;div class="docsify-tabs docsify-tabs--classic">&lt;button anchorId="shapefactoryjava" class="docsify-tabs__tab" data-tab="ShapeFactory.java">ShapeFactory.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="shapefactoryjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class ShapeFactory {

 //使用 getShape 方法获取形状类型的对象
 public Shape getShape(String shapeType){
 if(shapeType == null){ return null; }

 if(shapeType.equalsIgnoreCase(&amp;quot;CIRCLE&amp;quot;)){
 return new Circle();
 } else if(shapeType.equalsIgnoreCase(&amp;quot;RECTANGLE&amp;quot;)){
 return new Rectangle();
 } else if(shapeType.equalsIgnoreCase(&amp;quot;SQUARE&amp;quot;)){
 return new Square();
 }
 return null;
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="shapejava" class="docsify-tabs__tab" data-tab="Shape.java">Shape.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="shapejava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public interface Shape {
 void draw();
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="circlejava" class="docsify-tabs__tab" data-tab="Circle.java">Circle.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="circlejava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Circle implements Shape {
 @Override
 public void draw() {
 System.out.println(&amp;quot;Inside Circle::draw() method.&amp;quot;);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="rectanglejava" class="docsify-tabs__tab" data-tab="Rectangle.java">Rectangle.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="rectanglejava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Rectangle implements Shape {
 @Override
 public void draw() {
 System.out.println(&amp;quot;Inside Rectangle::draw() method.&amp;quot;);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="squarejava" class="docsify-tabs__tab" data-tab="Square.java">Square.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="squarejava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Square implements Shape {
 @Override
 public void draw() {
 System.out.println(&amp;quot;Inside Square::draw() method.&amp;quot;);
}
&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>&lt;/div>
&lt;p>&lt;img src="https://archive-w.netlify.app/.images/doc/advance/design-pattern/dp-factory-01.png" alt="" width="80%">&lt;/p></description></item><item><title/><link>https://archive-w.netlify.app/doc/advance/design-pattern/03-abstract-factory/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/doc/advance/design-pattern/03-abstract-factory/</guid><description>&lt;h1 id="抽象工厂模式">
 抽象工厂模式
 &lt;a class="anchor" href="#%e6%8a%bd%e8%b1%a1%e5%b7%a5%e5%8e%82%e6%a8%a1%e5%bc%8f">#&lt;/a>
&lt;/h1>
&lt;ul>
&lt;li>
&lt;h2 id="描述">
 描述
 &lt;a class="anchor" href="#%e6%8f%8f%e8%bf%b0">#&lt;/a>
&lt;/h2>
&lt;p class="warn">抽象工厂模式（Abstract Factory Pattern）是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式，它提供了一种创建对象的最佳方式。
&lt;br>&lt;br>在抽象工厂模式中，接口是负责创建一个相关对象的工厂，不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
&lt;br>&lt;br>抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口，而无需指定具体实现类。通过使用抽象工厂模式，可以将客户端与具体产品的创建过程解耦，使得客户端可以通过工厂接口来创建一族产品。&lt;/p>
&lt;/li>
&lt;li>
&lt;h2 id="uml">
 UML
 &lt;a class="anchor" href="#uml">#&lt;/a>
&lt;/h2>
&lt;/li>
&lt;li>
&lt;h2 id="代码实现">
 代码实现
 &lt;a class="anchor" href="#%e4%bb%a3%e7%a0%81%e5%ae%9e%e7%8e%b0">#&lt;/a>
&lt;/h2>
&lt;h6 id="mainjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="factoryproducerjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="abstractfactoryjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;div class="docsify-tabs docsify-tabs--classic">&lt;button anchorId="mainjava" class="docsify-tabs__tab" data-tab="Main.java">Main.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="mainjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Main {
 public static void main(String[] args) {
 //获取形状工厂
 AbstractFactory shapeFactory = FactoryProducer.getFactory(&amp;quot;SHAPE&amp;quot;);

 // 会出现NPE
 // Color color = shapeFactory.getColor(&amp;quot;everything&amp;quot;);
 Shape shape1 = shapeFactory.getShape(&amp;quot;CIRCLE&amp;quot;);
 shape1.draw();

 //获取颜色工厂
 AbstractFactory colorFactory = FactoryProducer.getFactory(&amp;quot;COLOR&amp;quot;);

 Color color1 = colorFactory.getColor(&amp;quot;RED&amp;quot;);
 color1.fill();
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="factoryproducerjava" class="docsify-tabs__tab" data-tab="FactoryProducer.java">FactoryProducer.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="factoryproducerjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class FactoryProducer {
 public static AbstractFactory getFactory(String choice){
 if(choice.equalsIgnoreCase(&amp;quot;SHAPE&amp;quot;)){
 return new ShapeFactory();
 } else if(choice.equalsIgnoreCase(&amp;quot;COLOR&amp;quot;)){
 return new ColorFactory();
 }
 return null;
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="abstractfactoryjava" class="docsify-tabs__tab" data-tab="AbstractFactory.java">AbstractFactory.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="abstractfactoryjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public abstract class AbstractFactory {

 public abstract Color getColor(String color);

 public abstract Shape getShape(String shape);

}
&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>&lt;/div>
&lt;h6 id="shapefactoryjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="shapejava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="circlejava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="rectanglejava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="squarejava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;div class="docsify-tabs docsify-tabs--classic">&lt;button anchorId="shapefactoryjava" class="docsify-tabs__tab" data-tab="ShapeFactory.java">ShapeFactory.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="shapefactoryjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class ShapeFactory extends AbstractFactory {

 //使用 getShape 方法获取形状类型的对象
 public Shape getShape(String shapeType){
 if(shapeType == null){ return null; }
 if(shapeType.equalsIgnoreCase(&amp;quot;CIRCLE&amp;quot;)){
 return new Circle();
 } else if(shapeType.equalsIgnoreCase(&amp;quot;RECTANGLE&amp;quot;)){
 return new Rectangle();
 } else if(shapeType.equalsIgnoreCase(&amp;quot;SQUARE&amp;quot;)){
 return new Square();
 }
 return null;
 }

 @Override
 public Color getColor(String color) {
 return null;
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="shapejava" class="docsify-tabs__tab" data-tab="Shape.java">Shape.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="shapejava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public interface Shape {
 void draw();
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="circlejava" class="docsify-tabs__tab" data-tab="Circle.java">Circle.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="circlejava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Circle implements Shape {
 @Override
 public void draw() {
 System.out.println(&amp;quot;Inside Circle::draw() method.&amp;quot;);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="rectanglejava" class="docsify-tabs__tab" data-tab="Rectangle.java">Rectangle.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="rectanglejava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Rectangle implements Shape {
 @Override
 public void draw() {
 System.out.println(&amp;quot;Inside Rectangle::draw() method.&amp;quot;);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="squarejava" class="docsify-tabs__tab" data-tab="Square.java">Square.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="squarejava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Square implements Shape {
 @Override
 public void draw() {
 System.out.println(&amp;quot;Inside Square::draw() method.&amp;quot;);
}
&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>&lt;/div>
&lt;h6 id="colorfactoryjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="colorjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="bluejava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="greenjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="redjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;div class="docsify-tabs docsify-tabs--classic">&lt;button anchorId="colorfactoryjava" class="docsify-tabs__tab" data-tab="ColorFactory.java">ColorFactory.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="colorfactoryjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class ColorFactory extends AbstractFactory {
 @Override
 public Shape getShape(String shapeType){
 return null;
 }

 @Override
 public Color getColor(String color) {
 if(color == null){ return null; }

 if(color.equalsIgnoreCase(&amp;quot;RED&amp;quot;)){
 return new Red();
 } else if(color.equalsIgnoreCase(&amp;quot;GREEN&amp;quot;)){
 return new Green();
 } else if(color.equalsIgnoreCase(&amp;quot;BLUE&amp;quot;)){
 return new Blue();
 }
 return null;
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="colorjava" class="docsify-tabs__tab" data-tab="Color.java">Color.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="colorjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public interface Color {
 void fill();
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="bluejava" class="docsify-tabs__tab" data-tab="Blue.java">Blue.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="bluejava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Blue implements Color {
 @Override
 public void fill() {
 System.out.println(&amp;quot;Inside Blue::fill() method.&amp;quot;);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="greenjava" class="docsify-tabs__tab" data-tab="Green.java">Green.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="greenjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Green implements Color {
 @Override
 public void fill() {
 System.out.println(&amp;quot;Inside Green::fill() method.&amp;quot;);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="redjava" class="docsify-tabs__tab" data-tab="Red.java">Red.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="redjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Red implements Color {
 @Override
 public void fill() {
 System.out.println(&amp;quot;Inside Red::fill() method.&amp;quot;);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>&lt;/div>
&lt;p>&lt;img src="https://archive-w.netlify.app/.images/doc/advance/design-pattern/dp-abstract-factory-01.png" alt="" width="80%">&lt;/p></description></item><item><title/><link>https://archive-w.netlify.app/doc/advance/design-pattern/06-adapter/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/doc/advance/design-pattern/06-adapter/</guid><description>&lt;h1 id="适配器模式">
 适配器模式
 &lt;a class="anchor" href="#%e9%80%82%e9%85%8d%e5%99%a8%e6%a8%a1%e5%bc%8f">#&lt;/a>
&lt;/h1>
&lt;ul>
&lt;li>
&lt;h2 id="描述">
 描述
 &lt;a class="anchor" href="#%e6%8f%8f%e8%bf%b0">#&lt;/a>
&lt;/h2>
&lt;p class="warn">适配器模式（Adapter Pattern）是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式，它结合了两个独立接口的功能。
&lt;br>&lt;br>这种模式涉及到一个单一的类，该类负责加入独立的或不兼容的接口功能。举个真实的例子，读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器，再将读卡器插入笔记本，这样就可以通过笔记本来读取内存卡。
&lt;br>&lt;br>我们通过下面的实例来演示适配器模式的使用。其中，音频播放器设备只能播放 mp3 文件，通过使用一个更高级的音频播放器来播放 vlc 和 mp4 文件。&lt;/p>
&lt;/li>
&lt;li>
&lt;h2 id="uml">
 UML
 &lt;a class="anchor" href="#uml">#&lt;/a>
&lt;/h2>
&lt;/li>
&lt;li>
&lt;h2 id="代码实现">
 代码实现
 &lt;a class="anchor" href="#%e4%bb%a3%e7%a0%81%e5%ae%9e%e7%8e%b0">#&lt;/a>
&lt;/h2>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Main {
 public static void main(String[] args) {

 AudioPlayer audioPlayer = new AudioPlayer();

 audioPlayer.play(&amp;quot;mp3&amp;quot;, &amp;quot;beyond the horizon.mp3&amp;quot;);
 audioPlayer.play(&amp;quot;mp4&amp;quot;, &amp;quot;alone.mp4&amp;quot;);
 audioPlayer.play(&amp;quot;vlc&amp;quot;, &amp;quot;far far away.vlc&amp;quot;);
 audioPlayer.play(&amp;quot;avi&amp;quot;, &amp;quot;mind me.avi&amp;quot;);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;h6 id="audioplayerjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="mediaplayerjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;div class="docsify-tabs docsify-tabs--classic">&lt;button anchorId="audioplayerjava" class="docsify-tabs__tab" data-tab="AudioPlayer.java">AudioPlayer.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="audioplayerjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class AudioPlayer implements MediaPlayer {
 MediaAdapter mediaAdapter;

 @Override
 public void play(String audioType, String fileName) {

 //播放 mp3 音乐文件的内置支持
 if(audioType.equalsIgnoreCase(&amp;quot;mp3&amp;quot;)){
 System.out.println(&amp;quot;Playing mp3 file. Name: &amp;quot;+ fileName);
 }
 //mediaAdapter 提供了播放其他文件格式的支持
 else if(audioType.equalsIgnoreCase(&amp;quot;vlc&amp;quot;)
 || audioType.equalsIgnoreCase(&amp;quot;mp4&amp;quot;)){
 mediaAdapter = new MediaAdapter(audioType);
 mediaAdapter.play(audioType, fileName);
 }
 else{
 System.out.println(&amp;quot;Invalid media. &amp;quot;+
 audioType + &amp;quot; format not supported&amp;quot;);
 }
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="mediaplayerjava" class="docsify-tabs__tab" data-tab="MediaPlayer.java">MediaPlayer.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="mediaplayerjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public interface MediaPlayer {
 public void play(String audioType, String fileName);
}
&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>&lt;/div>
&lt;h6 id="mediaadapterjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="mp4playerjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="vlcplayerjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="advancedmediaplayerjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;div class="docsify-tabs docsify-tabs--classic">&lt;button anchorId="mediaadapterjava" class="docsify-tabs__tab" data-tab="MediaAdapter.java">MediaAdapter.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="mediaadapterjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class MediaAdapter implements MediaPlayer {

 AdvancedMediaPlayer advancedMusicPlayer;

 public MediaAdapter(String audioType){
 if(audioType.equalsIgnoreCase(&amp;quot;vlc&amp;quot;) ){
 advancedMusicPlayer = new VlcPlayer();
 } else if (audioType.equalsIgnoreCase(&amp;quot;mp4&amp;quot;)){
 advancedMusicPlayer = new Mp4Player();
 }
 }

 @Override
 public void play(String audioType, String fileName) {
 if(audioType.equalsIgnoreCase(&amp;quot;vlc&amp;quot;)){
 advancedMusicPlayer.playVlc(fileName);
 }else if(audioType.equalsIgnoreCase(&amp;quot;mp4&amp;quot;)){
 advancedMusicPlayer.playMp4(fileName);
 }
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="mp4playerjava" class="docsify-tabs__tab" data-tab="Mp4Player.java">Mp4Player.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="mp4playerjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Mp4Player implements AdvancedMediaPlayer{

 @Override
 public void playVlc(String fileName) {
 //什么也不做
 }

 @Override
 public void playMp4(String fileName) {
 System.out.println(&amp;quot;Playing mp4 file. Name: &amp;quot;+ fileName);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="vlcplayerjava" class="docsify-tabs__tab" data-tab="VlcPlayer.java">VlcPlayer.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="vlcplayerjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class VlcPlayer implements AdvancedMediaPlayer{
 @Override
 public void playVlc(String fileName) {
 System.out.println(&amp;quot;Playing vlc file. Name: &amp;quot;+ fileName);
 }

 @Override
 public void playMp4(String fileName) {
 //什么也不做
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="advancedmediaplayerjava" class="docsify-tabs__tab" data-tab="AdvancedMediaPlayer.java">AdvancedMediaPlayer.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="advancedmediaplayerjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public interface AdvancedMediaPlayer {
 public void playVlc(String fileName);
 public void playMp4(String fileName);
}
&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>&lt;/div>
&lt;p>&lt;img src="https://archive-w.netlify.app/.images/doc/advance/design-pattern/dp-adapter-01.png" alt="" width="80%">&lt;/p></description></item><item><title/><link>https://archive-w.netlify.app/doc/advance/design-pattern/13-chain-of-responsibility/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/doc/advance/design-pattern/13-chain-of-responsibility/</guid><description>&lt;h1 id="责任链模式">
 责任链模式
 &lt;a class="anchor" href="#%e8%b4%a3%e4%bb%bb%e9%93%be%e6%a8%a1%e5%bc%8f">#&lt;/a>
&lt;/h1>
&lt;ul>
&lt;li>
&lt;h2 id="描述">
 描述
 &lt;a class="anchor" href="#%e6%8f%8f%e8%bf%b0">#&lt;/a>
&lt;/h2>
&lt;p class="warn">顾名思义，责任链模式（Chain of Responsibility Pattern）为请求创建了一个接收者对象的链。这种模式给予请求的类型，对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
&lt;br>&lt;br>在这种模式中，通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求，那么它会把相同的请求传给下一个接收者，依此类推。&lt;/p>
&lt;p class="tip">我们创建抽象类 AbstractLogger，带有详细的日志记录级别。然后我们创建三种类型的记录器，都扩展了 AbstractLogger。每个记录器消息的级别是否属于自己的级别，如果是则相应地打印出来，否则将不打印并把消息传给下一个记录器。&lt;/p>
&lt;/li>
&lt;li>
&lt;h2 id="uml">
 UML
 &lt;a class="anchor" href="#uml">#&lt;/a>
&lt;/h2>
&lt;/li>
&lt;li>
&lt;h2 id="代码实现">
 代码实现
 &lt;a class="anchor" href="#%e4%bb%a3%e7%a0%81%e5%ae%9e%e7%8e%b0">#&lt;/a>
&lt;/h2>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Main {
 private static AbstractLogger getChainOfLoggers(){

 AbstractLogger debugLogger = new DebugLogger(AbstractLogger.DEBUG);
 AbstractLogger infoLogger = new InfoLogger(AbstractLogger.INFO);
 AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);

 debugLogger.setNextLogger(infoLogger);
 infoLogger.setNextLogger(errorLogger);

 return debugLogger;
 }

 public static void main(String[] args) {
 AbstractLogger loggerChain = getChainOfLoggers();

 loggerChain.logMessage(AbstractLogger.DEBUG, &amp;quot;This is a debug level information.&amp;quot;);

 loggerChain.logMessage(AbstractLogger.INFO, &amp;quot;This is an info level information.&amp;quot;);

 loggerChain.logMessage(AbstractLogger.ERROR, &amp;quot;This is an error level information.&amp;quot;);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;h6 id="abstractloggerjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="debugloggerjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="infologgerjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="errorloggerjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;div class="docsify-tabs docsify-tabs--classic">&lt;button anchorId="abstractloggerjava" class="docsify-tabs__tab" data-tab="AbstractLogger.java">AbstractLogger.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="abstractloggerjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public abstract class AbstractLogger {
 public static int DEBUG = 1;
 public static int INFO = 2;
 public static int ERROR = 3;

 protected int level;

 //责任链中的下一个元素
 protected AbstractLogger nextLogger;

 public void setNextLogger(AbstractLogger nextLogger){
 this.nextLogger = nextLogger;
 }

 public void logMessage(int level, String message){
 if(this.level &amp;gt;= level){
 write(message);
 }
 if(nextLogger != null){
 nextLogger.logMessage(level, message);
 }else{ System.out.println();}
 }

 abstract protected void write(String message);
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="debugloggerjava" class="docsify-tabs__tab" data-tab="DebugLogger.java">DebugLogger.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="debugloggerjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class DebugLogger extends AbstractLogger {

 public DebugLogger(int level){
 this.level = level;
 }

 @Override
 protected void write(String message) {
 System.out.println(&amp;quot;Debug::Logger: &amp;quot; + message);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="infologgerjava" class="docsify-tabs__tab" data-tab="InfoLogger.java">InfoLogger.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="infologgerjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class InfoLogger extends AbstractLogger {

 public InfoLogger(int level){
 this.level = level;
 }

 @Override
 protected void write(String message) {
 System.out.println(&amp;quot;Info::Logger: &amp;quot; + message);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="errorloggerjava" class="docsify-tabs__tab" data-tab="ErrorLogger.java">ErrorLogger.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="errorloggerjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class ErrorLogger extends AbstractLogger {

 public ErrorLogger(int level){
 this.level = level;
 }

 @Override
 protected void write(String message) {
 System.out.println(&amp;quot;Error::Logger: &amp;quot; + message);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>&lt;/div>
&lt;p>&lt;img src="https://archive-w.netlify.app/.images/doc/advance/design-pattern/dp-chain-of-responsibility-01.png" alt="" width="80%">&lt;/p></description></item><item><title/><link>https://archive-w.netlify.app/doc/advance/design-pattern/21-strategy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/doc/advance/design-pattern/21-strategy/</guid><description>&lt;h1 id="策略模式">
 策略模式
 &lt;a class="anchor" href="#%e7%ad%96%e7%95%a5%e6%a8%a1%e5%bc%8f">#&lt;/a>
&lt;/h1>
&lt;ul>
&lt;li>
&lt;h2 id="描述">
 描述
 &lt;a class="anchor" href="#%e6%8f%8f%e8%bf%b0">#&lt;/a>
&lt;/h2>
&lt;p class="warn">在策略模式（Strategy Pattern）中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
&lt;br>&lt;br>在策略模式定义了一系列算法或策略，并将每个算法封装在独立的类中，使得它们可以互相替换。通过使用策略模式，可以在运行时根据需要选择不同的算法，而不需要修改客户端代码。
&lt;br>&lt;br>在策略模式中，我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。&lt;/p>
&lt;p class="tip">我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。StrategyPatternDemo，我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。&lt;/p>
&lt;/li>
&lt;li>
&lt;h2 id="uml">
 UML
 &lt;a class="anchor" href="#uml">#&lt;/a>
&lt;/h2>
&lt;/li>
&lt;li>
&lt;h2 id="代码实现">
 代码实现
 &lt;a class="anchor" href="#%e4%bb%a3%e7%a0%81%e5%ae%9e%e7%8e%b0">#&lt;/a>
&lt;/h2>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Main {

 public static void main(String[] args) {

 Context context = new Context(new OperationAdd());
 System.out.println(&amp;quot;10 + 5 = &amp;quot; + context.executeStrategy(10, 5));

 context = new Context(new OperationSubtract());
 System.out.println(&amp;quot;10 - 5 = &amp;quot; + context.executeStrategy(10, 5));

 context = new Context(new OperationMultiply());
 System.out.println(&amp;quot;10 * 5 = &amp;quot; + context.executeStrategy(10, 5));
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Context {
 private Strategy strategy;

 public Context(Strategy strategy){
 this.strategy = strategy;
 }

 public int executeStrategy(int num1, int num2){
 return strategy.doOperation(num1, num2);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public interface Strategy {
 public int doOperation(int num1, int num2);
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;h6 id="operationaddjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="operationsubtractjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="operationmultiplyjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;div class="docsify-tabs docsify-tabs--classic">&lt;button anchorId="operationaddjava" class="docsify-tabs__tab" data-tab="OperationAdd.java">OperationAdd.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="operationaddjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class OperationAdd implements Strategy{
 @Override
 public int doOperation(int num1, int num2) {
 return num1 + num2;
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="operationsubtractjava" class="docsify-tabs__tab" data-tab="OperationSubtract.java">OperationSubtract.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="operationsubtractjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class OperationSubtract implements Strategy{
 @Override
 public int doOperation(int num1, int num2) {
 return num1 - num2;
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="operationmultiplyjava" class="docsify-tabs__tab" data-tab="OperationMultiply.java">OperationMultiply.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="operationmultiplyjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class OperationMultiply implements Strategy{
 @Override
 public int doOperation(int num1, int num2) {
 return num1 * num2;
 }
}
&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>&lt;/div>
&lt;p>&lt;img src="https://archive-w.netlify.app/.images/doc/advance/design-pattern/dp-strategy-01.png" alt="" width="80%">&lt;/p></description></item><item><title/><link>https://archive-w.netlify.app/doc/advance/design-pattern/22-template/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/doc/advance/design-pattern/22-template/</guid><description>&lt;h1 id="模板模式">
 模板模式
 &lt;a class="anchor" href="#%e6%a8%a1%e6%9d%bf%e6%a8%a1%e5%bc%8f">#&lt;/a>
&lt;/h1>
&lt;ul>
&lt;li>
&lt;h2 id="描述">
 描述
 &lt;a class="anchor" href="#%e6%8f%8f%e8%bf%b0">#&lt;/a>
&lt;/h2>
&lt;p class="warn">在模板模式（Template Pattern）中，一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现，但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。&lt;/p>
&lt;/li>
&lt;li>
&lt;h2 id="uml">
 UML
 &lt;a class="anchor" href="#uml">#&lt;/a>
&lt;/h2>
&lt;/li>
&lt;li>
&lt;h2 id="代码实现">
 代码实现
 &lt;a class="anchor" href="#%e4%bb%a3%e7%a0%81%e5%ae%9e%e7%8e%b0">#&lt;/a>
&lt;/h2>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Main {
 public static void main(String[] args) {

 Game game = new Cricket();
 game.play();

 game = new Football();
 game.play();
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;h6 id="gamejava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="cricketjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="footballjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;div class="docsify-tabs docsify-tabs--classic">&lt;button anchorId="gamejava" class="docsify-tabs__tab" data-tab="Game.java">Game.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="gamejava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public abstract class Game {
 abstract void initialize();
 abstract void startPlay();
 abstract void endPlay();
 //模板
 public final void play(){
 //初始化游戏
 initialize();
 //开始游戏
 startPlay();
 //结束游戏
 endPlay();
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="cricketjava" class="docsify-tabs__tab" data-tab="Cricket.java">Cricket.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="cricketjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Cricket extends Game {

 @Override
 void endPlay() {
 System.out.println(&amp;quot;Cricket Game Finished!&amp;quot;);
 }

 @Override
 void initialize() {
 System.out.println(&amp;quot;Cricket Game Initialized! Start playing.&amp;quot;);
 }

 @Override
 void startPlay() {
 System.out.println(&amp;quot;Cricket Game Started. Enjoy the game!&amp;quot;);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="footballjava" class="docsify-tabs__tab" data-tab="Football.java">Football.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="footballjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Football extends Game {

 @Override
 void endPlay() {
 System.out.println(&amp;quot;Football Game Finished!&amp;quot;);
 }

 @Override
 void initialize() {
 System.out.println(&amp;quot;Football Game Initialized! Start playing.&amp;quot;);
 }

 @Override
 void startPlay() {
 System.out.println(&amp;quot;Football Game Started. Enjoy the game!&amp;quot;);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>&lt;/div>
&lt;p>&lt;img src="https://archive-w.netlify.app/.images/doc/advance/design-pattern/dp-template-01.png" alt="" width="80%">&lt;/p></description></item><item><title/><link>https://archive-w.netlify.app/doc/advance/design-pattern/23-visitor/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/doc/advance/design-pattern/23-visitor/</guid><description>&lt;h1 id="访问者模式">
 访问者模式
 &lt;a class="anchor" href="#%e8%ae%bf%e9%97%ae%e8%80%85%e6%a8%a1%e5%bc%8f">#&lt;/a>
&lt;/h1>
&lt;ul>
&lt;li>
&lt;h2 id="描述">
 描述
 &lt;a class="anchor" href="#%e6%8f%8f%e8%bf%b0">#&lt;/a>
&lt;/h2>
&lt;p class="warn">在访问者模式（Visitor Pattern）中，我们使用了一个访问者类，它改变了元素类的执行算法。通过这种方式，元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式，元素对象已接受访问者对象，这样访问者对象就可以处理元素对象上的操作。&lt;/p>
&lt;p class="tip"> 访问模式可以有变形，比如有些写法中被访问的是抽象类，而另外的是接口实现。
&lt;br>&lt;br>


 &lt;a href="https://asm.ow2.io/" rel="noopener" target="_blank">&lt;code>ASM&lt;/code>&lt;/a>里面就用到了访问者模式来处理字节码信息。&lt;/p>
&lt;/li>
&lt;li>
&lt;h2 id="uml">
 UML
 &lt;a class="anchor" href="#uml">#&lt;/a>
&lt;/h2>
&lt;/li>
&lt;li>
&lt;h2 id="代码实现">
 代码实现
 &lt;a class="anchor" href="#%e4%bb%a3%e7%a0%81%e5%ae%9e%e7%8e%b0">#&lt;/a>
&lt;/h2>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Main {
 public static void main(String[] args) {

 List&amp;lt;Staff&amp;gt; staffs = new ArrayList&amp;lt;&amp;gt;();
 staffs.add(new Manager(&amp;quot;经理-A&amp;quot;));
 staffs.add(new Manager(&amp;quot;经理-B&amp;quot;));
 staffs.add(new Engineer(&amp;quot;工程师-A&amp;quot;));
 staffs.add(new Engineer(&amp;quot;工程师-B&amp;quot;));
 staffs.add(new Engineer(&amp;quot;工程师-C&amp;quot;));
 staffs.add(new Engineer(&amp;quot;工程师-D&amp;quot;));

 CEOVisitor ceoVisitor = new CEOVisitor();
 for (Staff staff : staffs) {
 staff.accept(ceoVisitor);
 }

 System.out.println();

 CTOVisitor ctoVisitor = new CTOVisitor();
 for (Staff staff : staffs) {
 staff.accept(ctoVisitor);
 }
 }
}
&lt;/code>&lt;/pre>&lt;/div> &lt;div class="docsify-example-panels"> &lt;div class="docsify-example-panel title-panel">
&lt;h3 id="active访问">
 active(访问)
 &lt;a class="anchor" href="#active%e8%ae%bf%e9%97%ae">#&lt;/a>
&lt;/h3>
&lt;h6 id="visitorjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="ceovisitorjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="ctovisitorjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;div class="docsify-tabs docsify-tabs--classic">&lt;button anchorId="visitorjava" class="docsify-tabs__tab" data-tab="Visitor.java">Visitor.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="visitorjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public interface Visitor {
 void visit(Engineer engineer);
 void visit(Manager manager);
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="ceovisitorjava" class="docsify-tabs__tab" data-tab="CEOVisitor.java">CEOVisitor.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="ceovisitorjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class CEOVisitor implements Visitor {

 @Override
 public void visit(Engineer engineer) {
 System.out.println(&amp;quot;CEO -visit-&amp;gt; 工程师: &amp;quot; + engineer.name + &amp;quot;, KPI: &amp;quot; + engineer.kpi);
 }

 @Override
 public void visit(Manager manager) {
 System.out.println(&amp;quot;CEO -visit-&amp;gt; 经理: &amp;quot; + manager.name + &amp;quot;, KPI: &amp;quot; + manager.kpi +
 &amp;quot;, 新产品数量: &amp;quot; + manager.getProducts());
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="ctovisitorjava" class="docsify-tabs__tab" data-tab="CTOVisitor.java">CTOVisitor.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="ctovisitorjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class CTOVisitor implements Visitor {

 @Override
 public void visit(Engineer engineer) {
 System.out.println(&amp;quot;CTO -visit-&amp;gt; 工程师: &amp;quot; + engineer.name + &amp;quot;, 代码行数: &amp;quot; + engineer.getCodeLines());
 }

 @Override
 public void visit(Manager manager) {
 System.out.println(&amp;quot;CTO -visit-&amp;gt; 经理: &amp;quot; + manager.name + &amp;quot;, 产品数量: &amp;quot; + manager.getProducts());
 }
}
&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>&lt;/div>&lt;/div>&lt;/div> &lt;div class="docsify-example-panels"> &lt;div class="docsify-example-panel title-panel">
&lt;h3 id="passive被访问">
 passive(被访问)
 &lt;a class="anchor" href="#passive%e8%a2%ab%e8%ae%bf%e9%97%ae">#&lt;/a>
&lt;/h3>
&lt;h6 id="staffjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="engineerjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="managerjava" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;div class="docsify-tabs docsify-tabs--classic">&lt;button anchorId="staffjava" class="docsify-tabs__tab" data-tab="Staff.java">Staff.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="staffjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public abstract class Staff {

 public String name;
 public int kpi;// 员工KPI

 public Staff(String name) {
 this.name = name;
 kpi = new Random().nextInt(10);
 }
 // 核心方法，接受Visitor的访问
 public abstract void accept(Visitor visitor);
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="engineerjava" class="docsify-tabs__tab" data-tab="Engineer.java">Engineer.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="engineerjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Engineer extends Staff {

 public Engineer(String name) {
 super(name);
 }

 @Override
 public void accept(Visitor visitor) {
 visitor.visit(this);
 }
 // 工程师一年的代码数量
 public int getCodeLines() {
 return new Random().nextInt(10 * 10000);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="managerjava" class="docsify-tabs__tab" data-tab="Manager.java">Manager.java&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="managerjava">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Manager extends Staff {

 public Manager(String name) {
 super(name);
 }

 @Override
 public void accept(Visitor visitor) {
 visitor.visit(this);
 }

 // 一年做的产品数量
 public int getProducts() {
 return new Random().nextInt(10);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>&lt;/div>&lt;/div>&lt;/div>

&lt;p>&lt;img src="https://archive-w.netlify.app/.images/doc/advance/design-pattern/dp-visitor-01.png" alt="" width="80%">&lt;/p></description></item></channel></rss>