Kod implementujący wzorzec Dekorator - gdzie są błędy?

0

Witam.
Walczę obecnie z wzorcami i ugrzązłem przy dekoratorze mam takie zadanie:
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.

    - 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:

    - dopisywanie czasu i daty wysłania wiadomości (w postaci doklejonego tekstu "wysłano ..."),
    - dopisywanie czasu i daty odebrania wiadomości (w postaci doklejonego tekstu "odebrano ..."),
    - numerowania wiadomości (każda wiadomość powinna otrzymać swój unikalny numer, dodawany do treści wiadomości),
    - filtrowanie wiadomości (filtr powinien blokować wiadomości zawierające wskazany (w konstruktorze) ciąg znaków, np. "sale"),
    - cenzurowanie wiadomości (wskazany ciąg znaków powinien być zamieniany na "***"),
    - 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).

Niżej zamieszczam mój wstępny kod ale coś mi nie idzie jakby mógł ktoś mi to w miarę po ludzku wyjaśnić i powiedzieć gdzie robię błędy będę wdzięczny

import java.sql.Date;
import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.LinkedList;
import java.util.List;


 class mailbox {
    
    protected List<String> box = new LinkedList<String>();
    mailbox(){}
    public String send(String a){
        box.add(a);
        int i = box.size();
        return box.get(i-1);
    }
    
    public String read(){
        return box.get(0);
    }
    
    public void del(){
        box.remove(0);
    }
}
abstract class extraf extends mailbox{
    public abstract String send();
    public abstract String read();
}

class sendtime extends extraf{
    mailbox box;
    
    public sendtime(mailbox box){
        this.box = box;
    }
    
    public String send(String a){
        Time x = new Time (12, 0, 0); //lub jakies tam pobranie z bazy
         int iCzas = x.getDate();
        Date data = new Data (iCzas);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd, HH:mm:ss");
        return box.send(a) +" wyslano"+ formatter.format(data); 
    } 
  
    public String read(){
        Time x = new Time (12, 0, 0); //lub jakies tam pobranie z bazy
         int iCzas = x.getDate();
        Date data = new Data (iCzas);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd, HH:mm:ss");
        return box.read() +" odebrano"+ formatter.format(data); 
    } 
}
0

Ok sam przerobiłem troszkę ten wzorzec i powiedzmy że działa ale mam teraz inny problem podczas indeksowania wiadomości oraz dodawania statusu zapamiętuje mi tylko jedną zmienną może wiecie jak to zmienić.
Tak wygląda mój dekorator:

import java.util.LinkedList;
import java.util.List;

interface imailbox{
public void send(String a);
public String read();
}

public class mailbox implements imailbox{
    List<String> box = new LinkedList<String>();
    int i = 0;
    @Override
    public void send(String a){
        box.add(a);
    }
    @Override
    public String read(){
        i++;
        return box.get(i-1);
    }
}

abstract class dekorator implements imailbox{
    protected imailbox mess;
        public dekorator(imailbox message){
            this.mess = message;
        }
                public void send(String a){mess.send(a);}
                    public String read(){return mess.read();}
}

class adds extends dekorator{
    public adds(imailbox message){
        super(message);
        }
            public void send(String a){
                super.send(addstatus(a));
                }
                    public String read(){
                        return super.read();
                    }
                        public String addstatus(String a){
                            java.util.Date date = new java.util.Date();
    
                            String b=a+" wyslano "+date.toString();
                        return b;
                        }
}
class reads extends dekorator{
    public reads(imailbox message){
    super(message);
    }
        public void send(String a){
            super.send(addstatus(a));
        }
                public String read(){
                    return super.read();
                }
                    public String addstatus(String a){
                        java.util.Date date = new java.util.Date();
    
                        String b=a+ " odebrano "+date.toString();
                    return b;
                    }
}
class index extends dekorator{
    public index(imailbox message){
        super(message);
    }    
        public void send(String a){
                    super.send(addindex(a));
                }
                        public String read(){
                            return super.read();
                        }
                            public String addindex(String a){
                                int i=1;
                                String c = Integer.toString(i);
                                String b=c+":"+a;
                                i++;
                            return b;
                            }
}

Tak wygląda mój main:

public static void main(String[] args) {
        
    imailbox box = new adds(new reads(new index(new mailbox())));
    
    box.send("moja widomosc");
    box.send("moja widomosc2");
    box.send("moja widomosc3");
    
    System.out.println(box.read());
    System.out.println(box.read());
    System.out.println(box.read());
        
    }

a to dostaje na wyjściu

1:moja widomosc wyslano Fri Dec 05 11:24:46 CET 2014 odebrano Fri Dec 05 11:24:46 CET 2014
1:moja widomosc2 wyslano Fri Dec 05 11:24:46 CET 2014 odebrano Fri Dec 05 11:24:46 CET 2014
1:moja widomosc3 wyslano Fri Dec 05 11:24:46 CET 2014 odebrano Fri Dec 05 11:24:46 CET 2014
jak poprawić a żeby czas i index były przyznawane z wywołaniem box.send();

0

Po pierwsze formatter: http://prettyprinter.de/

Żeby mieć indeks, który się zwiększa to trzymaj zmienną w klasie

class ... {
    private int index = 1;
    public String addIndex(String a) {
        String c = Integer.toString(index);
        String b = c+ ":" + a;
        ++index;
        return b;
    }
}

Natomiast czas jest ok, ale wywołania były tak blisko siebie, więc nie miał kiedy się zmienić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1