行为型设计模式详解

行为型设计模式是一种设计模式,它关注对象的行为和职责分配。本文将从多个方面详细阐述行为型设计模式:

一、策略模式

策略模式定义了一组算法,将每个算法分别封装起来,使它们可以互相替换。策略模式使算法可以独立于使用它们的客户端而变化。

策略模式包含以下角色:

  • Context:上下文类,负责维护一个对策略对象的引用。
  • Strategy:策略接口,定义了所有支持的算法的公共接口。
  • ConcreteStrategy:具体策略类,实现了Strategy接口,提供了具体算法的实现。

下面是简单的策略模式示例代码:

interface Strategy {
  execute(): void;
}

class ConcreteStrategyA implements Strategy {
  public execute(): void {
    console.log("Executing strategy A");
  }
}

class ConcreteStrategyB implements Strategy {
  public execute(): void {
    console.log("Executing strategy B");
  }
}

class Context {
  private strategy: Strategy;

  constructor(strategy: Strategy) {
    this.strategy = strategy;
  }

  public setStrategy(strategy: Strategy): void {
    this.strategy = strategy;
  }

  public executeStrategy(): void {
    this.strategy.execute();
  }
}

const context = new Context(new ConcreteStrategyA());
context.executeStrategy(); // 输出 "Executing strategy A"
context.setStrategy(new ConcreteStrategyB());
context.executeStrategy(); // 输出 "Executing strategy B"

二、观察者模式

观察者模式定义了一种一对多的依赖关系,当一个对象状态发生改变时,它的所有依赖者都会收到通知。观察者模式将观察者和主题分离,使它们可以独立地改变和复用。

观察者模式包含以下角色:

  • Subject:主题接口,定义了观察者通知机制。
  • ConcreteSubject:具体主题类,维护一个观察者列表,提供了添加、删除和通知观察者的方法。
  • Observer:观察者接口,定义了更新接口。
  • ConcreteObserver:具体观察者类,实现了更新接口。

下面是简单的观察者模式示例代码:

interface Subject {
  attach(observer: Observer): void;
  detach(observer: Observer): void;
  notify(): void;
}

class ConcreteSubject implements Subject {
  private observers: Observer[] = [];
  private state: number;

  public getState(): number {
    return this.state;
  }

  public setState(state: number): void {
    this.state = state;
    this.notify();
  }

  public attach(observer: Observer): void {
    this.observers.push(observer);
  }

  public detach(observer: Observer): void {
    const index = this.observers.indexOf(observer);
    if (index !== -1) {
      this.observers.splice(index, 1);
    }
  }

  public notify(): void {
    for (const observer of this.observers) {
      observer.update();
    }
  }
}

interface Observer {
  update(): void;
}

class ConcreteObserverA implements Observer {
  private subject: ConcreteSubject;

  constructor(subject: ConcreteSubject) {
    this.subject = subject;
    this.subject.attach(this);
  }

  public update(): void {
    console.log(`Observer A: ${this.subject.getState()}`);
  }
}

class ConcreteObserverB implements Observer {
  private subject: ConcreteSubject;

  constructor(subject: ConcreteSubject) {
    this.subject = subject;
    this.subject.attach(this);
  }

  public update(): void {
    console.log(`Observer B: ${this.subject.getState()}`);
  }
}

const subject = new ConcreteSubject();
const observerA = new ConcreteObserverA(subject);
const observerB = new ConcreteObserverB(subject);
subject.setState(1); // 输出 "Observer A: 1" 和 "Observer B: 1"
subject.setState(2); // 输出 "Observer A: 2" 和 "Observer B: 2"
subject.detach(observerA);
subject.setState(3); // 输出 "Observer B: 3"

三、责任链模式

责任链模式将请求的发送者和接收者解耦,使多个对象都有机会处理该请求。该模式将这些对象串成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

责任链模式包含以下角色:

  • Handler:处理器接口,定义了处理请求的方法和设置下一个处理器的方法。
  • ConcreteHandler:具体处理器类,实现了处理请求的方法。
  • Client:客户端类,负责创建责任链并将请求发送给它的第一个处理器。

下面是简单的责任链模式示例代码:

abstract class Handler {
  protected successor: Handler;

  public setSuccessor(successor: Handler): void {
    this.successor = successor;
  }

  public abstract handleRequest(request: number): void;
}

class ConcreteHandler1 extends Handler {
  public handleRequest(request: number): void {
    if (request >= 0 && request = 10 && request = 20 && request < 30) {
      console.log(`${this.constructor.name} handled request ${request}`);
    } else if (this.successor) {
      this.successor.handleRequest(request);
    }
  }
}

const handler1 = new ConcreteHandler1();
const handler2 = new ConcreteHandler2();
const handler3 = new ConcreteHandler3();
handler1.setSuccessor(handler2);
handler2.setSuccessor(handler3);

