ztp zadanie 2

 avatar
unknown
plain_text
3 years ago
5.5 kB
4
Indexable
20% - Napisz klasę reprezentującą kolejkę napisów. Będziemy ją traktować jak prosty serwer pocztowy, na który możemy wrzucać tekstowe wiadomości, a następnie je pobierać (w kolejności przychodzenia). Możesz wykorzystać klasę LinkedList.
20% - Stwórz klasę Dekoratora do tej kolejki. Będzie on (abstrakcyjną) klasą bazową dla kolejnych dekoratorów i sam w sobie nic nie robi.
Następnie zdefiniuj dekoratory uzupełniające funkcjonalność kolejki o:
5% - dopisywanie czasu i daty wysłania wiadomości (w postaci doklejonego tekstu "wysłano ..."),
5% - dopisywanie czasu i daty odebrania wiadomości (w postaci doklejonego tekstu "odebrano ..."),
10% - numerowania wiadomości (każda wiadomość powinna otrzymać swój unikalny numer, dodawany do treści wiadomości),
10% - filtrowanie wiadomości (filtr powinien blokować wiadomości zawierające wskazany (w konstruktorze) ciąg znaków, np. "sale"),
10% - cenzurowanie wiadomości (wskazany ciąg znaków powinien być zamieniany na "***"),
20% - szyfrowanie danych (jakimś prostym algorytmem).
W programie testowym wypróbuj różnych kombinacji dekoratorów oraz łączenia kilku dekoratorów tej samej klasy (np. połącz kilka filtrów, każdy po innym słowie).




using System;
using System.Collections.Generic;

abstract class QueueDecorator
{
    protected Queue queue;
    public abstract void Put(string item);
    public abstract string Get();
    public int Count
    {
        get { return queue.Count; }
    }
}

class TimestampSenderDecorator : QueueDecorator
{
    public TimestampSenderDecorator(Queue queue)
    {
        this.queue = queue;
    }

    public override void Put(string item)
    {
        queue.Enqueue(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " wysłano: " + item);
    }

    public override string Get()
    {
        return queue.Dequeue();
    }
}

class TimestampReceiverDecorator : QueueDecorator
{
    public TimestampReceiverDecorator(Queue queue)
    {
        this.queue = queue;
    }

    public override void Put(string item)
    {
        queue.Enqueue(item);
    }

    public override string Get()
    {
        return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " odebrano: " + queue.Dequeue();
    }
}

class NumberedMessagesDecorator : QueueDecorator
{
    private int counter;

    public NumberedMessagesDecorator(Queue queue)
    {
        this.queue = queue;
        counter = 0;
    }

    public override void Put(string item)
    {
        counter++;
        queue.Enqueue(counter + ". " + item);
    }

    public override string Get()
    {
        return queue.Dequeue();
    }
}

class FilteringDecorator : QueueDecorator
{
    private string filterString;

    public FilteringDecorator(Queue queue, string filterString)
    {
        this.queue = queue;
        this.filterString = filterString;
    }

    public override void Put(string item)
    {
        if (!item.Contains(filterString))
        {
            queue.Enqueue(item);
        }
    }

    public override string Get()
    {
        return queue.Dequeue();
    }
}

class CensorshipDecorator : QueueDecorator
{
    private string censorString;

    public CensorshipDecorator(Queue queue, string censorString)
    {
        this.queue = queue;
        this.censorString = censorString;
    }

    public override void Put(string item)
    {
        queue.Enqueue(item.Replace(censorString, "***"));
    }

    public override string Get()
    {
        return queue.Dequeue();
    }
}

class EncryptionDecorator : QueueDecorator
{
    private int[] key;

    public EncryptionDecorator(Queue queue, int[] key)
    {
        this.key = key;
    }

    public override void Put(string item)
    {
        string encryptedItem = "";
        for (int i = 0; i < item.Length; i++)
        {
            encryptedItem += (char)(item[i] + key[i % key.Length]);
        }
        queue.Enqueue(encryptedItem);
    }

    public override string Get()
    {
        string item = queue.Dequeue();
        string decryptedItem = "";
        for (int i = 0; i < item.Length; i++)
        {
            decryptedItem += (char)(item[i] - key[i % key.Length]);
        }
        return decryptedItem;
    }
}

class Queue
{
    private List<string> items;

    public Queue()
    {
        items = new List<string>();
    }

    public void Enqueue(string item)
    {
        items.Add(item);
    }

    public string Dequeue()
    {
        string item = items[0];
        items.RemoveAt(0);
        return item;
    }

    public int Count
    {
        get { return items.Count; }
    }
}

class Program
{
    static void Main(string[] args)
    {
        Random random = new Random();
        Queue queue = new Queue();
        queue = new TimestampSenderDecorator(queue);
        queue = new TimestampReceiverDecorator(queue);
        queue = new NumberedMessagesDecorator(queue);
        queue = new FilteringDecorator(queue, "test");
        queue = new CensorshipDecorator(queue, "badword");
        queue = new EncryptionDecorator(queue, new int[] { 3, 5, 2 });

        queue.Put("hello");
        queue.Put("world");
        queue.Put("test");
        queue.Put("this is a badword");

        while (queue.Count > 0)
        {
            Console.WriteLine(queue.Dequeue());
        }
    }
}
Editor is loading...