Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6b37454

Browse files
Update README.md
1 parent 8f0837d commit 6b37454

File tree

1 file changed

+137
-1
lines changed

1 file changed

+137
-1
lines changed

‎README.md‎

Lines changed: 137 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -920,7 +920,143 @@ public class AgeWorkersFilter : AdditionalFilteringCondition
920920
:x: __Недостатки__: в результате получается большое число мелких объектов, которые друг на друга похожи и отличаются способом взаимосвязи.
921921
___
922922
### Компоновщик
923-
__Компоновщик (Composite)__ -
923+
__Компоновщик (Composite)__ - это структурный паттерн проектирования, который используется, когда объекты должны быть реализованы в виде древовидной структуры и когда клиенты аналогично управляют как целыми объектами, так и составными частями.<br>
924+
> :white_check_mark: Реализуем данный паттерн на примере файловой системы.
925+
926+
:one: Создадим абстрактный класс компонента файловой системы, единственное поле у которого будет название компонента. Мы также можем добавлять в компонент другие компоненты и аналогично удалять их.<br>
927+
```C#
928+
/// <summary>
929+
/// Компонент файловой системы.
930+
/// </summary>
931+
public abstract class FileSystemComponent
932+
{
933+
/// <summary>
934+
/// Название.
935+
/// </summary>
936+
protected string _name;
937+
938+
/// <summary>
939+
/// Создание компонента файловой системы с помощью указанных параметров.
940+
/// </summary>
941+
/// <param name="name">Название компонента файловой системы.</param>
942+
public FileSystemComponent(string name)
943+
{
944+
Validator.ValidateStringText(name);
945+
946+
_name = name;
947+
}
948+
949+
/// <summary>
950+
/// Проверка корректности компонента.
951+
/// </summary>
952+
/// <param name="component">Компонент, который необходимо проверить.</param>
953+
/// <exception cref="ArgumentNullException">Компонент равен null!</exception>
954+
protected void ValidateComponent(FileSystemComponent component)
955+
{
956+
if (component == null)
957+
{
958+
throw new ArgumentNullException(nameof(component), "Компонент равен null!");
959+
}
960+
}
961+
962+
/// <summary>
963+
/// Добавление компонента.
964+
/// </summary>
965+
/// <param name="component">Компонент, который необходимо добавить.</param>
966+
public virtual void Add(FileSystemComponent component)
967+
{
968+
ValidateComponent(component);
969+
}
970+
971+
/// <summary>
972+
/// Добавление компонента.
973+
/// </summary>
974+
/// <param name="component">Компонент, который необходимо добавить.</param>
975+
public virtual void Remove(FileSystemComponent component)
976+
{
977+
ValidateComponent(component);
978+
}
979+
980+
/// <summary>
981+
/// Строковое преставление объекта компонента файловой системы.
982+
/// </summary>
983+
/// <returns>Данные объекта компонента файловой системы в виде строки.</returns>
984+
public override string ToString() => _name;
985+
}
986+
```
987+
:two: Создадим первый класс-наследник компонента файловой системы: файл. У файла не будут переопределены методы добавления и удаления - базовая реализация нас вполне устраивает, поскольку мы не может добавлять в файл другие файлы.
988+
```C#
989+
/// <summary>
990+
/// Файл.
991+
/// </summary>
992+
public class File : FileSystemComponent
993+
{
994+
/// <summary>
995+
/// Создание файла с помощью указанных параметров.
996+
/// </summary>
997+
/// <param name="name">Название файла.</param>
998+
public File(string name)
999+
: base(name)
1000+
{
1001+
}
1002+
}
1003+
```
1004+
:three: Добавим второй класс-наследник компонента файловой системы: папка. У папки будет список компонентов файловой системы, поскольку в папку мы уже можем добавить как другие файлы, так и другие папки. Также будут переопределены методы добавления и удаления компонентов файловой системы из директории.
1005+
```C#
1006+
/// <summary>
1007+
/// Папка.
1008+
/// </summary>
1009+
public class Directory : FileSystemComponent
1010+
{
1011+
/// <summary>
1012+
/// Список компонентов файловой системы, которые находятся в папке.
1013+
/// </summary>
1014+
private List<FileSystemComponent> _components = new List<FileSystemComponent>();
1015+
1016+
/// <summary>
1017+
/// Создает папку с помощью указанных параметров.
1018+
/// </summary>
1019+
/// <param name="name">Название папки.</param>
1020+
public Directory(string name)
1021+
: base(name)
1022+
{
1023+
}
1024+
1025+
/// <summary>
1026+
/// Добавление компонента.
1027+
/// </summary>
1028+
/// <param name="component">Компонент, который необходимо добавить.</param>
1029+
public override void Add(FileSystemComponent component)
1030+
{
1031+
ValidateComponent(component);
1032+
1033+
_components.Add(component);
1034+
}
1035+
1036+
/// <summary>
1037+
/// Добавление компонента.
1038+
/// </summary>
1039+
/// <param name="component">Компонент, который необходимо добавить.</param>
1040+
/// <exception cref="ArgumentNullException">Указанный компонент файловой системы отсутствует в директории!</exception>
1041+
public override void Remove(FileSystemComponent component)
1042+
{
1043+
ValidateComponent(component);
1044+
1045+
if (!_components.Contains(component))
1046+
{
1047+
throw new ArgumentNullException("Указанный компонент файловой системы отсутствует в директории!");
1048+
}
1049+
1050+
_components.Remove(component);
1051+
}
1052+
1053+
/// <summary>
1054+
/// Строковое преставление объекта компонента файловой системы.
1055+
/// </summary>
1056+
/// <returns>Данные объекта компонента файловой системы в виде строки.</returns>
1057+
public override string ToString() => $"{_name}: {string.Join("=>", _components)}{Environment.NewLine}";
1058+
}
1059+
```
9241060
## Поведенческие паттерны
9251061
__Поведенческие паттерны__ (Behavioral) описывают способы реализации взаимодействия между объектами с отличающимися типами. При таком взаимодействии объекты могут решать более трудные задачи, чем если бы они решали их по-отдельности.
9261062
___

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /