行为型设计模式是一种设计模式,它关注对象的行为和职责分配。本文将从多个方面详细阐述行为型设计模式:
一、策略模式
策略模式定义了一组算法,将每个算法分别封装起来,使它们可以互相替换。策略模式使算法可以独立于使用它们的客户端而变化。
策略模式包含以下角色:
- 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
微信扫一扫
支付宝扫一扫