Complete these tasks to reinforce what you learned in this module.
PreisRepository soll nur noch eine Sache tun: den Preis liefern und dabei melden, dass es die Datenbank befragt hat.
Schreibe zwei Decorators um IPreisRepository:
- GecachtesPreisRepository — merkt sich gelieferte Preise in einem Dictionary und beantwortet Wiederholungen selbst, ohne nach innen zu delegieren.
- ProtokolliertesPreisRepository — meldet jede Anfrage, bevor es nach innen weitergibt.
Stecke sie so zusammen, dass das Protokoll aussen liegt und damit auch die aus dem Cache beantworteten Anfragen sieht. Dann frage dreimal: A-1, A-2, noch einmal A-1.
IPreisRepository und bekommen im Konstruktor ein IPreisRepository — das ist die innere Schicht. «Protokoll aussen» heisst: new Protokolliert(new Gecacht(new PreisRepository())).using System;
using System.Collections.Generic;
public interface IPreisRepository
{
decimal HolePreis(string artikelNr);
}
public sealed class PreisRepository : IPreisRepository
{
public decimal HolePreis(string artikelNr)
{
Console.WriteLine("DB: " + artikelNr);
return artikelNr.Length * 10m;
}
}
// TODO: GecachtesPreisRepository — implementiert IPreisRepository,
// bekommt ein IPreisRepository herein, merkt sich Preise in einem
// Dictionary<string, decimal> und delegiert nur beim ersten Mal.
// TODO: ProtokolliertesPreisRepository — implementiert IPreisRepository,
// bekommt ein IPreisRepository herein, gibt "Protokoll: {artikelNr}"
// aus und delegiert dann nach innen.
class Program
{
static void Main()
{
// TODO: Protokoll aussen, Cache innen, Repository ganz innen
IPreisRepository repo = new PreisRepository();
repo.HolePreis("A-1");
repo.HolePreis("A-2");
repo.HolePreis("A-1");
}
}