handler1.handleRequest(5); // 输出 "ConcreteHandler1 handled request 5"
handler1.handleRequest(15); // 输出 "ConcreteHandler2 handled request 15"
handler1.handleRequest(25); // 输出 "ConcreteHandler3 handled request 25"
handler1.handleRequest(35); // 什么都不输出

四、命令模式

命令模式将请求封装成一个对象,使得可以使用不同的请求、队列或日志来参数化其他对象。命令模式可以支持撤销操作。

命令模式包含以下角色:

  • Command:命令接口,定义了执行和撤销命令的方法。
  • ConcreteCommand:具体命令类,实现了命令接口,保存了一个执行者对象。
  • Receiver:执行者接口,定义了各种命令的执行方法。
  • ConcreteReceiver:具体执行者类,实现了执行者接口,提供了命令的实际执行代码。
  • Invoker:调用者类,保存了一组命令,可以按顺序执行它们。

下面是简单的命令模式示例代码:

interface Command {
  execute(): void;
  undo(): void;
}

class ConcreteCommandA implements Command {
  private receiver: ReceiverA;

  constructor(receiver: ReceiverA) {
    this.receiver = receiver;
  }

  public execute(): void {
    this.receiver.actionA();
  }

  public undo(): void {
    this.receiver.undoActionA();
  }
}

class ConcreteCommandB implements Command {
  private receiver: ReceiverB;

  constructor(receiver: ReceiverB) {
    this.receiver = receiver;
  }

  public execute(): void {
    this.receiver.actionB();
  }

  public undo(): void {
    this.receiver.undoActionB();
  }
}

interface ReceiverA {
  actionA(): void;
  undoActionA(): void;
}

class ConcreteReceiverA implements ReceiverA {
  private state: string;

  public actionA(): void {
    console.log("ConcreteReceiverA doing actionA");
    this.state = "actionA";
  }

  public undoActionA(): void {
    console.log(`ConcreteReceiverA undoing ${this.state}`);
  }
}

interface ReceiverB {
  actionB(): void;
  undoActionB(): void;
}

class ConcreteReceiverB implements ReceiverB {
  private state: string;

  public actionB(): void {
    console.log("ConcreteReceiverB doing actionB");
    this.state = "actionB";
  }

  public undoActionB(): void {
    console.log(`ConcreteReceiverB undoing ${this.state}`);
  }
}

class Invoker {
  private commands: Command[] = [];

  public addCommand(command: Command): void {
    this.commands.push(command);
  }

  public executeCommands(): void {
    for (const command of this.commands) {
      command.execute();
    }
  }

  public undoCommands(): void {
    for (const command of this.commands.reverse()) {
      command.undo();
    }
  }
}

const receiverA = new ConcreteReceiverA();
const receiverB = new ConcreteReceiverB();
const commandA = new ConcreteCommandA(receiverA);
const commandB = new ConcreteCommandB(receiverB);
const invoker = new Invoker();
invoker.addCommand(commandA);
invoker.addCommand(commandB);
invoker.executeCommands(); // 输出 "ConcreteReceiverA doing actionA" 和 "ConcreteReceiverB doing actionB"
invoker.undoCommands(); // 输出 "ConcreteReceiverB undoing actionB" 和 "ConcreteReceiverA undoing actionA"

原创文章,作者:GVNMG,如若转载,请注明出处:https://www.506064.com/n/370627.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
GVNMGGVNMG
上一篇 2025-04-22 01:14
下一篇 2025-04-22 01:14

相关推荐

  • 如何使用Python删除某一列连续多行为空的数据?

    Python是一种强大的编程语言,有着广泛的应用领域,特别是在数据处理方面。本文将介绍如何利用Python删除某一列连续多行为空的数据。 一、什么是连续多行为空的数据? 在数据处理…

    编程 2025-04-28
  • 手机安全模式怎么解除?

    安全模式是一种手机自身的保护模式,它会禁用第三方应用程序并使用仅限基本系统功能。但有时候,安全模式会使你无法使用手机上的一些重要功能。如果你想解除手机安全模式,可以尝试以下方法: …

    编程 2025-04-28
  • Qt State Machine与状态机模式

    本文将介绍Qt State Machine和状态机模式在Qt中的实现。Qt提供了QStateMachine和QState两个类,可以方便地实现状态机模式,并且能有效地处理复杂的、多…

    编程 2025-04-27
  • 显示C++设计模式

    本文将详细介绍显示C++设计模式的概念、类型、优点和代码实现。 一、概念 C++设计模式是在软件设计阶段定义,用于处理常见问题的可重用解决方案。这些解决方案是经过测试和验证的,并已…

    编程 2025-04-27
  • Centos7进入单用户模式的解释

    本文将介绍如何在Centos7中进入单用户模式,并从以下几个方面进行详细的阐述。 一、Centos7进入单用户模式的解答 在Centos7中进入单用户模式需要执行以下步骤: 1. …

    编程 2025-04-27
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25

发表回复

登录后才能评论