typescript: Visitor Pattern

 

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/**
 *
 * Visitor Pattern  访问者是一种行为设计模式, 允许你在不修改已有代码的情况下向已有类层次结构中增加新的行为。
 * file: Visitorts.ts
 * The Component interface declares an `accept` method that should take the base
 * visitor interface as an argument.
 */
interface GeovinComponent {
 
 
    accept(visitor: Visitor):string ; //void
}
 
/**
 * Each Concrete Component must implement the `accept` method in such a way that
 * it calls the visitor's method corresponding to the component's class.
 */
class ConcreteComponentA implements GeovinComponent {
    /**
     * Note that we're calling `visitConcreteComponentA`, which matches the
     * current class name. This way we let the visitor know the class of the
     * component it works with.
     */
    public accept(visitor: Visitor): string { //void
       return visitor.visitConcreteComponentA(this);
    }
 
    /**
     * Concrete Components may have special methods that don't exist in their
     * base class or interface. The Visitor is still able to use these methods
     * since it's aware of the component's concrete class.
     */
    public exclusiveMethodOfConcreteComponentA(): string {
        return 'A';
    }
}
 
class ConcreteComponentB implements GeovinComponent {
    /**
     * Same here: visitConcreteComponentB => ConcreteComponentB
     */
    public accept(visitor: Visitor): string { //void
       return visitor.visitConcreteComponentB(this);
    }
    /**
     *
     * @returns
     */
    public specialMethodOfConcreteComponentB(): string {
        return 'B';
    }
}
 
/**
 * The Visitor Interface declares a set of visiting methods that correspond to
 * component classes. The signature of a visiting method allows the visitor to
 * identify the exact class of the component that it's dealing with.
 */
interface Visitor {
 
    /**
     *
     * @param element
     */
    visitConcreteComponentA(element: ConcreteComponentA): string; //void
 
    /**
     *
     * @param element
     */
    visitConcreteComponentB(element: ConcreteComponentB): string; //void
}
 
/**
 * Concrete Visitors implement several versions of the same algorithm, which can
 * work with all concrete component classes.
 *
 * You can experience the biggest benefit of the Visitor pattern when using it
 * with a complex object structure, such as a Composite tree. In this case, it
 * might be helpful to store some intermediate state of the algorithm while
 * executing visitor's methods over various objects of the structure.
 */
class ConcreteVisitor1 implements Visitor {
 
 
    public visitConcreteComponentA(element: ConcreteComponentA): string {//void
        console.log(`${element.exclusiveMethodOfConcreteComponentA()} + ConcreteVisitor1`);
        return element.exclusiveMethodOfConcreteComponentA()+ "+ConcreteVisitor1";
    }
 
    public visitConcreteComponentB(element: ConcreteComponentB): string {//void
        console.log(`${element.specialMethodOfConcreteComponentB()} + ConcreteVisitor1`);
        return element.specialMethodOfConcreteComponentB()+"+ConcreteVisitor1";
    }
}
 
/**
 *
 */
class ConcreteVisitor2 implements Visitor {
 
    public visitConcreteComponentA(element: ConcreteComponentA):string  {//void
        console.log(`${element.exclusiveMethodOfConcreteComponentA()} + ConcreteVisitor2`);
        return element.exclusiveMethodOfConcreteComponentA()+"+ ConcreteVisitor2";
    }
 
    public visitConcreteComponentB(element: ConcreteComponentB): string {//void
        console.log(`${element.specialMethodOfConcreteComponentB()} + ConcreteVisitor2`);
        return element.specialMethodOfConcreteComponentB()+"+ ConcreteVisitor2";
    }
}
 
/**
 * The client code can run visitor operations over any set of elements without
 * figuring out their concrete classes. The accept operation directs a call to
 * the appropriate operation in the visitor object.
 */
function clientCodeVisitor(components: GeovinComponent[], visitor: Visitor) {
    // ...
    let getstr=" ";
    for (const component of components) {
        getstr=getstr+component.accept(visitor)+" ";
 
       //visitor.visitConcreteComponentB(component);
       // visitor.visitConcreteComponentA(component);
    }
    return getstr;
    // ...
}
 
const components = [
    new ConcreteComponentA(),
    new ConcreteComponentB(),
];
 
 
let pubVisitor1="";
let pubVisitor2="";
let pubVisitor3="Geovin Du";
let pubVisitor4="geovindu";
 
console.log('The client code works with all visitors via the base Visitor interface:');
const visitor1 = new ConcreteVisitor1();
pubVisitor1=clientCodeVisitor(components, visitor1);
console.log('');
 
console.log('It allows the same client code to work with different types of visitors:');
const visitor2 = new ConcreteVisitor2();
pubVisitor2=clientCodeVisitor(components, visitor2);
 
let messageVisitor: string = 'Hello World,This is a typescript!,涂聚文 Geovin Du.Web';
document.body.innerHTML = messageVisitor+",<br/>one="+pubVisitor1+",<br/>two="+pubVisitor2+",<br/>three="+pubVisitor3+",<br/>four="+pubVisitor4+",<br/>TypeScript Strategy Pattern 策略模式"; 

 

调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <head><title>TypeScript Hello Visitor Pattern  访问者模式</title>
      <meta name="Description" content="geovindu,涂聚文,Geovin Du"/>
<meta name="Keywords" content="geovindu,涂聚文,Geovin Du"/>
<meta name="author" content="geovindu,涂聚文,Geovin Du"/>
    </head>
    <body>
        <script src="dist/Visitorts.js"></script>
    </body>
</html>

  

 

输出:

在管理员模式下打开 PowerShell 或 Windows 命令提示符,方法是右键单击并选择“以管理员身份运行”,输入 wsl --install 命令,然后重启计算机。
安装 VS Code 后,安装 rust-analyzer、CodeLLDB 扩展

cargo new --bin rusttest 在客户端命令行下创建项目rusttest
cd rusttest
cargo build
cargo run

https://www.jetbrains.com/zh-cn/rust/nextversion/
https://doc.rust-lang.org/rust-by-example/mod/split.html

 

vscode:

 

 

RustRover 233.8264.22

 

 

 

 

posted @   ®Geovin Du Dream Park™  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
历史上的今天:
2022-10-13 CSharp: null object pattern in donet core 3
2011-10-13 Csharp windowform datagridview Clipboard TO EXCEL OR FROM EXCEL DATA 保存datagridview所有數據
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示