Decorator Design Pattern in Java
Decorator - authenticate, input, encrypt, authenticate, decrypt, output
interface LCD {
void write(String[] s);
void read(String[] s);
}
class Core implements LCD {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
public void write(String[] s) {
System.out.print("INPUT: ");
try {
s[0] = in.readLine();
} catch (IOException ex) {
ex.printStackTrace();
}
}
public void read(String[] s) {
System.out.println("Output: " + s[0]);
}
}
class Decorator implements LCD {
private LCD inner;
public Decorator(LCD i) {
inner = i;
}
public void write(String[] s) {
inner.write(s);
}
public void read(String[] s) {
inner.read(s);
}
}
class Scramble extends Decorator {
public Scramble(LCD inner) {
super(inner);
}
public void write( String[] s ) {
super.write(s);
System.out.println("encrypt:");
StringBuilder sb = new StringBuilder(s[0]);
for (int i=0; i < sb.length(); i++) {
sb.setCharAt(i, (char)(sb.charAt(i) - 5));
}
s[0] = sb.toString();
}
public void read(String[] s) {
StringBuilder sb = new StringBuilder(s[0]);
for (int i=0; i < sb.length(); i++) {
sb.setCharAt(i, (char)(sb.charAt(i) + 5));
}
s[0] = sb.toString();
System.out.println( "decrypt:" );
super.read(s);
}
}
public class DecoratorDemo extends Decorator {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
public DecoratorDemo(LCD inner) {
super(inner);
}
public void write(String[] s) {
System.out.print("PASSWORD: ");
try {
in.readLine();
} catch (IOException ex) {
ex.printStackTrace();
}
super.write( s );
}
public void read(String[] s) {
System.out.print("PASSWORD: ");
try {
in.readLine();
} catch (IOException ex) {
ex.printStackTrace();
}
super.read(s);
}
public static void main(String[] args) {
LCD stream = new DecoratorDemo(new Scramble(new Core()));
String[] str = {""};
stream.write(str);
System.out.println("main: " + str[0]);
stream.read(str);
}
}
Output
PASSWORD: secret INPUT: the quick brown fox encrypt: main: oc`xlpd^fe]mjrizajs PASSWORD: secret decrypt: Output: the quick brown fox