-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path访问者模式.cs
136 lines (120 loc) · 3.6 KB
/
访问者模式.cs
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
using System;
using System.Collections.Generic;
using Xunit;
namespace DesignMode
{
/// <summary>
/// 表示一个作用于某对象结构中的各元素的操作.
/// 它可以使你在不改变元素的类的前提下定义作用于这些元素的新操作.
/// </summary>
public class 访问者模式
{
[Fact]
public void Test()
{
ObjectStrucuter strucuter = new ObjectStrucuter();
strucuter.Add(new Man());
strucuter.Add(new Woman());
//成功时的反应
Success v1 = new Success();
strucuter.Display(v1);
////失败的反应
//Failing v2 = new Failing();
//strucuter.Display(v2);
}
/// <summary>
/// 对象结构类,需要男人和女人不同状态的对比,针对不同的状态遍历得到不同的反应
/// </summary>
public class ObjectStrucuter
{
private List<Person> elements = new List<Person>();
/// <summary>
/// 增加
/// </summary>
/// <param name="element"></param>
public void Add(Person element)
{
elements.Add(element);
}
/// <summary>
/// 移除
/// </summary>
/// <param name="element"></param>
public void Remove(Person element)
{
elements.Remove(element);
}
/// <summary>
/// 查看显示
/// </summary>
/// <param name="element"></param>
public void Display(Visitor visitor)
{
foreach (var e in elements)
{
e.Accept(visitor);
}
}
}
/// <summary>
/// 状态的抽象类,重点在状态里男人和女人是固定的,否自访问者模式不适用
/// </summary>
public abstract class Visitor
{
/// <summary>
/// 得到男人的反应
/// </summary>
public abstract void GetManConclusion(Man person);
/// <summary>
/// 得到女人的反应
/// </summary>
public abstract void GetWomanConclusion(Woman person);
}
/// <summary>
/// 成功状态
/// </summary>
public class Success : Visitor
{
public override void GetManConclusion(Man person)
{
Console.WriteLine("成功时男人的反应");
}
public override void GetWomanConclusion(Woman person)
{
Console.WriteLine("成功时女人的反应");
}
}
///// <summary>
///// 失败状态:同成功状态
///// </summary>
//public class Failing : Visitor { }
/// <summary>
/// 人的抽象类
/// </summary>
public abstract class Person
{
//接受
public abstract void Accept(Visitor visitor);
}
/// <summary>
/// 男人
/// </summary>
public class Man : Person
{
public override void Accept(Visitor visitor)
{
visitor.GetManConclusion(this);
}
}
/// <summary>
/// 女人
/// </summary>
public class Woman : Person
{
public override void Accept(Visitor visitor)
{
visitor.GetWomanConclusion(this);
}
}
}
}