166 lines
4.3 KiB
C#
166 lines
4.3 KiB
C#
|
/*
|
|||
|
* СТРУКТУРНЫЕ ПАТТЕРНЫ
|
|||
|
*
|
|||
|
* Глава_15: Компоновщик (Composite)
|
|||
|
*
|
|||
|
* - компонует объекты в древовидные структуры для представления
|
|||
|
* иерархий «часть — целое». Позволяет клиентам единообразно
|
|||
|
* трактовать индивидуальные и составные объекты
|
|||
|
*/
|
|||
|
|
|||
|
class UIElement
|
|||
|
{
|
|||
|
public UIElement(string name)
|
|||
|
{
|
|||
|
Children = new List<UIElement>();
|
|||
|
}
|
|||
|
public List<UIElement> Children { get; set; }
|
|||
|
public string Name { get; set; }
|
|||
|
public int Width { get; set; }
|
|||
|
public int Height { get; set; }
|
|||
|
protected virtual string Draw(string p = "") { return p; }
|
|||
|
public override string ToString() => $"{Draw()}";
|
|||
|
}
|
|||
|
|
|||
|
class TextBox : UIElement
|
|||
|
{
|
|||
|
public TextBox(string name = "textBox") : base(name) { }
|
|||
|
}
|
|||
|
|
|||
|
class Label : UIElement
|
|||
|
{
|
|||
|
public Label(string name = "label") : base(name) { }
|
|||
|
}
|
|||
|
|
|||
|
class Panel : UIElement
|
|||
|
{
|
|||
|
public Panel(string name = "panel") : base(name) { }
|
|||
|
}
|
|||
|
|
|||
|
class TextBlock : UIElement
|
|||
|
{
|
|||
|
public TextBlock(string name = "textBlock") : base(name) { }
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Пример отправки писем группе адресатов
|
|||
|
/// </summary>
|
|||
|
interface IEMail
|
|||
|
{
|
|||
|
void Send();
|
|||
|
string Name { get; set; }
|
|||
|
}
|
|||
|
|
|||
|
class Group : IEMail
|
|||
|
{
|
|||
|
public Group(params IEMail[] es) => Append(es);
|
|||
|
|
|||
|
public List<IEMail> eMails = new();
|
|||
|
|
|||
|
public string Name { get; set; }
|
|||
|
|
|||
|
public void Append(params IEMail[] es) {
|
|||
|
foreach (var item in es) eMails.Add(item);
|
|||
|
}
|
|||
|
|
|||
|
public void Send() {
|
|||
|
foreach(var item in eMails) item.Send();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
class EMail : IEMail
|
|||
|
{
|
|||
|
public string Name { get; set; }
|
|||
|
|
|||
|
public void Send() => Console.WriteLine($"Send {Name}");
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Генератор файловой системы
|
|||
|
/// </summary>
|
|||
|
abstract class IFileSystem
|
|||
|
{
|
|||
|
protected virtual IFileSystem AddItem(IFileSystem element) => this;
|
|||
|
public abstract void PrintInfo(string w = "");
|
|||
|
public string Title { get; set; }
|
|||
|
}
|
|||
|
|
|||
|
class Document : IFileSystem
|
|||
|
{
|
|||
|
public override void PrintInfo(string w = "")
|
|||
|
{
|
|||
|
Console.WriteLine($"{w}{Title}");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
class Folder : IFileSystem
|
|||
|
{
|
|||
|
private readonly List<IFileSystem> fileSystem;
|
|||
|
public Folder() => fileSystem = new();
|
|||
|
|
|||
|
public IFileSystem AddElement(params IFileSystem[] element)
|
|||
|
{
|
|||
|
foreach (var item in element) AddItem(item);
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
public override void PrintInfo(string w = "")
|
|||
|
{
|
|||
|
Console.WriteLine($"{w}{Title}");
|
|||
|
foreach (var item in fileSystem) item.PrintInfo(w);
|
|||
|
}
|
|||
|
|
|||
|
protected override IFileSystem AddItem(IFileSystem element)
|
|||
|
{
|
|||
|
fileSystem.Add(element);
|
|||
|
return this;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public class Program
|
|||
|
{
|
|||
|
public static void Main(string[] argv)
|
|||
|
{
|
|||
|
#region 1
|
|||
|
var panel1 = new Panel("panel1");
|
|||
|
var tb1 = new TextBox("textBox1");
|
|||
|
var tb2 = new TextBox("textBox2");
|
|||
|
panel1.Children.Add(tb1);
|
|||
|
var panel2 = new Panel("panel2");
|
|||
|
var tb3 = new TextBox("textBox3");
|
|||
|
var lbl1 = new Label("label1");
|
|||
|
lbl1.Children.Add(new TextBlock("textBlock1"));
|
|||
|
panel2.Children.Add(tb3);
|
|||
|
panel2.Children.Add(lbl1);
|
|||
|
panel1.Children.Add(panel2);
|
|||
|
panel1.Children.Add(tb2);
|
|||
|
|
|||
|
Console.WriteLine(panel1);
|
|||
|
#endregion
|
|||
|
#region 2
|
|||
|
EMail c = new EMail() { Name = "nik" };
|
|||
|
c.Send();
|
|||
|
EMail r = new EMail() { Name = "nikr" };
|
|||
|
r.Send();
|
|||
|
EMail u = new EMail() { Name = "niku" };
|
|||
|
u.Send();
|
|||
|
EMail d = new EMail() { Name = "nikd" };
|
|||
|
d.Send();
|
|||
|
|
|||
|
Group cr = new Group(c, r, u);
|
|||
|
cr.Send();
|
|||
|
|
|||
|
//3
|
|||
|
new Folder() { Title = "C:/"}
|
|||
|
.AddElement(new Folder() { Title = "Windows/"}
|
|||
|
.AddElement(new Folder() { Title = "System32/" }
|
|||
|
.AddElement(new Document() { Title = "system.xml"}),
|
|||
|
new Folder() { Title = "Driver/"}
|
|||
|
.AddElement(new Folder() { Title = "etc/"}
|
|||
|
.AddElement(new Document() { Title = "jp.json"}),
|
|||
|
new Folder() { Title = "etc2"})))
|
|||
|
.PrintInfo();
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|