130 lines
2.9 KiB
C#
130 lines
2.9 KiB
C#
|
/* Компоновщик
|
|||
|
Компонует объекты в древовидную структуру по принципу "часть-целое",
|
|||
|
представляя их в виде иерархии. Позволяет
|
|||
|
клиенту одинаково обращаться как к отдельному,
|
|||
|
так и к целому поддереву
|
|||
|
*/
|
|||
|
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");
|
|||
|
}
|
|||
|
}
|