实现访问者模式示例,添加形状、访问者及具体实现,增强代码可读性
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
实例:
|
||||
汤宝宝坚信搭积木是人类的未来,因此开办了一家积木厂。
|
||||
*/
|
||||
|
||||
// 抽象Node接口 Shape
|
||||
interface Shape {
|
||||
accept(visitor: Visitor): void;
|
||||
claimShape(): string;
|
||||
}
|
||||
|
||||
class Circle implements Shape {
|
||||
accept(visitor: Visitor): void {
|
||||
visitor.visitCircle(this);
|
||||
}
|
||||
claimShape(): string {
|
||||
return "I am a Circle";
|
||||
}
|
||||
}
|
||||
|
||||
class Square implements Shape {
|
||||
accept(visitor: Visitor): void {
|
||||
visitor.visitSquare(this);
|
||||
}
|
||||
claimShape(): string {
|
||||
return "I am a Square";
|
||||
}
|
||||
}
|
||||
|
||||
class Triangle implements Shape {
|
||||
accept(visitor: Visitor): void {
|
||||
visitor.visitTriangle(this);
|
||||
}
|
||||
claimShape(): string {
|
||||
return "I am a Triangle";
|
||||
}
|
||||
}
|
||||
|
||||
// 抽象Visitor接口
|
||||
interface Visitor {
|
||||
visitCircle(circle: Circle): void;
|
||||
visitSquare(square: Square): void;
|
||||
visitTriangle(triangle: Triangle): void;
|
||||
}
|
||||
|
||||
class ShapeVisitor implements Visitor {
|
||||
visitCircle(circle: Circle): void {
|
||||
console.log("Visiting Circle: ", circle.claimShape());
|
||||
}
|
||||
visitSquare(square: Square): void {
|
||||
console.log("Visiting Square: ", square.claimShape());
|
||||
}
|
||||
visitTriangle(triangle: Triangle): void {
|
||||
console.log("Visiting Triangle: ", triangle.claimShape());
|
||||
}
|
||||
}
|
||||
|
||||
(function () {
|
||||
console.log("========== 访问者模式 ==========");
|
||||
const shapes: Shape[] = [new Circle(), new Square(), new Triangle()];
|
||||
const visitor: Visitor = new ShapeVisitor();
|
||||
|
||||
shapes.forEach((shape) => {
|
||||
shape.accept(visitor);
|
||||
});
|
||||
console.log("\n======== 访问者模式结束 ========");
|
||||
})();
|
||||
Reference in New Issue
Block a user