1
0
Fork 0

实现访问者模式示例,添加形状、访问者及具体实现,增强代码可读性

This commit is contained in:
IvisTang 2026-01-07 20:24:46 +08:00
parent e5be1b62c2
commit a319494128
3 changed files with 228 additions and 0 deletions

80
go/visitor/main.go Normal file
View File

@ -0,0 +1,80 @@
package main
import "fmt"
/*
实例
汤宝宝坚信搭积木是人类的未来因此开办了一家积木厂
*/
// 抽象Node接口 Shape
type Shape interface {
Accept(visitor Visitor)
ClaimShape()
}
type Circle struct{}
func (c *Circle) Accept(visitor Visitor) {
visitor.VisitCircle(c)
}
func (c *Circle) ClaimShape() {
fmt.Println("I am a Circle")
}
type Square struct{}
func (s *Square) Accept(visitor Visitor) {
visitor.VisitSquare(s)
}
func (s *Square) ClaimShape() {
fmt.Println("I am a Square")
}
type Triangle struct{}
func (t *Triangle) Accept(visitor Visitor) {
visitor.VisitTriangle(t)
}
func (t *Triangle) ClaimShape() {
fmt.Println("I am a Triangle")
}
// 抽象NodeVisitor接口 Visitor
type Visitor interface {
VisitCircle(c *Circle)
VisitSquare(s *Square)
VisitTriangle(t *Triangle)
}
type ShapeVisitor struct{}
func (sv *ShapeVisitor) VisitCircle(c *Circle) {
fmt.Print("Visiting Circle: ")
c.ClaimShape()
}
func (sv *ShapeVisitor) VisitSquare(s *Square) {
fmt.Print("Visiting Square: ")
s.ClaimShape()
}
func (sv *ShapeVisitor) VisitTriangle(t *Triangle) {
fmt.Print("Visiting Triangle: ")
t.ClaimShape()
}
func main() {
fmt.Println("========== 访问者模式 ==========")
shapes := []Shape{&Circle{}, &Square{}, &Triangle{}}
visitor := &ShapeVisitor{}
for _, shape := range shapes {
shape.Accept(visitor)
}
fmt.Println()
fmt.Println("======== 访问者模式结束 ========")
}

81
python/visitor/main.py Normal file
View File

@ -0,0 +1,81 @@
"""
实例
汤宝宝坚信搭积木是人类的未来因此开办了一家积木厂
"""
from abc import ABC, abstractmethod
# 抽象Node接口 Shape
class Shape(ABC):
@abstractmethod
def accept(self, visitor: "Visitor"):
pass
@abstractmethod
def claim_shape(self):
pass
class Circle(Shape):
def accept(self, visitor):
visitor.visit_circle(self)
def claim_shape(self):
print("I am a Circle")
class Square(Shape):
def accept(self, visitor):
visitor.visit_square(self)
def claim_shape(self):
print("I am a Square")
class Triangle(Shape):
def accept(self, visitor):
visitor.visit_triangle(self)
def claim_shape(self):
print("I am a Triangle")
# 抽象Visitor接口
class Visitor(ABC):
@abstractmethod
def visit_circle(self, circle: Circle):
pass
@abstractmethod
def visit_square(self, square: Square):
pass
@abstractmethod
def visit_triangle(self, triangle: Triangle):
pass
# 具体Visitor实现
class ShapeVisitor(Visitor):
def visit_circle(self, circle: Circle):
print("Visiting Circle:", end=" ")
circle.claim_shape()
def visit_square(self, square: Square):
print("Visiting Square:", end=" ")
square.claim_shape()
def visit_triangle(self, triangle: Triangle):
print("Visiting Triangle:", end=" ")
triangle.claim_shape()
if __name__ == "__main__":
print("========== 访问者模式 ==========")
shapes = [Circle(), Square(), Triangle()]
visitor = ShapeVisitor()
for shape in shapes:
shape.accept(visitor)
print("\n======== 访问者模式结束 ========")

67
ts/src/visitor/index.ts Normal file
View File

@ -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======== 访问者模式结束 ========");
})();