1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| interface Handler { setNext(handler: Handler): Handler;
handle(request: string): string; }
abstract class AbstractHandler implements Handler { private nextHandler: Handler;
public setNext(handler: Handler): Handler { this.nextHandler = handler; return handler; }
public handle(request: string): string { if (this.nextHandler) { return this.nextHandler.handle(request); }
return null; } }
class MonkeyHandler extends AbstractHandler { public handle(request: string): string { if (request === 'Banana') { return `Monkey: I'll eat the ${request}.`; } return super.handle(request);
} }
class SquirrelHandler extends AbstractHandler { public handle(request: string): string { if (request === 'Nut') { return `Squirrel: I'll eat the ${request}.`; } return super.handle(request); } }
class DogHandler extends AbstractHandler { public handle(request: string): string { if (request === 'MeatBall') { return `Dog: I'll eat the ${request}.`; } return super.handle(request); } }
const monkey = new MonkeyHandler(); const squirrel = new SquirrelHandler(); const dog = new DogHandler();
monkey.setNext(squirrel).setNext(dog);
clientCode(monkey); function clientCode(handler: Handler) { const foods = ['Nut', 'Banana', 'Cup of coffee'];
for (const food of foods) { console.log(`Client: Who wants a ${food}?`);
const result = handler.handle(food); if (result) { console.log(` ${result}`); } else { console.log(` ${food} was left untouched.`); } } }
|