Decorator Design Pattern in Java
/* Software Architecture Design Patterns in Java by Partha Kuchana Auerbach Publications */ import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.Properties; import java.util.Vector; public class DecoratorClient { public static void main(String[] args) { LoggerFactory factory = new LoggerFactory(); Logger logger = factory.getLogger(); HTMLLogger hLogger = new HTMLLogger(logger); //the decorator object provides the same interface. hLogger.log("A Message to Log"); EncryptLogger eLogger = new EncryptLogger(logger); eLogger.log("A Message to Log"); } } // End of class class ConsoleLogger implements Logger { public void log(String msg) { System.out.println(msg); } } class MiscUtil { public static boolean hasDuplicates(Vector v) { int i = 0; int j = 0; boolean duplicates = false; for (i = 0; i < v.size() - 1; i++) { for (j = (i + 1); j < v.size(); j++) { if (v.elementAt(i).toString().equalsIgnoreCase( v.elementAt(j).toString())) { duplicates = true; } } } return duplicates; } public static Vector removeDuplicates(Vector s) { int i = 0; int j = 0; boolean duplicates = false; Vector v = new Vector(); for (i = 0; i < s.size(); i++) { duplicates = false; for (j = (i + 1); j < s.size(); j++) { if (s.elementAt(i).toString().equalsIgnoreCase( s.elementAt(j).toString())) { duplicates = true; } } if (duplicates == false) { v.addElement(s.elementAt(i).toString().trim()); } } return v; } public static Vector removeDuplicateDomains(Vector s) { int i = 0; int j = 0; boolean duplicates = false; String str1 = ""; String str2 = ""; Vector v = new Vector(); for (i = 0; i < s.size(); i++) { duplicates = false; for (j = (i + 1); j < s.size(); j++) { str1 = ""; str2 = ""; str1 = s.elementAt(i).toString().trim(); str2 = s.elementAt(j).toString().trim(); if (str1.indexOf('@') > -1) { str1 = str1.substring(str1.indexOf('@')); } if (str2.indexOf('@') > -1) { str2 = str2.substring(str2.indexOf('@')); } if (str1.equalsIgnoreCase(str2)) { duplicates = true; } } if (duplicates == false) { v.addElement(s.elementAt(i).toString().trim()); } } return v; } public static boolean areVectorsEqual(Vector a, Vector b) { if (a.size() != b.size()) { return false; } int i = 0; int vectorSize = a.size(); boolean identical = true; for (i = 0; i < vectorSize; i++) { if (!(a.elementAt(i).toString().equalsIgnoreCase(b.elementAt(i) .toString()))) { identical = false; } } return identical; } public static Vector removeDuplicates(Vector a, Vector b) { int i = 0; int j = 0; boolean present = true; Vector v = new Vector(); for (i = 0; i < a.size(); i++) { present = false; for (j = 0; j < b.size(); j++) { if (a.elementAt(i).toString().equalsIgnoreCase( b.elementAt(j).toString())) { present = true; } } if (!(present)) { v.addElement(a.elementAt(i)); } } return v; } }// end of class class LoggerDecorator implements Logger { Logger logger; public LoggerDecorator(Logger inp_logger) { logger = inp_logger; } public void log(String DataLine) { /* * Default implementation to be overriden by subclasses. */ logger.log(DataLine); } }// end of class interface Logger { public void log(String msg); } class HTMLLogger extends LoggerDecorator { public HTMLLogger(Logger inp_logger) { super(inp_logger); } public void log(String DataLine) { /* * Added functionality */ DataLine = makeHTML(DataLine); /* * Now forward the encrypted text to the FileLogger for storage */ logger.log(DataLine); } public String makeHTML(String DataLine) { /* * Make it into an HTML document. */ DataLine = "<HTML><BODY>" + "<b>" + DataLine + "</b>" + "</BODY></HTML>"; return DataLine; } }// end of class class FileUtil { DataOutputStream dos; /* * Utility method to write a given text to a file */ public boolean writeToFile(String fileName, String dataLine, boolean isAppendMode, boolean isNewLine) { if (isNewLine) { dataLine = "\n" + dataLine; } try { File outFile = new File(fileName); if (isAppendMode) { dos = new DataOutputStream(new FileOutputStream(fileName, true)); } else { dos = new DataOutputStream(new FileOutputStream(outFile)); } dos.writeBytes(dataLine); dos.close(); } catch (FileNotFoundException ex) { return (false); } catch (IOException ex) { return (false); } return (true); } /* * Reads data from a given file */ public String readFromFile(String fileName) { String DataLine = ""; try { File inFile = new File(fileName); BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream(inFile))); DataLine = br.readLine(); br.close(); } catch (FileNotFoundException ex) { return (null); } catch (IOException ex) { return (null); } return (DataLine); } public boolean isFileExists(String fileName) { File file = new File(fileName); return file.exists(); } public boolean deleteFile(String fileName) { File file = new File(fileName); return file.delete(); } /* * Reads data from a given file into a Vector */ public Vector fileToVector(String fileName) { Vector v = new Vector(); String inputLine; try { File inFile = new File(fileName); BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream(inFile))); while ((inputLine = br.readLine()) != null) { v.addElement(inputLine.trim()); } br.close(); } // Try catch (FileNotFoundException ex) { // } catch (IOException ex) { // } return (v); } /* * Writes data from an input vector to a given file */ public void vectorToFile(Vector v, String fileName) { for (int i = 0; i < v.size(); i++) { writeToFile(fileName, (String) v.elementAt(i), true, true); } } /* * Copies unique rows from a source file to a destination file */ public void copyUniqueElements(String sourceFile, String resultFile) { Vector v = fileToVector(sourceFile); v = MiscUtil.removeDuplicates(v); vectorToFile(v, resultFile); } } // end FileUtil class FileLogger implements Logger { private static FileLogger logger; //Prevent clients from using the constructor private FileLogger() { } public static FileLogger getFileLogger() { if (logger == null) { logger = new FileLogger(); } return logger; } public synchronized void log(String msg) { FileUtil futil = new FileUtil(); futil.writeToFile("log.txt", msg, true, true); } } class EncryptLogger extends LoggerDecorator { public EncryptLogger(Logger inp_logger) { super(inp_logger); } public void log(String DataLine) { /* * Added functionality */ DataLine = encrypt(DataLine); /* * Now forward the encrypted text to the FileLogger for storage */ logger.log(DataLine); } public String encrypt(String DataLine) { /* * Apply simple encryption by Transposition... Shift all characters by * one position. */ DataLine = DataLine.substring(DataLine.length() - 1) + DataLine.substring(0, DataLine.length() - 1); return DataLine; } }// end of class class LoggerFactory { public boolean isFileLoggingEnabled() { Properties p = new Properties(); try { p.load(ClassLoader.getSystemResourceAsStream("Logger.properties")); String fileLoggingValue = p.getProperty("FileLogging"); if (fileLoggingValue.equalsIgnoreCase("ON") == true) return true; else return false; } catch (IOException e) { return false; } } public Logger getLogger() { if (isFileLoggingEnabled()) { return FileLogger.getFileLogger(); } else { return new ConsoleLogger(); } } }
1. | Decorator Pattern 1 | ||
2. | Decorator pattern in Java |