23种设计模式行为型模式详细介绍(下)

Posted 小新要变强

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了23种设计模式行为型模式详细介绍(下)相关的知识,希望对你有一定的参考价值。

前言

本文为 【23种设计模式】行为型模式 相关内容介绍,下边将对访问者模式模板模式策略模式状态模式观察者模式备忘录模式中介者模式迭代器模式解释器模式命令模式责任链模式,具体包括它们的特点与实现等进行详尽介绍~

📌博主主页:小新要变强 的主页
👉Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
👉算法刷题路线可参考:算法刷题路线总结与相关资料分享,内含最详尽的算法刷题路线指南及相关资料分享~
👉Java微服务开源项目可参考:企业级Java微服务开源项目(开源框架,用于学习、毕设、公司项目、私活等,减少开发工作,让您只关注业务!)


目录

行为型模式详细介绍


一、中介者模式

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

1️⃣介绍

意图: 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

主要解决: 对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

何时使用: 多个类相互耦合,形成了网状结构。

如何解决: 将上述网状结构分离为星型结构。

关键代码: 对象 Colleague 之间的通信封装到一个类中单独处理。

应用实例:

  • 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。
  • 2、机场调度系统。
  • 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

优点:

  • 1、降低了类的复杂度,将一对多转化成了一对一。
  • 2、各个类之间的解耦。
  • 3、符合迪米特原则。

缺点: 中介者会庞大,变得复杂难以维护。

使用场景:

  • 1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
  • 2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

注意事项: 不应当在职责混乱的时候使用。

2️⃣实现

我们通过聊天室实例来演示中介者模式。实例中,多个用户可以向聊天室发送消息,聊天室向所有的用户显示消息。我们将创建两个类 ChatRoom 和 User。User 对象使用 ChatRoom 方法来分享他们的消息。

MediatorPatternDemo,我们的演示类使用 User 对象来显示他们之间的通信。

🍀(1)创建中介类。

ChatRoom.java:

import java.util.Date;
 
public class ChatRoom 
   public static void showMessage(User user, String message)
      System.out.println(new Date().toString()
         + " [" + user.getName() +"] : " + message);
   

🍀(2)创建 user 类。

User.java:

public class User 
   private String name;
 
   public String getName() 
      return name;
   
 
   public void setName(String name) 
      this.name = name;
   
 
   public User(String name)
      this.name  = name;
   
 
   public void sendMessage(String message)
      ChatRoom.showMessage(this,message);
   

🍀(3)使用 User 对象来显示他们之间的通信。

MediatorPatternDemo.java:

public class MediatorPatternDemo 
   public static void main(String[] args) 
      User robert = new User("Robert");
      User john = new User("John");
 
      robert.sendMessage("Hi! John!");
      john.sendMessage("Hello! Robert!");
   

🍀(4)执行程序

输出结果:

Thu Jan 31 16:05:46 IST 2013 [Robert] : Hi! John!
Thu Jan 31 16:05:46 IST 2013 [John] : Hello! Robert!

二、迭代器模式

迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

迭代器模式属于行为型模式。

1️⃣介绍

意图: 提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。

主要解决: 不同的方式来遍历整个整合对象。

何时使用: 遍历一个聚合对象。

如何解决: 把在元素之间游走的责任交给迭代器,而不是聚合对象。

关键代码: 定义接口:hasNext, next。

应用实例: JAVA 中的 iterator。

优点:

  • 1、它支持以不同的方式遍历一个聚合对象。
  • 2、迭代器简化了聚合类。
  • 3、在同一个聚合上可以有多个遍历。
  • 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

缺点: 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

使用场景:

  • 1、访问一个聚合对象的内容而无须暴露它的内部表示。
  • 2、需要为聚合对象提供多种遍历方式。
  • 3、为遍历不同的聚合结构提供一个统一的接口。

注意事项: 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。

2️⃣实现

我们将创建一个叙述导航方法的 Iterator 接口和一个返回迭代器的 Container 接口。实现了 Container 接口的实体类将负责实现 Iterator 接口。

