Лабораторная работа №2 Паттерны Наблюдатель и Декоратор Работу (В группе с )


Download 371.22 Kb.
Sana07.05.2023
Hajmi371.22 Kb.
#1440203
TuriЛабораторная работа
Bog'liq
Laba 2


Лабораторная работа №2
Паттерны Наблюдатель и Декоратор
Работу выполнила:

(В группе с )


Цель работы: ознакомиться с паттернами проектирования Наблюдатель и Декоратор, нарисовать диаграмму классов на основе приведенных описаний, написать реализацию паттерна на языке программирования C#

  1. Код вычисление поверхности и объема сферы по заданному радиусу (листинг 1).

Листинг 1 ­– Вычисление поверхности и объема сферы

double R = Convert.ToDouble(Console.ReadLine());
Console.WriteLine($"Surface: {Math.Round(4 * Math.PI * Math.Pow(R, 2.0), 2)}");
Console.WriteLine($"Volume: {Math.Round((4 / 3) * Math.PI * Math.Pow(R, 3.0), 2)}");



Результат работы программа предоставлен на рисунке 1.

Рисунок 1 – результат работы программы

  1. Код вычисление скорости в метрах в секунду, километрах в час, милях в час (листинг 2).

Листинг 2 – Вычисление скорости в м/с, км/ч, мили/ч

double S = Convert.ToDouble(Console.ReadLine());
int Hour = Convert.ToInt32(Console.ReadLine());
int Min = Convert.ToInt32(Console.ReadLine());
int Sec = Convert.ToInt32(Console.ReadLine());

Console.WriteLine($"Speed in meters/sec is {Math.Round(S/(Sec + Min*60 + Hour*360), 6)}");


Console.WriteLine($"Speed in km/h is {Math.Round((S/1000.0)/(Hour + Min/60.0 + Sec/3600.0), 6)}");
Console.WriteLine($"Speed in miles/h is {Math.Round((S/1609) / (Hour + Min / 60.0 + Sec / 3600.0), 6)}");

Результат работы программы предоставлен на рисунке 2.

Рисунок 2 – Результат работы программы

  1. Код List для хранения списка людей (листинг 3).

Листинг 3 – Код списка людей List

for (int i = 0; i <3; i++){
String name = Console.ReadLine();
int age = Convert.ToInt32(Console.ReadLine());
Person person = new Person(name, age);
people.Add(person);
}
foreach (Person person in people)
{
person.ToString();
}

Код класса Person (листинг 4).
Листинг 4 – Код класса Person

internal class Person
{
private string name;
private int age;

public Person(string name, int age)


{
this.name = name;
this.age = age;
}

new public void ToString() {


Console.WriteLine($"{name} - {age}");
}
}

Результат работы программы предоставлен на рисунке 3.

Рисунок 3 – Результат работы программы

  1. Код абстрактного класса Animal (листинг 5).

Листинг 5 – Код абстрактного класса Animal.

internal abstract class Animal
{
private string Name;

public void SetName(string name) { Name = name; }


public string GetName() { return Name; }
public abstract void Eat();
}
class Dog : Animal
{
public override void Eat()
{
Console.WriteLine("Eating");
}
}

Код тестирование программы (листинг 6).
Листинг 6 – Код тестирования

Dog dog = new Dog();
string name = Console.ReadLine();
dog.SetName(name);
Console.WriteLine(dog.GetName());
dog.Eat();

Результат работы программы предоставлен на рисунке 4

Рисунок 4 – Результат программы

  1. Паттерн наблюдатель.

На рисунке 5 предоставлена UML-диаграмма паттерн Наблюдатель.

Рисунок 5 – UML-диаграмма паттерн Наблюдатель
Реализация паттерн Наблюдатель. Код субъект (листинг 7).
Листинг 7 – Код субъекта

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Observer


{
public interface IOrderNotifier
{
void Attach(IOrderObserver observer);
void Detach(IOrderObserver observer);
void Notify(Order order);
}

public interface IOrderService : IOrderNotifier


{
void UpdateOrder(Order order);
}

public class OrderService : IOrderService


{
public List Observers = new List();
public void UpdateOrder(Order order)
{
Notify(order);
}
public void Attach(IOrderObserver observer)
{
Observers.Add(observer);
}
public void Detach(IOrderObserver observer)
{
Observers.Remove(observer);
}
public void Notify(Order order)
{
foreach (var observer in Observers)
{
observer.Update(order);
}
}
}
}

Код наблюдатель (листинг 8).
Листинг 8 – Код наблюдателя

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Observer


