-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
137 lines (118 loc) · 3.1 KB
/
Program.cs
File metadata and controls
137 lines (118 loc) · 3.1 KB
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
/*
* Author: Nikolay Dvurechensky
* Site: https://dvurechensky.pro/
* Gmail: dvurechenskysoft@gmail.com
* Last Updated: 27 апреля 2026 09:40:39
* Version: 1.0.254
*/
/* Компоновщик
Компонует объекты в древовидную структуру по принципу "часть-целое",
представляя их в виде иерархии. Позволяет
клиенту одинаково обращаться как к отдельному,
так и к целому поддереву
*/
class Program
{
static void Main()
{
#region Пример №1 - базовое
var paths = new Paths(new Dictionary<int, Directory>());
paths.components.Add(1, new Directory("C"));
paths.components[1].Add(new Folder("SYSTEM"));
paths.components[1].Add(new Folder("DATA"));
paths.components[1].Add(new File("test.txt"));
paths.components.Add(0, new Directory("F"));
paths.components[0].Add(new File("resize.cs"));
paths.Print();
Console.ReadKey();
#endregion
}
}
/// <summary>
/// Абстракция компонента файловой системы (дерева) - пути до файла
/// </summary>
abstract class Component
{
protected string name;
public Component(string name)
{
this.name = name;
}
public virtual void Add(Component component) { }
public abstract void Remove(Component component);
public abstract void Print();
}
class Paths : Component
{
public Dictionary<int,Directory> components;
public Paths(Dictionary<int, Directory> components) : base ("")
{
this.components = components;
}
public override void Print()
{
foreach (var component in components)
{
component.Value.Print();
Console.WriteLine();
}
}
public override void Remove(Component component)
{
Console.WriteLine("Delete Path" + this.name);
}
}
class Directory : Component
{
public List<Component> components = new();
public Directory(string name)
: base(name)
{
}
public override void Add(Component component)
{
components.Add(component);
}
public override void Print()
{
Console.Write(this.name + ":");
foreach (var component in components)
{
component.Print();
}
}
public override void Remove(Component component)
{
component.Remove(component);
}
}
class Folder : Component
{
public Folder(string name)
: base(name)
{
}
public override void Print()
{
Console.Write("\\" + this.name);
}
public override void Remove(Component component)
{
Console.WriteLine(this.name + " Delete");
}
}
class File : Component
{
public File(string name)
: base(name)
{
}
public override void Print()
{
Console.Write("\\" + this.name);
}
public override void Remove(Component component)
{
Console.WriteLine(this.name + " Delete");
}
}