ztp zadanie 2
unknown
plain_text
3 years ago
5.5 kB
9
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...