Piotr Gębala gr 31
Techniki Obiektowe
Sprawozdanie Wypożyczalnia
Projekt polegał na stworzeniu wypożyczalni wideo pozwalającej na tworzenie klientów, filmów, wypożyczeń oraz drukowanie potwierdzeń. Następnie mieliśmy wprowadzić modyfikację: 2. Modyfikacja 1
Potwierdzenie powinno być drukowane w formie standardowej lub w formie HTML.
3. Modyfikacja 2
Nowy rodzaj filmu – western z inną ceną za wypożyczenie.
4. Modyfikacja 3
Zmiana sposobu naliczania punktów stałego klienta.
Za 1 dzień 5 punktów, za następne 1. Jeżeli nowość całość x2.
W projekcie zastosowałem wzorzec strategy w celu przypisania odpowiedniego sposobu doliczania punktów stałego klienta w zależności od rodzaju filmu, aby uniknąć powtarzania implementacji tych samych metod.
Klasy DoliczNormalnie oraz DoliczPodwojnie oparte na interfejsie IDolicz pozwalają na dodanie punktów stałego klienta (normalnie dla wszystkich filmów z wyjątkiem nowości gdzie punkty naliczane są podwójnie). Dzięki temu zabiegowi nie musimy implementować doliczania punktów dla każdego rodzaju filmu osobno.
interface IDolicz
{
void Dolicz(Wypozyczenia wypozyczenie);
}
class DoliczNormalnie : IDolicz
{
public void Dolicz(Wypozyczenia wypozyczenie)
{
wypozyczenie.Klient.Pkt += (wypozyczenie.Dni - 1) + 5;
}
}
class DoliczPodwojnie : IDolicz
{
public void Dolicz(Wypozyczenia wypozyczenie)
{
wypozyczenie.Klient.Pkt += ((wypozyczenie.Dni - 1) + 5) * 2;
}
}
W klasie abstrakcyjnej RodzajFilmu domyślnie doliczanie ustawiamy na DoliczNormalnie.
Następnie w klasie pochodnej FNowosc ustawiamy na DoliczPodwojnie. W przyszłości będziemy mogli zmienić sposób doliczania na inny np. potrójne punkty za western.
abstract class RodzajFilmu
{
string rodzaj;
int cena;
protected IDolicz doliczenie = null;
public IDolicz Doliczanie
{
set { Doliczanie = value; }
}
public RodzajFilmu(string rodzaj, int cena)
{
this.rodzaj = rodzaj;
this.cena = cena;
doliczenie = new DoliczNormalnie();
}
public void Dolicz(Wypozyczenia wypozyczenie)
{
if ( doliczenie != null)
doliczenie.Dolicz(wypozyczenie);
}
public int Cena
{
get { return cena; }
}
public string Rodzaj
{
get { return rodzaj; }
}
}
W klasach pochodnych RodzajuFilmu ustalamy rodzaj i cenę filmu.
class FNowosc : RodzajFilmu
{
public FNowosc() : base("Nowość", 8)
{
doliczenie = new DoliczPodwojnie();
}
}
class FDzieciecy : RodzajFilmu
{
public FDzieciecy() : base("Dzieciecy", 6) { }
}
class FNormalny : RodzajFilmu
{
public FNormalny() : base("Normalny", 4) { }
}
class FWestern : RodzajFilmu
{
public FWestern() : base("Western", 5) { }
}
Klasa Film pozwala na tworzenie filmów na podstawie podanego rodzaju i tytułu. Podczas tworzenia ustalane jest też ID filmu.
class Film
{
static int licznik_f = 0;
int idf;
string tytul;
RodzajFilmu rodzaj;
public Film(RodzajFilmu rodzaj, string tytul)
{
licznik_f++;
this.idf = licznik_f;
this.rodzaj = rodzaj;
this.tytul = tytul;
}
public RodzajFilmu Rodzaj
{
get { return rodzaj; }
}
public string Tytul
{
get { return tytul; }
}
public int Idf
{
get { return idf; }
}
public override string ToString()
{
return "Film id = " + idf + "\nTytuł = \"" + tytul + "\"\nRodzaj filmu = " +
rodzaj.Rodzaj + "\nCena za dzień = " + rodzaj.Cena + "\n";
}
}
Klasa Klient pozwala na tworzenie klientów na podstawie podanego imienia i nazwiska. Podczas tworzenia ustalane jest też ID klienta. Klasa zawiera liczbę punktów stałego klienta.
class Klient
{
static int licznik_k = 0;
int idk, pkt = 0;
string imie, nazwisko;
public Klient(string imie, string nazwisko)
{
licznik_k++;
this.idk = licznik_k;
this.imie = imie;
this.nazwisko = nazwisko;
}
public string Imie
{
get { return imie; }
}
public string Nazwisko
{
get { return nazwisko; }
}
public int Pkt
{
get { return pkt; }
set { pkt = value; }
}
public int Idk
{
get { return idk; }
}
public override string ToString()
{
return "Klient id = " + idk + "\nImię = " + imie + "\nNazwisko = " + nazwisko +
"\nPunkty stałego klienta = " + pkt + "\n";
}
}
Klasa Wypozyczenie pozwala na tworzenie wypozyczen na podstawie podanego filmu, klienta który ten film wypożyczył oraz liczby dni na jaką film został wypożyczony. Podczas tworzenia ustalane jest też ID wypożyczenia oraz wywoływana jest metoda doliczająca punkty stałego klienta.
class Wypozyczenia
{
static int licznik_w;
int idw,dni;
Film film;
Klient klient;
public Wypozyczenia(Film film, Klient klient, int dni)
{
licznik_w++;
this.idw = licznik_w;
this.film = film;
this.klient = klient;
this.dni = dni;
Dolicz();
}
{
film.Rodzaj.Dolicz(this);
}
public Film Film
{
get { return film; }
}
public Klient Klient
{
get { return klient; }
}
public int Dni
{
get { return dni; }
}
public int Idw
{
get { return idw; }
}
public override string ToString()
{
return "Wypożyczenie id = " + idw + "\n";
}
}
W klasie statycznej Potwierdzenie implementujemy odpowiednie metody dla potwierdzenia zwykłego oraz dla potwierdzenia w formie HTML. Dzięki temu klient może wybrać jaki rodzaj potwierdzenia chce otrzymać.
static class Potwierdzenie
{
public static void PotwierdzNormalnie(Wypozyczenia wypozyczenie)
{
Console.WriteLine("*******************************************************\nPOTW
IERDZENIE ZWYKŁE\n\n" + wypozyczenie +
"\n" + wypozyczenie.Klient + "\n" + wypozyczenie.Film +
"\nLiczba dni wypożyczenia = " + wypozyczenie.Dni +
"\nOstateczna cena za wypożyczenie = " +
wypozyczenie.Film.Rodzaj.Cena * wypozyczenie.Dni +
"\n*******************************************************\n
");
}
public static void PotwierdzHTML(Wypozyczenia wypozyczenie)
{
Console.WriteLine("<html>\nPOTWIERDZENIE HTML\n</html>");
}
}
Program główny. Przykładowe wywołanie.
class Program
{
static void Main(string[] args)
{
Klient k1 = new Klient("Piotr", "Gębala");
Klient k2 = new Klient("Adam", "Miłosz");
Film f1 = new Film(new FNowosc(), "The Walking Dead");
Film f2 = new Film(new FNormalny(), "Arrow");
Film f3 = new Film(new FDzieciecy(), "Ice Age");
Wypozyczenia w1 = new Wypozyczenia(f1, k2, 7);
Potwierdzenie.PotwierdzNormalnie(w1);
Potwierdzenie.PotwierdzHTML(w1);
Wypozyczenia w2 = new Wypozyczenia(f2, k2, 3);
Potwierdzenie.PotwierdzNormalnie(w2);
Wypozyczenia w3 = new Wypozyczenia(f3, k1, 4);
Potwierdzenie.PotwierdzNormalnie(w3);
}
}