Skip to content

Commit 784e8d7

Browse files
feat: add realization composite
1 parent aef0ab1 commit 784e8d7

File tree

11 files changed

+538
-2
lines changed

11 files changed

+538
-2
lines changed

Patterns.sln

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,19 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PrototypeDemo", "Patterns\C
105105
EndProject
106106
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FactoryMethod", "FactoryMethod", "{F81D800C-44CD-459D-9437-35C646D9DD9F}"
107107
EndProject
108-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FactoryMethodDemo", "Patterns\Creational\FactoryMethod\FactoryMethodDemo\FactoryMethodDemo.csproj", "{39E209BC-280B-422C-B23C-C6E509C82DEB}"
108+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FactoryMethodDemo", "Patterns\Creational\FactoryMethod\FactoryMethodDemo\FactoryMethodDemo.csproj", "{39E209BC-280B-422C-B23C-C6E509C82DEB}"
109109
EndProject
110110
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FactoryMethodLib", "Patterns\Creational\FactoryMethod\FactoryMethodLib\FactoryMethodLib.csproj", "{F3DA4607-F93E-4277-9B86-B7D0D1F6F495}"
111111
EndProject
112-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FactoryMethodTests", "Patterns\Creational\FactoryMethod\FactoryMethodTests\FactoryMethodTests.csproj", "{D008051C-87BD-48D1-A0CC-B60B72FC4E62}"
112+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FactoryMethodTests", "Patterns\Creational\FactoryMethod\FactoryMethodTests\FactoryMethodTests.csproj", "{D008051C-87BD-48D1-A0CC-B60B72FC4E62}"
113+
EndProject
114+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Composite", "Composite", "{D56AD86F-A61C-4755-9639-EE901ED87F83}"
115+
EndProject
116+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CompositeTests", "Patterns\Structural\Composite\CompositeTests\CompositeTests.csproj", "{506CFD15-8F40-446D-8673-DF8B7D03FDEE}"
117+
EndProject
118+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CompositeLib", "Patterns\Structural\Composite\CompositeLib\CompositeLib.csproj", "{96776540-027B-4371-82DE-A09644AD477D}"
119+
EndProject
120+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CompositeDemo", "Patterns\Structural\Composite\CompositeDemo\CompositeDemo.csproj", "{279B8234-6091-4365-95F5-0EF998116722}"
113121
EndProject
114122
Global
115123
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -265,6 +273,18 @@ Global
265273
{D008051C-87BD-48D1-A0CC-B60B72FC4E62}.Debug|Any CPU.Build.0 = Debug|Any CPU
266274
{D008051C-87BD-48D1-A0CC-B60B72FC4E62}.Release|Any CPU.ActiveCfg = Release|Any CPU
267275
{D008051C-87BD-48D1-A0CC-B60B72FC4E62}.Release|Any CPU.Build.0 = Release|Any CPU
276+
{506CFD15-8F40-446D-8673-DF8B7D03FDEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
277+
{506CFD15-8F40-446D-8673-DF8B7D03FDEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
278+
{506CFD15-8F40-446D-8673-DF8B7D03FDEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
279+
{506CFD15-8F40-446D-8673-DF8B7D03FDEE}.Release|Any CPU.Build.0 = Release|Any CPU
280+
{96776540-027B-4371-82DE-A09644AD477D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
281+
{96776540-027B-4371-82DE-A09644AD477D}.Debug|Any CPU.Build.0 = Debug|Any CPU
282+
{96776540-027B-4371-82DE-A09644AD477D}.Release|Any CPU.ActiveCfg = Release|Any CPU
283+
{96776540-027B-4371-82DE-A09644AD477D}.Release|Any CPU.Build.0 = Release|Any CPU
284+
{279B8234-6091-4365-95F5-0EF998116722}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
285+
{279B8234-6091-4365-95F5-0EF998116722}.Debug|Any CPU.Build.0 = Debug|Any CPU
286+
{279B8234-6091-4365-95F5-0EF998116722}.Release|Any CPU.ActiveCfg = Release|Any CPU
287+
{279B8234-6091-4365-95F5-0EF998116722}.Release|Any CPU.Build.0 = Release|Any CPU
268288
EndGlobalSection
269289
GlobalSection(SolutionProperties) = preSolution
270290
HideSolutionNode = FALSE
@@ -322,6 +342,10 @@ Global
322342
{39E209BC-280B-422C-B23C-C6E509C82DEB} = {F81D800C-44CD-459D-9437-35C646D9DD9F}
323343
{F3DA4607-F93E-4277-9B86-B7D0D1F6F495} = {F81D800C-44CD-459D-9437-35C646D9DD9F}
324344
{D008051C-87BD-48D1-A0CC-B60B72FC4E62} = {F81D800C-44CD-459D-9437-35C646D9DD9F}
345+
{D56AD86F-A61C-4755-9639-EE901ED87F83} = {C3BD1EE4-74BB-41FF-9E59-0643799308E6}
346+
{506CFD15-8F40-446D-8673-DF8B7D03FDEE} = {D56AD86F-A61C-4755-9639-EE901ED87F83}
347+
{96776540-027B-4371-82DE-A09644AD477D} = {D56AD86F-A61C-4755-9639-EE901ED87F83}
348+
{279B8234-6091-4365-95F5-0EF998116722} = {D56AD86F-A61C-4755-9639-EE901ED87F83}
325349
EndGlobalSection
326350
GlobalSection(ExtensibilityGlobals) = postSolution
327351
SolutionGuid = {8D3D92F7-766D-48BD-A87B-A70F3A2CE390}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net6.0</TargetFramework>
6+
<ImplicitUsings>enable</ImplicitUsings>
7+
<Nullable>enable</Nullable>
8+
</PropertyGroup>
9+
10+
<ItemGroup>
11+
<ProjectReference Include="..\CompositeLib\CompositeLib.csproj" />
12+
</ItemGroup>
13+
14+
</Project>
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
namespace Patterns
2+
{
3+
class Program
4+
{
5+
#region Методы.
6+
/// <summary>
7+
/// Точка входа в программу.
8+
/// </summary>
9+
/// <param name="args">Набор аргументов.</param>
10+
private static void Main(string[] args)
11+
{
12+
RunDemo();
13+
}
14+
15+
/// <summary>
16+
/// Выполнение основного функционала.
17+
/// </summary>
18+
private static void RunDemo()
19+
{
20+
var courseCount = 5;
21+
var directory = new Directory("Институт");
22+
23+
var coursesSubjects = new Dictionary<int, List<FileSystemComponent>>
24+
{
25+
{
26+
1, new List<FileSystemComponent>
27+
{
28+
new File("Дискретная математика"),
29+
new File("Языки программирования"),
30+
new File("Физическая культура")
31+
}
32+
},
33+
{
34+
2, new List<FileSystemComponent>
35+
{
36+
new File("Иностранный язык"),
37+
new File("Информатика"),
38+
new File("Алгебра и геометрия")
39+
}
40+
},
41+
{
42+
3, new List<FileSystemComponent>
43+
{
44+
new File("Математический анализ"),
45+
new File("Физика"),
46+
new File("История")
47+
}
48+
},
49+
{
50+
4, new List<FileSystemComponent>
51+
{
52+
new File("Алгоритмы и структуры данных"),
53+
new File("Прикладное программирование"),
54+
new File("Теория графов и ее приложения")
55+
}
56+
},
57+
{
58+
5, new List<FileSystemComponent>
59+
{
60+
new File("Вычислительная математика"),
61+
new File("Низкоуровневое программирование"),
62+
new File("Алгебраические структуры и теория чисел")
63+
}
64+
},
65+
};
66+
67+
for (var i = 1; i <= courseCount; i++)
68+
{
69+
var course = new Directory($"{i} курс");
70+
71+
foreach (var subject in coursesSubjects[i])
72+
{
73+
course.Add(subject);
74+
}
75+
76+
directory.Add(course);
77+
}
78+
79+
Console.WriteLine(directory);
80+
}
81+
#endregion
82+
}
83+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
4+
<PropertyGroup>
5+
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
6+
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
7+
<ProjectGuid>{96776540-027B-4371-82DE-A09644AD477D}</ProjectGuid>
8+
<OutputType>Library</OutputType>
9+
<AppDesignerFolder>Properties</AppDesignerFolder>
10+
<RootNamespace>CompositeLib</RootNamespace>
11+
<AssemblyName>CompositeLib</AssemblyName>
12+
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
13+
<FileAlignment>512</FileAlignment>
14+
<Deterministic>true</Deterministic>
15+
</PropertyGroup>
16+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
17+
<DebugSymbols>true</DebugSymbols>
18+
<DebugType>full</DebugType>
19+
<Optimize>false</Optimize>
20+
<OutputPath>bin\Debug\</OutputPath>
21+
<DefineConstants>DEBUG;TRACE</DefineConstants>
22+
<ErrorReport>prompt</ErrorReport>
23+
<WarningLevel>4</WarningLevel>
24+
</PropertyGroup>
25+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
26+
<DebugType>pdbonly</DebugType>
27+
<Optimize>true</Optimize>
28+
<OutputPath>bin\Release\</OutputPath>
29+
<DefineConstants>TRACE</DefineConstants>
30+
<ErrorReport>prompt</ErrorReport>
31+
<WarningLevel>4</WarningLevel>
32+
</PropertyGroup>
33+
<ItemGroup>
34+
<Reference Include="System" />
35+
<Reference Include="System.Core" />
36+
<Reference Include="System.Xml.Linq" />
37+
<Reference Include="System.Data.DataSetExtensions" />
38+
<Reference Include="Microsoft.CSharp" />
39+
<Reference Include="System.Data" />
40+
<Reference Include="System.Net.Http" />
41+
<Reference Include="System.Xml" />
42+
</ItemGroup>
43+
<ItemGroup>
44+
<Compile Include="Directory.cs" />
45+
<Compile Include="File.cs" />
46+
<Compile Include="FileSystemComponent.cs" />
47+
<Compile Include="Properties\AssemblyInfo.cs" />
48+
</ItemGroup>
49+
<ItemGroup>
50+
<ProjectReference Include="..\..\..\..\Validator\Validator.csproj">
51+
<Project>{177c3649-0711-43ac-b95d-6b670ea9479e}</Project>
52+
<Name>Validator</Name>
53+
</ProjectReference>
54+
</ItemGroup>
55+
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
56+
</Project>
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace Patterns
5+
{
6+
/// <summary>
7+
/// Папка.
8+
/// </summary>
9+
public class Directory : FileSystemComponent
10+
{
11+
#region Поля.
12+
/// <summary>
13+
/// Список компонентов файловой системы, которые находятся в папке.
14+
/// </summary>
15+
private List<FileSystemComponent> _components = new List<FileSystemComponent>();
16+
#endregion
17+
18+
#region Конструкторы.
19+
/// <summary>
20+
/// Создает папку с помощью указанных параметров.
21+
/// </summary>
22+
/// <param name="name">Название папки.</param>
23+
public Directory(string name)
24+
: base(name)
25+
{
26+
}
27+
#endregion
28+
29+
#region Методы.
30+
/// <summary>
31+
/// Добавление компонента.
32+
/// </summary>
33+
/// <param name="component">Компонент, который необходимо добавить.</param>
34+
public override void Add(FileSystemComponent component)
35+
{
36+
ValidateComponent(component);
37+
38+
_components.Add(component);
39+
}
40+
41+
/// <summary>
42+
/// Добавление компонента.
43+
/// </summary>
44+
/// <param name="component">Компонент, который необходимо добавить.</param>
45+
/// <exception cref="ArgumentNullException">Указанный компонент файловой системы отсутствует в директории!</exception>
46+
public override void Remove(FileSystemComponent component)
47+
{
48+
ValidateComponent(component);
49+
50+
if (!_components.Contains(component))
51+
{
52+
throw new ArgumentNullException("Указанный компонент файловой системы отсутствует в директории!");
53+
}
54+
55+
_components.Remove(component);
56+
}
57+
58+
/// <summary>
59+
/// Строковое преставление объекта компонента файловой системы.
60+
/// </summary>
61+
/// <returns>Данные объекта компонента файловой системы в виде строки.</returns>
62+
public override string ToString() => $"{_name}: {string.Join("=>", _components)}{Environment.NewLine}";
63+
#endregion
64+
}
65+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
namespace Patterns
2+
{
3+
/// <summary>
4+
/// Файл.
5+
/// </summary>
6+
public class File : FileSystemComponent
7+
{
8+
#region Конструкторы.
9+
/// <summary>
10+
/// Создание файла с помощью указанных параметров.
11+
/// </summary>
12+
/// <param name="name">Название файла.</param>
13+
public File(string name)
14+
: base(name)
15+
{
16+
}
17+
#endregion
18+
}
19+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using System;
2+
3+
namespace Patterns
4+
{
5+
/// <summary>
6+
/// Компонент файловой системы.
7+
/// </summary>
8+
public abstract class FileSystemComponent
9+
{
10+
#region Поля.
11+
/// <summary>
12+
/// Название.
13+
/// </summary>
14+
protected string _name;
15+
#endregion
16+
17+
#region Конструкторы.
18+
/// <summary>
19+
/// Создание компонента файловой системы с помощью указанных параметров.
20+
/// </summary>
21+
/// <param name="name">Название компонента файловой системы.</param>
22+
public FileSystemComponent(string name)
23+
{
24+
Validator.ValidateStringText(name);
25+
26+
_name = name;
27+
}
28+
#endregion
29+
30+
#region Методы.
31+
32+
#region Валидация.
33+
/// <summary>
34+
/// Проверка корректности компонента.
35+
/// </summary>
36+
/// <param name="component">Компонент, который необходимо проверить.</param>
37+
/// <exception cref="ArgumentNullException">Компонент равен null!</exception>
38+
protected void ValidateComponent(FileSystemComponent component)
39+
{
40+
if (component == null)
41+
{
42+
throw new ArgumentNullException(nameof(component), "Компонент равен null!");
43+
}
44+
}
45+
#endregion
46+
47+
/// <summary>
48+
/// Добавление компонента.
49+
/// </summary>
50+
/// <param name="component">Компонент, который необходимо добавить.</param>
51+
public virtual void Add(FileSystemComponent component)
52+
{
53+
ValidateComponent(component);
54+
}
55+
56+
/// <summary>
57+
/// Добавление компонента.
58+
/// </summary>
59+
/// <param name="component">Компонент, который необходимо добавить.</param>
60+
public virtual void Remove(FileSystemComponent component)
61+
{
62+
ValidateComponent(component);
63+
}
64+
65+
/// <summary>
66+
/// Строковое преставление объекта компонента файловой системы.
67+
/// </summary>
68+
/// <returns>Данные объекта компонента файловой системы в виде строки.</returns>
69+
public override string ToString() => _name;
70+
#endregion
71+
}
72+
}

0 commit comments

Comments
 (0)