МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра САПР ОТЧЕТ по практической работе №1 по дисциплине «Объектно-ориентированное программирование» Тема: «Паттерн Интерфейс» Студент гр. 2309 Попов М.В. Преподаватель Васильев А.А. Санкт-Петербург 2023 1. Цель работы Изучение и реализация на языке программирования C# паттернов Интерфейс и Стратегия. 2. Анализ задачи Паттерн Интерфейс (Inrerface) — основной шаблон проектирования, а именно механизм, позволяющий создать контракт для классов. Этот контракт определяет, какие методы и свойства должны быть реализованы в классе, чтобы он мог использоваться в конкретном контексте. Паттерн Стратегия (Strategy) — поведенческий шаблон проектирования, который определяет набор алгоритмов, инкапсулирует каждый из них и обеспечивает их взаимозаменяемость. То есть в зависимости от ситуации один алгоритм заменяется другим. Шаблон Strategy позволяет менять выбранный алгоритм независимо от объектов, которые его используют. Паттерн может применяться, когда есть несколько родственных классов, отличающихся поведением. Задается основной класс, а разные варианты поведения выносятся в отдельные классы. При необходимости от основного класса создаются производные классы, которые изменяют алгоритмы в базовом классе. Оба паттерна использованы в программе для моделирования различных видов уток с возможностью определения и изменения их поведения при полете, кряканье и плавании. 3. Ход выполнения работы 3.1. Упражнение 1 Протестировать программу, где создан базовый класс Duck — утка, со следующими методами: PerformQuack() — крякать, PerformSwim() — плавать, PerformFly() — летать. Эти методы реализуются через переменные flyBehavior, quackBehavior и swimBehavior соответствующих интерфейсов. От класса Duck наследуют классы MallardDuck — дикая утка, RubberDuck — резиновая утка и ReadHeadDuck — красноголовая утка. Производные классы 2 могут изменять алгоритмы базового класса. Например, резиновая утка не умеет летать, поэтому в ее классе начальное значение переменной flyBehavior базового класса заменено экземпляром класса NotFlyDuck. 3.1.1. Пошаговое описание алгоритма 1. Вызов главного метода Main(), в котором создается объект класса MallardDuck и вызываются его методы PerformQuack(), PerformFly() и PerformSwim(). 2. Аналогично создаются объекты классов ReadHeadDuck RubberDuck с последующим вызовом их методов. 3.1.2. Диаграмма классов Диаграмма классов UML программы представлена на рисунке 3.1. 3 и Рисунок 3.1 — Диаграмма классов UML 4 3.1.3. Контрольный пример На Рисунке 3.2 программа в консоль выводит для каждой созданной утки название ее вида и собственные реализации методов крякать, летать и плавать. Рисунок 3.2 — Вывод информации об утках 3.2. Упражнение 2 Добавить в программу из упражнения 1 новый вид уток, поведение которого отличается от остальных. 3.2.1. Пошаговое описание алгоритма В программу включен новый класс MuskyDuck — мускусная утка. Она может крякать и летать, но не умеет плавать. Значение по умолчанию переменной интерфейса swimBehavior заменено экземпляром класса NotSwimDuck. 1. В главном методе Main() в дополнение к остальным объектам уток инициализируется объект muskyDuck с типом MuskyDuck. 2. Вызов методов PerformQuack(), PerformFly() и PerformSwim() нового объекта. 3.2.2. Диаграмма классов Диаграмма классов UML программы представлена на рисунке 3.3. 5 Рисунок 3.3 — Диаграмма классов UML 3.2.3. Контрольный пример Аналогично контрольному примеру из упражнения 1 на Рисунке 3.4 программа в консоль выводит для каждой созданной утки название ее вида и собственные реализации методов крякать, летать и плавать. Только теперь количество уток увеличилось до четырех. 6 Рисунок 3.4 — Вывод информации об утках 4. Листинг программы abstract class Duck { protected IFlyBehavior flyBehavior; protected IQuackBehavior quackBehavior; protected ISwimBehavior swimBehavior; public Duck() { flyBehavior = new FlyDuck(); quackBehavior = new QuackDuck(); swimBehavior = new SwimDuck(); } public void PerformFly() { flyBehavior.Fly(); } public void PerformQuack() { quackBehavior.Quack(); } public void PerformSwim() { swimBehavior.Swim(); } } class MallardDuck : Duck { public MallardDuck() { Console.WriteLine(); Console.WriteLine("I MallardDuck"); } } class ReadHeadDuck : Duck { public ReadHeadDuck() { Console.WriteLine(); Console.WriteLine("I ReadHeadDuck"); } } 7 class RubberDuck : Duck { public RubberDuck() { flyBehavior = new NotFlyDuck(); Console.WriteLine(); Console.WriteLine("I RubberDuck"); } } class MuskyDuck : Duck { public MuskyDuck() { swimBehavior = new NotSwimDuck(); Console.WriteLine(); Console.WriteLine("I MuskyDuck"); } } interface IFlyBehavior { void Fly(); } interface IQuackBehavior { void Quack(); } interface ISwimBehavior { void Swim(); } class NotFlyDuck : IFlyBehavior { public void Fly() { Console.Write("I can`t fly. "); } } class FlyDuck : IFlyBehavior { public void Fly() { Console.Write("I can fly. "); } } class QuackDuck : IQuackBehavior { public void Quack() { Console.Write("I can quack. "); } } class SilentDuck : IQuackBehavior { public void Quack() { Console.Write("I can`t quack. "); 8 } } class SwimDuck : ISwimBehavior { public void Swim() { Console.Write("I can swim. "); } } class NotSwimDuck : ISwimBehavior { public void Swim() { Console.Write("I can`t swim. "); } } internal class Program { static void Main() { Duck mallardDuck = new MallardDuck(); mallardDuck.PerformQuack(); mallardDuck.PerformFly(); mallardDuck.PerformSwim(); Console.WriteLine(); Duck readHeaddDuck = new ReadHeadDuck(); readHeaddDuck.PerformQuack(); readHeaddDuck.PerformFly(); readHeaddDuck.PerformSwim(); Console.WriteLine(); Duck rubberDuck = new RubberDuck(); rubberDuck.PerformQuack(); rubberDuck.PerformFly(); rubberDuck.PerformSwim(); Console.WriteLine(); Duck muskyDuck = new MuskyDuck(); muskyDuck.PerformQuack(); muskyDuck.PerformFly(); muskyDuck.PerformSwim(); Console.WriteLine(); } } 5. Полученные результаты 9 На основе паттернов Интерфейс и Стратегия написана программа для моделирования различных видов уток с возможностью определения и изменения их поведения при полете, кряканье и плавании. 6. Вывод В ходе выполнения практической работы рассмотрены паттерны Интерфейс и Стратегия языка программирования C#. Список использованной литературы 1. Microsoft Learn — сеть разработчиков Microsoft. URL: https://learn.microsoft.com/ru-ru/dotnet/csharp/ (дата обращения: 12.12.2023). 2. Платформа .NET и C# от А до Я. Учимся программировать на языке C Sharp. URL: https://csharp.webdelphi.ru/uchebnik-po-c/ (дата обращения: 12.12.2023). 3. METANIT.COM — сайт о программировании. https://metanit.com/sharp/tutorial/ (дата обращения: 12.12.2023). 10 URL: