суббота, 10 декабря 2011 г.

Java паттерн "Декоратор"

Рассмотрим небольшой паттерн проектирования "Декоратор". Он юзается по типу плагина для класса. Добавляя к более общему понятию всякие няшные вкусности. Рассмотрим пример на стандартной библе java. Рассмотрим работу со стандартным потоком ввода.
Диаграмма классов


Красным выделен мой класс декоратор который применяет шифрованию к тексту при чтении файла. InputStrean является абстрактным классом,т.к декоратор тоже является его потомком мы можем использовать силу  полиморфизма,но не для общего случая понимая наследования,а именно для приведения типов.
Итак рассмотрим мой класс(чур не придраться к коду писалось всего несколько минут).


public class EncryptedStream extends FilterInputStream {

    public EncryptedStream(InputStream in) {
        super(in);
    }
    @Override
    public int read() throws IOException{
        int c = super.read();
        if (c != -1){
            if ((char)c == 'o'){
                c = (int)'p';
            }
            if ((char)c == 'l'){
                c = (int)'b';
            }
        }
        return c;
    }
    @Override
    public int read(byte[] b,int offset,int len) throws IOException{
        int l = super.read(b, len, len);
        for(int i = offset; i < offset + l ; i++){
            if ((char)b[i] == 'o'){
                b[i] = (byte)'p';
            }
            if ((char)b[i] == 'l'){
                b[i] = (byte)'b';
            }
        }
        return l;
    }   
}
Рассмотрим применение:




public class EncryptedStreamProject {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            // TODO code application logic here
            InputStream file = new EncryptedStream(
                    new BufferedInputStream(
                            new FileInputStream("test.txt")));
            for (int c = 0;c>=0;c = file.read()){
                System.out.print((char)c);
            }
            file.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

Не забываем создать файл test.txt.
Входные данные:
Hello world!
Выходные данные:
Hebbp Wprbd!

Успехов :)

Комментариев нет:

Отправить комментарий