行為型設計模式詳解

行為型設計模式是一種設計模式,它關注對象的行為和職責分配。本文將從多個方面詳細闡述行為型設計模式:

一、策略模式

策略模式定義了一組算法,將每個算法分別封裝起來,使它們可以互相替換。策略模式使算法可以獨立於使用它們的客戶端而變化。

策略模式包含以下角色:

  • 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/zh-hk/n/370627.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
GVNMG的頭像GVNMG
上一篇 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

發表回復

登錄後才能評論