{
public interface IOrderObserver
{
void Update(Order order);
}

public class EmailObserver : IOrderObserver


{
public void Update(Order order)
{
Console.WriteLine($"Send on Email: Order № {order.OrderNumber} is updated to {order.OrderDate}. Total amount is {order.TotalAmount.ToString()}");
}
}

public class SMSObserver : IOrderObserver


{
public void Update(Order order)
{
Console.WriteLine($"Send on SMS: Order № {order.OrderNumber} is updated to {order.OrderDate}. Total amount is {order.TotalAmount.ToString()}");
}
}
}

Код товара (листинг 9).
Листинг 9 – Код товара

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Observer


{
public class Order : OrderService
{
public string OrderNumber { get; set; }
public DateTime OrderDate { get; set; }
public decimal TotalAmount { get; set; }
}
}

Код тестового класса (листинг 10).
Листинг 10 – Код тестового класса

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Observer


{
internal class Program
{
static void Main(string[] args)
{
Order order = new Order();
order.OrderNumber = "8238483";
order.OrderDate = DateTime.Now;
order.TotalAmount = 3463;

OrderService orderService = new OrderService();


EmailObserver emailObserver = new EmailObserver();


SMSObserver smsObserver = new SMSObserver();

orderService.Attach(emailObserver);


orderService.Attach(smsObserver);

orderService.UpdateOrder(order);


orderService.Detach(emailObserver);


order.OrderNumber = "8238483";


order.OrderDate = DateTime.Now;
order.TotalAmount = 3000;

orderService.UpdateOrder(order);


}
}
}

Результат программы предоставлен на рисунке 6.

Рисунок 6 – Результат выполнения программы

  1. Паттерн декоратор.

На рисунке 7 предоставлена UML-диаграмма паттерн Декоратор.

Рисунок 7 – UML-диаграмма паттерн Декоратор
Код паттерн Декоратор (листинг 11).
Листинг 11 – Код декоратора

public interface Bike
{

string GetBikeDetails();


int GetPrice();
}

public class RoyalEnfield : Bike


{
public string GetBikeDetails()
{
return "RoyalEnfield";
}

public int GetPrice()


{
return 200000;
}
}

public abstract class BikeDecorator : Bike


{
public abstract string GetBikeDetails();
public abstract int GetPrice();
}

public class PromotionalOffer : BikeDecorator


{
Bike bike;
int PromotionalDiscount = 9999;

public PromotionalOffer(Bike bike)


{
this.bike = bike;
}

override public string GetBikeDetails()


{
return bike.GetBikeDetails() + " + promotional offer";
}

override public int GetPrice()


{
return bike.GetPrice() - PromotionalDiscount;
}
}

public class TransportOfficeCharges : BikeDecorator


{
Bike bike;
int transportOfficeCharges = 15000;

public TransportOfficeCharges(Bike bike)


{
this.bike = bike;
}

override public string GetBikeDetails()


{
return bike.GetBikeDetails() + " + transport office charges";
}

override public int GetPrice()


{
return bike.GetPrice() + transportOfficeCharges;
}
}

public class AccesseriesPrice : BikeDecorator


{
Bike bike;
int accesseriesPrice = 10000;

public AccesseriesPrice(Bike bike)


{
this.bike = bike;
}

override public string GetBikeDetails()


{
return bike.GetBikeDetails() + " + accesseries price";
}

override public int GetPrice()


{
return bike.GetPrice() + accesseriesPrice;
}
}

private static void Main(string[] args)


{
RoyalEnfield royalEnfield = new RoyalEnfield();
Console.WriteLine("Price " + royalEnfield.GetBikeDetails() + " : " + royalEnfield.GetPrice());

AccesseriesPrice accesseriesPrice = new AccesseriesPrice(royalEnfield);


Console.WriteLine("Price " + accesseriesPrice.GetBikeDetails() + " : " + accesseriesPrice.GetPrice());

PromotionalOffer promotionalOffer = new PromotionalOffer(accesseriesPrice);


Console.WriteLine("Price " + promotionalOffer.GetBikeDetails() + " : " + promotionalOffer.GetPrice());

TransportOfficeCharges transportOfficeCharges = new TransportOfficeCharges(promotionalOffer);


Console.WriteLine("Price" + transportOfficeCharges.GetBikeDetails() + " : " + transportOfficeCharges.GetPrice());
}

На рисунке 8 предоставлен результат программы.

Рисунок 8 – Результат программы

  1. UML-диаграмма классов паттерна Наблюдатель.

На рисунке 9 предоставлена UML-диаграмма классов.

Рисунок 9 – UML-диаграмма классов Наблюдатель

  1. UML-диаграмма классов паттерна Декоратор.

На рисунке 10 предоставлена UML-диаграмма классов

Рисунок 10 – UML-диаграмма классов Декоратор
Download 371.22 Kb.

Do'stlaringiz bilan baham:




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling