跳至主要內容
Decorator Design Pattern

定义

装饰者模式是一种常用的设计模式,它动态地给一个对象添加一些额外的职责1。装饰者模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为2。

框架中使用

mybatis中:

打开sqlSession时,会创建Executor,最终会进入org.apache.ibatis.session.Configuration#newExecutor(org.apache.ibatis.transaction.Transaction, org.apache.ibatis.session.ExecutorType)


ChenSino原创小于 1 分钟设计模式
Template Method

定义

模板方法模式(Template Method Pattern)是一种行为型设计模式,定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。这种设计模式是一种控制反转的实现方式。因为高层代码不再确定(控制)算法的处理流程。模板方法模式多用在某些类别的算法中,实现了相同的方法,造成代码的重复。这个设计模式和策略模式很像,不同的是,模板方法会有一些通用的逻辑,而策略模式是整个方法重写。从类的继承结构也可以看出来,模板方法是提供一个抽象类,有一个通用的方法,不通用的逻辑放到子类去实现,而策略模式是子类直接继承自接口,要重写整个方法。


ChenSino原创大约 2 分钟设计模式
Builder Pattern

建造者模式

这种模式太常见了,开源框架中的各种builder都是

mybatis中

org.apache.ibatis.mapping.Environment

public final class Environment {
  private final String id;
  private final TransactionFactory transactionFactory;
  private final DataSource dataSource;

  public Environment(String id, TransactionFactory transactionFactory, DataSource dataSource) {
    if (id == null) {
      throw new IllegalArgumentException("Parameter 'id' must not be null");
    }
    if (transactionFactory == null) {
      throw new IllegalArgumentException("Parameter 'transactionFactory' must not be null");
    }
    this.id = id;
    if (dataSource == null) {
      throw new IllegalArgumentException("Parameter 'dataSource' must not be null");
    }
    this.transactionFactory = transactionFactory;
    this.dataSource = dataSource;
  }

  public static class Builder {
    private final String id;
    private TransactionFactory transactionFactory;
    private DataSource dataSource;

    public Builder(String id) {
      this.id = id;
    }

    public Builder transactionFactory(TransactionFactory transactionFactory) {
      this.transactionFactory = transactionFactory;
      return this;
    }

    public Builder dataSource(DataSource dataSource) {
      this.dataSource = dataSource;
      return this;
    }

    public String id() {
      return this.id;
    }

//  最终返回Environment对象
    public Environment build() {
      return new Environment(this.id, this.transactionFactory, this.dataSource);
    }

  }

  public String getId() {
    return this.id;
  }

  public TransactionFactory getTransactionFactory() {
    return this.transactionFactory;
  }

  public DataSource getDataSource() {
    return this.dataSource;
  }

}


ChenSino原创小于 1 分钟设计模式
Strategy Pattern

策略模式【CHATGPT回答】

策略模式(Strategy Pattern)是一种行为型设计模式,它将一组可相互替换的算法封装成独立的对象,并对外暴露相同的接口,从而使得它们可以根据需要动态地替换,以实现不同的行为。

策略模式由三个角色组成,分别是:

1. 策略(Strategy):提供了一个公共的接口,用于实现不同的算法。

2. 具体策略(ConcreteStrategy):实现了策略接口,并提供了具体的算法实现。

3. 上下文(Context):负责协调各个策略的执行,它持有一个策略对象,可以动态地切换策略对象,以改变上下文的行为。

在策略模式中,不同的算法被封装在具体的策略中,这些策略可以根据上下文的需要进行灵活替换,从而实现不同的功能。因此,策略模式具有高度的可扩展性和灵活性,并且可以有效地减少代码冗余。

例如,在订单系统中,可以使用策略模式来处理收费方式的问题。具体而言,可以定义一个ChargeStrategy接口,用于实现不同的收费算法。然后,定义多个具体的收费算法,分别实现ChargeStrategy接口。最后,在订单系统中,可以根据订单的不同情况,动态地设置不同的收费算法,以实现灵活的收费功能。

ChenSino原创大约 2 分钟设计模式
Chain of Responsibility Pattern

定义

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它可以将多个对象组合成一条链,并按照事先规定的顺序依次处理请求。每个对象都可以选择处理请求,或者将请求传递给链中的下一个对象。这种模式将请求的发送者和接收者解耦,使得多个对象都有机会处理请求,从而提高了系统的灵活性和可扩展性。

具体来说,责任链模式包含以下几个角色:

1. Handler:抽象处理者,它定义了用于处理请求的接口和链中下一个处理者的引用,通常包含一个处理请求的方法;

2. ConcreteHandler:具体处理者,它实现了Handler接口,根据具体业务逻辑处理请求,如果无法处理,则将请求传递给链中的下一个处理者;

3. Client:客户端,它向链中的第一个ConcreteHandler对象发起请求,然后等待链条响应请求。

责任链模式的优点在于它可以简化对象之间的耦合关系,增加系统的灵活性。它对系统进行解耦,使得请求发送者不必关心请求的具体处理者,发起请求后,请求会在链条中依次被多个对象处理。同时,责任链模式还可以方便地进行动态的链式调整,即在运行时往链中添加或删除具体处理者,以便满足实时的业务需求。

ChenSino原创大约 2 分钟设计模式