IteratorPatternDemo,我们的演示类使用实体类 NamesRepository 来打印 NamesRepository 中存储为集合的 Names。

🍀(1)创建接口

Iterator.java:

public interface Iterator 
   public boolean hasNext();
   public Object next();

Container.java:

public interface Container 
   public Iterator getIterator();

🍀(2)创建实现了 Container 接口的实体类。该类有实现了 Iterator 接口的内部类 NameIterator。

NameRepository.java:

public class NameRepository implements Container 
   public String[] names = "Robert" , "John" ,"Julie" , "Lora";
 
   @Override
   public Iterator getIterator() 
      return new NameIterator();
   
 
   private class NameIterator implements Iterator 
 
      int index;
 
      @Override
      public boolean hasNext() 
         if(index < names.length)
            return true;
         
         return false;
      
 
      @Override
      public Object next() 
         if(this.hasNext())
            return names[index++];
         
         return null;
           
   

🍀(3)使用 NameRepository 来获取迭代器,并打印名字。

IteratorPatternDemo.java:

public class IteratorPatternDemo 
   
   public static void main(String[] args) 
      NameRepository namesRepository = new NameRepository();
 
      for(Iterator iter = namesRepository.getIterator(); iter.hasNext();)
         String name = (String)iter.next();
         System.out.println("Name : " + name);
        
   

🍀(4)执行程序,输出结果:

Name : Robert
Name : John
Name : Julie
Name : Lora

三、解释器模式

解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。

1️⃣介绍

意图: 给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子

主要解决: 对于一些固定文法构建一个解释句子的解释器。

何时使用: 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

如何解决: 构建语法树,定义终结符与非终结符。

关键代码: 构建环境类,包含解释器之外的一些全局信息,一般是 HashMap。

应用实例: 编译器、运算表达式计算。

优点:

  • 1、可扩展性比较好,灵活。
  • 2、增加了新的解释表达式的方式。
  • 3、易于实现简单文法。

缺点:

  • 1、可利用场景比较少。
  • 2、对于复杂的文法比较难维护。
  • 3、解释器模式会引起类膨胀。
  • 4、解释器模式采用递归调用方法。

使用场景:

  • 1、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
  • 2、一些重复出现的问题可以用一种简单的语言来进行表达。
  • 3、一个简单语法需要解释的场景。

注意事项: 可利用场景比较少,JAVA 中如果碰到可以用 expression4J 代替。

2️⃣实现

我们将创建一个接口 Expression 和实现了 Expression 接口的实体类。定义作为上下文中主要解释器的 TerminalExpression 类。其他的类 OrExpression、AndExpression 用于创建组合式表达式。

InterpreterPatternDemo,我们的演示类使用 Expression 类创建规则和演示表达式的解析。

🍀(1)创建一个表达式接口。

Expression.java:

public interface Expression 
   public boolean interpret(String context);

🍀(2)创建实现了上述接口的实体类。

TerminalExpression.java:

public class TerminalExpression implements Expression 
   
   private String data;
 
   public TerminalExpression(String data)
      this.data = data; 
   
 
   @Override
   public boolean interpret(String context) 
      if(context.contains(data))
         return true;
      
      return false;
   

OrExpression.java:

public class OrExpression implements Expression 
    
   private Expression expr1 = null;
   private Expression expr2 = null;
 
   public OrExpression(Expression expr1, Expression expr2)  
      this.expr1 = expr1;
      this.expr2 = expr2;
   
 
   @Override
   public boolean interpret(String context)       
      return expr1.interpret(context) || expr2.interpret(context);
   

AndExpression.java:

public class AndExpression implements Expression 
    
   private Expression expr1 = null;
   private Expression expr2 = null;
 
   public AndExpression(Expression expr1, Expression expr2)  
      this.expr1 = expr1;
      this.expr2 = expr2;
   
 
   @Override
   public boolean interpret(String context)       
      return expr1.interpret(context) && expr2.interpret(context);
   

🍀(3)InterpreterPatternDemo 使用 Expression 类来创建规则,并解析它们。

InterpreterPatternDemo.java:

public class InterpreterPatternDemo 
 
   //规则:Robert 和 John 是男性
   public static Expression getMaleExpression()
      Expression robert = new TerminalExpression("Robert");
      Expression john = new TerminalExpression("John");
      return new OrExpression(robert, john);    
   
 
   //规则:Julie 是一个已婚的女性
   public static Expression getMarriedWomanExpression()
      Expression julie = new TerminalExpression("Julie");
      Expression married = new TerminalExpression("Married");
      return new AndExpression(julie, married);    
   
 
   public static void main(String[] args) 
      Expression isMale = getMaleExpression();
      Expression isMarriedWoman = getMarriedWomanExpression();
 
      System.out.println("John is male? " + isMale.interpret("John"));
      System.out.println("Julie is a married women? " 
      + isMarriedWoman.interpret("Married Julie"));
   

🍀(4)执行程序,输出结果:

John is male? true
Julie is a married women? true

四、命令模式

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

1️⃣介绍

意图: 将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

主要解决: 在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

何时使用: 在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

如何解决: 通过调用者调用接受者执行命令,顺序:调用者→命令→接受者。

关键代码: 定义三个角色:

  • 1、received 真正的命令执行对象
  • 2、Command
  • 3、invoker 使用命令对象的入口

应用实例: struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。

优点:

  • 1、降低了系统耦合度。
  • 2、新的命令可以很容易添加到系统中去。

缺点: 使用命令模式可能会导致某些系统有过多的具体命令类。

使用场景: 认为是命令的地方都可以使用命令模式,比如:

  • 1、GUI 中每一个按钮都是一条命令。
  • 2、模拟 CMD。

注意事项: 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。

2️⃣实现

我们首先创建作为命令的接口 Order,然后创建作为请求的 Stock 类。实体命令类 BuyStock 和 SellStock,实现了 Order 接口,将执行实际的命令处理。创建作为调用对象的类 Broker,它接受订单并能下订单。

Broker 对象使用命令模式,基于命令的类型确定哪个对象执行哪个命令。CommandPatternDemo 类使用 Broker 类来演示命令模式。

🍀(1)创建一个命令接口。

Order.java:

public interface Order 
   void execute();

🍀(2)创建一个请求类。

Stock.java:

public class Stock 
   
   private String name = "ABC";
   private int quantity = 10;
 
   public void buy()
      System.out.println("Stock [ Name: "+name+", 
         Quantity: " + quantity +" ] bought");
   
   public void sell()
      System.out.println("Stock [ Name: "+name+", 
         Quantity: " + quantity +" ] sold");
   

🍀(3)创建实现了 Order 接口的实体类。

BuyStock.java:

public class BuyStock implements Order 
   private Stock abcStock;
 
   public BuyStock(Stock abcStock)
      this.abcStock = abcStock;
   
 
   public void execute() 
      abcStock.buy();
   

SellStock.java:

public class SellStock implements Order 
   private Stock abcStock;
 
   public SellStock(Stock abcStock)
      this.abcStock = abcStock;
   
 
   public void execute() 
      abcStock.sell();
   

🍀(4)创建命令调用类。

Broker.java:

import java.util.ArrayList;
import java.util.List;
 
public class Broker 
   private List<Order> orderList = new ArrayList<Order>(); 
 
   public void takeOrder(Order order)
      orderList.add(order);      
   
 
   public void placeOrders()
      for (Order order : orderList) 
         order.execute();
      
      orderList.clear();
   

🍀(5)使用 Broker 类来接受并执行命令。

CommandPatternDemo.java:

public class CommandPatternDemo 
   public static void main(String[] args) 
      Stock abcStock = new Stock();
 
      BuyStock buyStockOrder = new BuyStock(abcStock);
      SellStock sellStockOrder = new SellStock(abcStock);
 
      Broker broker = new Broker();
      broker.takeOrder(buyStockOrder);
      broker.takeOrder(sellStockOrder);
 
      broker.placeOrders();
   

🍀(6)执行程序

输出结果:

Stock [ Name: ABC, Quantity: 10 ] bought
Stock [ Name: ABC, Quantity: 10 ] sold

五、责任链模式

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

1️⃣介绍

意图: 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

主要解决: 职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

何时使用: 在处理消息的时候以过滤很多道。

如何解决: 拦截的类都实现统一接口。

关键代码: Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。

应用实例:

  • 1、红楼梦中的"击鼓传花"。
  • 2、JS 中的事件冒泡。
  • 3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的
    Filter。

优点:

  • 1、降低耦合度。它将请求的发送者和接收者解耦。
  • 2、简化了对象。使得对象不需要知道链的结构。
  • 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
  • 4、增加新的请求处理类很方便。

缺点:

  • 1、不能保证请求一定被接收。
  • 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
  • 3、可能不容易观察运行时的特征,有碍于除错。

使用场景:

  • 1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
  • 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  • 3、可动态指定一组对象处理请求。

注意事项: 在 JAVA WEB 中遇到很多应用。

2️⃣实现

我们创建抽象类 AbstractLogger,带有详细的日志记录级别。然后我们创建三种类型的记录器,都扩展了 AbstractLogger。每个记录器消息的级别是否属于自己的级别,如果是则相应地打印出来,否则将不打印并把消息传给下一个记录器。

🍀(1)创建抽象的记录器类。

AbstractLogger.java:

public abstract class AbstractLogger 
   public static int INFO = 1;
   public static int DEBUG = 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 <= level)
         write(message);
      
      if(nextLogger !=null)
         nextLogger.logMessage(level, message);
      
   
 
   abstract protected void write(String message);
   

🍀(2)创建扩展了该记录器类的实体类。

ConsoleLogger.java࿱

23种设计模式介绍---- 行为型模式

 由于设计模式篇幅比较大,如果在一篇文章讲完所有的设计模式的话不利于阅读。于是我把它分为三篇文章

  设计模式都是比较抽象的概念,所以大家一定要确保看懂类图,而后再自己写代码加强记忆。

概述

  行为型模式一共有11种:

  • 模板方法模式(Template Method)
  • 策略模式(Strategy)
  • 命令模式(Command)
  • 中介者模式(Mediator)
  • 观察者模式(Observer)
  • 迭代器模式(Iteratior)
  • 访问者模式(Visiter)
  • 责任链模式(Chain of Responsibility)
  • 备忘录模式(Memento)
  • 状态模式(State)
  • 解释器模式(Interpreter)

  其中有分为:

  算法封装:模板方法、策略、命令模式

  对象去耦:中介、观察者模式

  抽象集合:迭代器模式

  行为扩展:访问者、责任链模式

  对象状态:状态模式

  解释器模式

一、模板方法模式 

  定义:定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使子类可以重定义算法的某些特定步骤而不改变该算法的结构。

  适用:1.需要一次性实现算法的不变部分,并将可变行为留给子类来实现。2子类的共同行为应该被提出来放到公共类中,以避免代买重复。现有代码的差别应该被分离为新的操作。然后用一个调用这些新操作的模板方法来替换这些不同的代码。

  类图:

 二、策略模式

  定义:定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。本模式使得算法可独立于使用它的客户而变化。

  角色:策略接口(Strategy)、具体策略、环境对象

  理解:环境对象持有Strategy的引用,Strategy对象可以动态改

  类图:

三、命令模式

  定义:将请求封装成一个对象,从而可用不同的请求对客户端进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

  角色:客户端(Client)、命令调用者(Invoker)、命令接口(Command)、具体命令(ConcreteCommand)、命令接收者(Receiver)

  理解:1.invoker保持有command的引用,command保持有Receiver的引用。2.客户创建Receiver、ConcreteCommand并把Receiver设置给ConcreteCommand,客户端直接通过ConcreteCommand.execute执行命令。或者创建一个Invoker并把ConcreteCommand设置给Invoker,然后通过Invoker来调用命令。

  类图:

四、中介者模式

  定义:用中介对象封装一系列的对象交互。中介者使得各对象不需要显示地互相引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。

  角色:中介者接口(Mediator)、具体中介者、同事者接口(Colleague),具体同事者。

  理解:每个Colleague都有一个Mediator实例,Mediator应该知道所有的Colleague

  类图:

 五、观察者

  定义:定义了一种一对多的关系,让多个观察者监听某一主题对象,这个主题对象的状态变化时,会通知所有观察者对象,使它们自己更新自己

  角色:发布者接口(Subject)、具体发布者、监听者接口(Observer)、具体监听者。

  理解:Subject提供注册于注销的方法,客户把所有的Observer注册到Subject当中,当需要时Subject遍历所有注册的Observer并通知他们。

  类图:

 

六、迭代器模式

  定义:提供一种方法顺序的访问一个聚合对象的各个元素,而又不暴露该对象内部表示

  角色:迭代器、集合

  理解:把遍历集合的职能从集合本身转移到迭代器对象,不同的迭代器可以执行不同的遍历策略。

  适用:1.需要访问组合对象的内容,而又不暴露其内部表示。2.需要通过多种方式遍历组合对象3.需要提供一个统一的接口,用来遍历各种类型组合对象。

  类图:

 

 

七、访问者模式

  定义:表示一个作用于某对象结构中的各元素的操作。它让我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

  角色:访问者(Vistor)接口、具体访问者、访问元素(Element)接口、具体元素

  理解:1.元素对象通常是“部分-整体”结构中的节点。2.客户端创建一个ConcreteVistoer,把它传给一个ConcreteElement,ConcreteElement的所有集合都接受ConcreteVistoer的访问。

  适用:

    1. 一个复杂的对象结构包含很多其他对象,它们有不同的接口,但是相对这些对象实施一些依赖于其具体类型的操作。
    2. 需要对一个组合结构中的对象进行很多不相关的操作,但是不想让这些操作污染这些对象的类。可将相关操作集中起来,定义在一个访问者类中,并在需要在访问者中定义的操作时使用它。
    3. 定义复杂的结构类很少作修改,但经常需要向其添加新的操作。

  类图:

  

八、责任链模式

  定义:使多个对象都有机会处理请求,从而避免请求的发送者与接受者之间的耦合关系。将这个对象连成一条链传递该请求,直到有一个对象处理它为止。

  理解:对象引用同一类型的另一个对象,形成一条链。链中的每个对象实现了同样的方法,处理对链中第一个对象发起的同一个请求。

  适用:

    1. 有多个对象可处理请求,而处理程序只有在运行时才能确定。
    2. 向一组对象发出请求,而不想现显式指定处理请求的特定处理程序。

  类图:

 

九、备忘录模式

  定义:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。、

  角色:有三个角色:发起人(Originatior)、备忘录(Memento)、看管人(Caretaker)。

  理解:发起人生成一个备忘录给看管人,看管人保存备忘录。当需要时,看管人获取备忘录交给发起人,发起人根据备忘录恢复自己。  

  类图:

   

 

 

 

十、状态模式

  定义:允许一个对象在其内部状态改变时改变他的行为。对象看起来似乎改变了它的类。

  角色:有2个角色:环境(context)、状态(state)

  理解:1.state可以理解为一个接口。2.context持有state的一个实例,动态的改state就动态的改了context的行为。

  类图:

  

 

十一、解释器模式

  定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

  角色:环境(context)、解释器

  理解:给定一个环境,创建不同的解释器并把环境传给解释器,不同的解释器对环境有不同的解释。

  类图:

 

以上是关于23种设计模式行为型模式详细介绍(下)的主要内容,如果未能解决你的问题,请参考以下文章

23种设计模式介绍---- 行为型模式

23种设计模式的分类和应用场景总结设计模式

23种设计模式的分类和应用场景总结设计模式

23种设计模式创建型模式详细介绍之工厂模式

23种设计模式创建型模式详细介绍之工厂模式

23种设计模式创建型模式详细介绍之工厂模式