Для понимания паттернов необходимо правильно читать UML диаграммы, и тогда не будет проблем в их понимании. Возьмем за основу реализации паттернов тему кондитерской.
Наследование
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
namespace Наследование { class Employee { public int Salary { get; set; } } class Сonfectioner:Employee { public string Education { get; set; } } } |
Наследование отображается стрелой, с прозрачным наконечником, эти моменты надо запомнить, они вам в дальнейшем помогут более проще разбираться в диаграммах и паттернах. Как мы видим у нас происходит наследования от класса Сотрудники классом Кондитера.
Реализация
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
interface IWork { void DoJob(); } class Сonfectioner: IWork { public string Education { get; set; } public void DoJob() { throw new NotImplementedException(); } } |
Хотя в последних версиях VS обозначения реализации интерфейса выглядит иначе, но в книгах и статьях она схематично изображена в виде пунктирной линии.
Ассоциация
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class Employee { public int Salary { get; set; } } class Сonfectioner { public Employee Employee { get; set; } public string Education { get; set; } public void DoJob() { Console.WriteLine("Делаю торты"); } } |
В данном примере мы видим, как объект Confectioner содержится и используется другой объект Employee. На схеме ассоциация отображается обычной стрелкой.
Композиция
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class Employee { public int Salary { get; set; } } class Сonfectioner { Employee employee; public Сonfectioner() { employee = new Employee(); } public string Education { get; set; } public void DoJob() { Console.WriteLine("Делаю торты"); } } |
Как мы видим связь в композиции обозначается стрелкой от главного класса к зависимому, на главном стрелка начинается с закрашенного ромбика. Рассмотрев код класса Confectioner который обладает классом Employee, внутри себя. Причем если мы удалим объект Confectioner то мы потеряем и объект Employee.
Агрегация
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
abstract class People {} class Сonfectioner { People people; public Сonfectioner(People people) { this.people = people; } public string Education { get; set; } public void DoJob() { Console.WriteLine("Делаю торты"); } } |
На схеме мы видимо похожую UML диаграмму, за исключением того, что ромбик не заштрихован. По коду у нас реализована слабая связь, а в качестве связи класса Confectioner используется абстрактный класс People, или мог быть его аналог интерфейса.