<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FDecorator_Pattern</id>
		<title>Java/Design Pattern/Decorator Pattern - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FDecorator_Pattern"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Design_Pattern/Decorator_Pattern&amp;action=history"/>
		<updated>2026-04-22T02:08:35Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Design_Pattern/Decorator_Pattern&amp;diff=7817&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Design_Pattern/Decorator_Pattern&amp;diff=7817&amp;oldid=prev"/>
				<updated>2010-06-01T06:50:52Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:50, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Design_Pattern/Decorator_Pattern&amp;diff=7816&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Design_Pattern/Decorator_Pattern&amp;diff=7816&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:45Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Decorator Design Pattern in Java ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Software Architecture Design Patterns in Java&lt;br /&gt;
by Partha Kuchana &lt;br /&gt;
Auerbach Publications&lt;br /&gt;
*/&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.DataOutputStream;&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileInputStream;&lt;br /&gt;
import java.io.FileNotFoundException;&lt;br /&gt;
import java.io.FileOutputStream;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.util.Properties;&lt;br /&gt;
import java.util.Vector;&lt;br /&gt;
public class DecoratorClient {&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    LoggerFactory factory = new LoggerFactory();&lt;br /&gt;
    Logger logger = factory.getLogger();&lt;br /&gt;
    HTMLLogger hLogger = new HTMLLogger(logger);&lt;br /&gt;
    //the decorator object provides the same interface.&lt;br /&gt;
    hLogger.log(&amp;quot;A Message to Log&amp;quot;);&lt;br /&gt;
    EncryptLogger eLogger = new EncryptLogger(logger);&lt;br /&gt;
    eLogger.log(&amp;quot;A Message to Log&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
} // End of class&lt;br /&gt;
class ConsoleLogger implements Logger {&lt;br /&gt;
  public void log(String msg) {&lt;br /&gt;
    System.out.println(msg);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class MiscUtil {&lt;br /&gt;
  public static boolean hasDuplicates(Vector v) {&lt;br /&gt;
    int i = 0;&lt;br /&gt;
    int j = 0;&lt;br /&gt;
    boolean duplicates = false;&lt;br /&gt;
    for (i = 0; i &amp;lt; v.size() - 1; i++) {&lt;br /&gt;
      for (j = (i + 1); j &amp;lt; v.size(); j++) {&lt;br /&gt;
        if (v.elementAt(i).toString().equalsIgnoreCase(&lt;br /&gt;
            v.elementAt(j).toString())) {&lt;br /&gt;
          duplicates = true;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return duplicates;&lt;br /&gt;
  }&lt;br /&gt;
  public static Vector removeDuplicates(Vector s) {&lt;br /&gt;
    int i = 0;&lt;br /&gt;
    int j = 0;&lt;br /&gt;
    boolean duplicates = false;&lt;br /&gt;
    Vector v = new Vector();&lt;br /&gt;
    for (i = 0; i &amp;lt; s.size(); i++) {&lt;br /&gt;
      duplicates = false;&lt;br /&gt;
      for (j = (i + 1); j &amp;lt; s.size(); j++) {&lt;br /&gt;
        if (s.elementAt(i).toString().equalsIgnoreCase(&lt;br /&gt;
            s.elementAt(j).toString())) {&lt;br /&gt;
          duplicates = true;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      if (duplicates == false) {&lt;br /&gt;
        v.addElement(s.elementAt(i).toString().trim());&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return v;&lt;br /&gt;
  }&lt;br /&gt;
  public static Vector removeDuplicateDomains(Vector s) {&lt;br /&gt;
    int i = 0;&lt;br /&gt;
    int j = 0;&lt;br /&gt;
    boolean duplicates = false;&lt;br /&gt;
    String str1 = &amp;quot;&amp;quot;;&lt;br /&gt;
    String str2 = &amp;quot;&amp;quot;;&lt;br /&gt;
    Vector v = new Vector();&lt;br /&gt;
    for (i = 0; i &amp;lt; s.size(); i++) {&lt;br /&gt;
      duplicates = false;&lt;br /&gt;
      for (j = (i + 1); j &amp;lt; s.size(); j++) {&lt;br /&gt;
        str1 = &amp;quot;&amp;quot;;&lt;br /&gt;
        str2 = &amp;quot;&amp;quot;;&lt;br /&gt;
        str1 = s.elementAt(i).toString().trim();&lt;br /&gt;
        str2 = s.elementAt(j).toString().trim();&lt;br /&gt;
        if (str1.indexOf(&amp;quot;@&amp;quot;) &amp;gt; -1) {&lt;br /&gt;
          str1 = str1.substring(str1.indexOf(&amp;quot;@&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        if (str2.indexOf(&amp;quot;@&amp;quot;) &amp;gt; -1) {&lt;br /&gt;
          str2 = str2.substring(str2.indexOf(&amp;quot;@&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        if (str1.equalsIgnoreCase(str2)) {&lt;br /&gt;
          duplicates = true;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      if (duplicates == false) {&lt;br /&gt;
        v.addElement(s.elementAt(i).toString().trim());&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return v;&lt;br /&gt;
  }&lt;br /&gt;
  public static boolean areVectorsEqual(Vector a, Vector b) {&lt;br /&gt;
    if (a.size() != b.size()) {&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
    int i = 0;&lt;br /&gt;
    int vectorSize = a.size();&lt;br /&gt;
    boolean identical = true;&lt;br /&gt;
    for (i = 0; i &amp;lt; vectorSize; i++) {&lt;br /&gt;
      if (!(a.elementAt(i).toString().equalsIgnoreCase(b.elementAt(i)&lt;br /&gt;
          .toString()))) {&lt;br /&gt;
        identical = false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return identical;&lt;br /&gt;
  }&lt;br /&gt;
  public static Vector removeDuplicates(Vector a, Vector b) {&lt;br /&gt;
    int i = 0;&lt;br /&gt;
    int j = 0;&lt;br /&gt;
    boolean present = true;&lt;br /&gt;
    Vector v = new Vector();&lt;br /&gt;
    for (i = 0; i &amp;lt; a.size(); i++) {&lt;br /&gt;
      present = false;&lt;br /&gt;
      for (j = 0; j &amp;lt; b.size(); j++) {&lt;br /&gt;
        if (a.elementAt(i).toString().equalsIgnoreCase(&lt;br /&gt;
            b.elementAt(j).toString())) {&lt;br /&gt;
          present = true;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      if (!(present)) {&lt;br /&gt;
        v.addElement(a.elementAt(i));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return v;&lt;br /&gt;
  }&lt;br /&gt;
}// end of class&lt;br /&gt;
class LoggerDecorator implements Logger {&lt;br /&gt;
  Logger logger;&lt;br /&gt;
  public LoggerDecorator(Logger inp_logger) {&lt;br /&gt;
    logger = inp_logger;&lt;br /&gt;
  }&lt;br /&gt;
  public void log(String DataLine) {&lt;br /&gt;
    /*&lt;br /&gt;
     * Default implementation to be overriden by subclasses.&lt;br /&gt;
     */&lt;br /&gt;
    logger.log(DataLine);&lt;br /&gt;
  }&lt;br /&gt;
}// end of class&lt;br /&gt;
interface Logger {&lt;br /&gt;
  public void log(String msg);&lt;br /&gt;
}&lt;br /&gt;
class HTMLLogger extends LoggerDecorator {&lt;br /&gt;
  public HTMLLogger(Logger inp_logger) {&lt;br /&gt;
    super(inp_logger);&lt;br /&gt;
  }&lt;br /&gt;
  public void log(String DataLine) {&lt;br /&gt;
    /*&lt;br /&gt;
     * Added functionality&lt;br /&gt;
     */&lt;br /&gt;
    DataLine = makeHTML(DataLine);&lt;br /&gt;
    /*&lt;br /&gt;
     * Now forward the encrypted text to the FileLogger for storage&lt;br /&gt;
     */&lt;br /&gt;
    logger.log(DataLine);&lt;br /&gt;
  }&lt;br /&gt;
  public String makeHTML(String DataLine) {&lt;br /&gt;
    /*&lt;br /&gt;
     * Make it into an HTML document.&lt;br /&gt;
     */&lt;br /&gt;
    DataLine = &amp;quot;&amp;lt;HTML&amp;gt;&amp;lt;BODY&amp;gt;&amp;quot; + &amp;quot;&amp;lt;b&amp;gt;&amp;quot; + DataLine + &amp;quot;&amp;lt;/b&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;&amp;quot;;&lt;br /&gt;
    return DataLine;&lt;br /&gt;
  }&lt;br /&gt;
}// end of class&lt;br /&gt;
class FileUtil {&lt;br /&gt;
  DataOutputStream dos;&lt;br /&gt;
  /*&lt;br /&gt;
   * Utility method to write a given text to a file&lt;br /&gt;
   */&lt;br /&gt;
  public boolean writeToFile(String fileName, String dataLine,&lt;br /&gt;
      boolean isAppendMode, boolean isNewLine) {&lt;br /&gt;
    if (isNewLine) {&lt;br /&gt;
      dataLine = &amp;quot;\n&amp;quot; + dataLine;&lt;br /&gt;
    }&lt;br /&gt;
    try {&lt;br /&gt;
      File outFile = new File(fileName);&lt;br /&gt;
      if (isAppendMode) {&lt;br /&gt;
        dos = new DataOutputStream(new FileOutputStream(fileName, true));&lt;br /&gt;
      } else {&lt;br /&gt;
        dos = new DataOutputStream(new FileOutputStream(outFile));&lt;br /&gt;
      }&lt;br /&gt;
      dos.writeBytes(dataLine);&lt;br /&gt;
      dos.close();&lt;br /&gt;
    } catch (FileNotFoundException ex) {&lt;br /&gt;
      return (false);&lt;br /&gt;
    } catch (IOException ex) {&lt;br /&gt;
      return (false);&lt;br /&gt;
    }&lt;br /&gt;
    return (true);&lt;br /&gt;
  }&lt;br /&gt;
  /*&lt;br /&gt;
   * Reads data from a given file&lt;br /&gt;
   */&lt;br /&gt;
  public String readFromFile(String fileName) {&lt;br /&gt;
    String DataLine = &amp;quot;&amp;quot;;&lt;br /&gt;
    try {&lt;br /&gt;
      File inFile = new File(fileName);&lt;br /&gt;
      BufferedReader br = new BufferedReader(new InputStreamReader(&lt;br /&gt;
          new FileInputStream(inFile)));&lt;br /&gt;
      DataLine = br.readLine();&lt;br /&gt;
      br.close();&lt;br /&gt;
    } catch (FileNotFoundException ex) {&lt;br /&gt;
      return (null);&lt;br /&gt;
    } catch (IOException ex) {&lt;br /&gt;
      return (null);&lt;br /&gt;
    }&lt;br /&gt;
    return (DataLine);&lt;br /&gt;
  }&lt;br /&gt;
  public boolean isFileExists(String fileName) {&lt;br /&gt;
    File file = new File(fileName);&lt;br /&gt;
    return file.exists();&lt;br /&gt;
  }&lt;br /&gt;
  public boolean deleteFile(String fileName) {&lt;br /&gt;
    File file = new File(fileName);&lt;br /&gt;
    return file.delete();&lt;br /&gt;
  }&lt;br /&gt;
  /*&lt;br /&gt;
   * Reads data from a given file into a Vector&lt;br /&gt;
   */&lt;br /&gt;
  public Vector fileToVector(String fileName) {&lt;br /&gt;
    Vector v = new Vector();&lt;br /&gt;
    String inputLine;&lt;br /&gt;
    try {&lt;br /&gt;
      File inFile = new File(fileName);&lt;br /&gt;
      BufferedReader br = new BufferedReader(new InputStreamReader(&lt;br /&gt;
          new FileInputStream(inFile)));&lt;br /&gt;
      while ((inputLine = br.readLine()) != null) {&lt;br /&gt;
        v.addElement(inputLine.trim());&lt;br /&gt;
      }&lt;br /&gt;
      br.close();&lt;br /&gt;
    } // Try&lt;br /&gt;
    catch (FileNotFoundException ex) {&lt;br /&gt;
      //&lt;br /&gt;
    } catch (IOException ex) {&lt;br /&gt;
      //&lt;br /&gt;
    }&lt;br /&gt;
    return (v);&lt;br /&gt;
  }&lt;br /&gt;
  /*&lt;br /&gt;
   * Writes data from an input vector to a given file&lt;br /&gt;
   */&lt;br /&gt;
  public void vectorToFile(Vector v, String fileName) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; v.size(); i++) {&lt;br /&gt;
      writeToFile(fileName, (String) v.elementAt(i), true, true);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /*&lt;br /&gt;
   * Copies unique rows from a source file to a destination file&lt;br /&gt;
   */&lt;br /&gt;
  public void copyUniqueElements(String sourceFile, String resultFile) {&lt;br /&gt;
    Vector v = fileToVector(sourceFile);&lt;br /&gt;
    v = MiscUtil.removeDuplicates(v);&lt;br /&gt;
    vectorToFile(v, resultFile);&lt;br /&gt;
  }&lt;br /&gt;
} // end FileUtil&lt;br /&gt;
class FileLogger implements Logger {&lt;br /&gt;
  private static FileLogger logger;&lt;br /&gt;
  //Prevent clients from using the constructor&lt;br /&gt;
  private FileLogger() {&lt;br /&gt;
  }&lt;br /&gt;
  public static FileLogger getFileLogger() {&lt;br /&gt;
    if (logger == null) {&lt;br /&gt;
      logger = new FileLogger();&lt;br /&gt;
    }&lt;br /&gt;
    return logger;&lt;br /&gt;
  }&lt;br /&gt;
  public synchronized void log(String msg) {&lt;br /&gt;
    FileUtil futil = new FileUtil();&lt;br /&gt;
    futil.writeToFile(&amp;quot;log.txt&amp;quot;, msg, true, true);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class EncryptLogger extends LoggerDecorator {&lt;br /&gt;
  public EncryptLogger(Logger inp_logger) {&lt;br /&gt;
    super(inp_logger);&lt;br /&gt;
  }&lt;br /&gt;
  public void log(String DataLine) {&lt;br /&gt;
    /*&lt;br /&gt;
     * Added functionality&lt;br /&gt;
     */&lt;br /&gt;
    DataLine = encrypt(DataLine);&lt;br /&gt;
    /*&lt;br /&gt;
     * Now forward the encrypted text to the FileLogger for storage&lt;br /&gt;
     */&lt;br /&gt;
    logger.log(DataLine);&lt;br /&gt;
  }&lt;br /&gt;
  public String encrypt(String DataLine) {&lt;br /&gt;
    /*&lt;br /&gt;
     * Apply simple encryption by Transposition... Shift all characters by&lt;br /&gt;
     * one position.&lt;br /&gt;
     */&lt;br /&gt;
    DataLine = DataLine.substring(DataLine.length() - 1)&lt;br /&gt;
        + DataLine.substring(0, DataLine.length() - 1);&lt;br /&gt;
    return DataLine;&lt;br /&gt;
  }&lt;br /&gt;
}// end of class&lt;br /&gt;
class LoggerFactory {&lt;br /&gt;
  public boolean isFileLoggingEnabled() {&lt;br /&gt;
    Properties p = new Properties();&lt;br /&gt;
    try {&lt;br /&gt;
      p.load(ClassLoader.getSystemResourceAsStream(&amp;quot;Logger.properties&amp;quot;));&lt;br /&gt;
      String fileLoggingValue = p.getProperty(&amp;quot;FileLogging&amp;quot;);&lt;br /&gt;
      if (fileLoggingValue.equalsIgnoreCase(&amp;quot;ON&amp;quot;) == true)&lt;br /&gt;
        return true;&lt;br /&gt;
      else&lt;br /&gt;
        return false;&lt;br /&gt;
    } catch (IOException e) {&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public Logger getLogger() {&lt;br /&gt;
    if (isFileLoggingEnabled()) {&lt;br /&gt;
      return FileLogger.getFileLogger();&lt;br /&gt;
    } else {&lt;br /&gt;
      return new ConsoleLogger();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Decorator Pattern 1  ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//[C] 2002 Sun Microsystems, Inc.---&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Iterator;&lt;br /&gt;
public class RunDecoratorPattern {&lt;br /&gt;
    public static void main(String [] arguments){&lt;br /&gt;
        System.out.println(&amp;quot;Example for the Decorator pattern&amp;quot;);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        System.out.println(&amp;quot;This demonstration will show how Decorator classes can be used&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; to extend the basic functionality of ProjectItems. The Task and&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; Deliverable classes provide the basic ProjectItems, and their&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; functionality will be extended by adding subclasses of the&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; abstract class ProjectDecorator.&amp;quot;);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        System.out.println(&amp;quot;Note that the toString method has been overridden for all ProjectItems,&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; to more effectively show how Decorators are associated with their&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; ProjectItems.&amp;quot;);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;Creating ProjectItems.&amp;quot;);&lt;br /&gt;
        Contact contact1 = new ContactImpl(&amp;quot;Simone&amp;quot;, &amp;quot;Roberto&amp;quot;, &amp;quot;Head Researcher and Chief Archivist&amp;quot;, &amp;quot;Institute for Advanced (Java) Studies&amp;quot;);&lt;br /&gt;
        Task task1 = new Task(&amp;quot;Perform months of diligent research&amp;quot;, contact1, 20.0);&lt;br /&gt;
        Task task2 = new Task(&amp;quot;Obtain grant from World Java Foundation&amp;quot;, contact1, 40.0);&lt;br /&gt;
        Deliverable deliverable1 = new Deliverable(&amp;quot;Java History&amp;quot;, &amp;quot;Comprehensive history of the design of all Java APIs&amp;quot;, contact1);&lt;br /&gt;
        System.out.println(&amp;quot;ProjectItem objects created. Results:&amp;quot;);&lt;br /&gt;
        System.out.println(task1);&lt;br /&gt;
        System.out.println(task2);&lt;br /&gt;
        System.out.println(deliverable1);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;Creating decorators&amp;quot;);&lt;br /&gt;
        ProjectDecorator decorator1 = new SupportedProjectItem(new File(&amp;quot;JavaHistory.txt&amp;quot;));&lt;br /&gt;
        ProjectDecorator decorator2 = new DependentProjectItem(task2);&lt;br /&gt;
        System.out.println(&amp;quot;Decorators created. Adding decorators to the first task&amp;quot;);&lt;br /&gt;
        decorator1.setProjectItem(task1);&lt;br /&gt;
        decorator2.setProjectItem(decorator1);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        System.out.println(&amp;quot;Decorators added. Results&amp;quot;);&lt;br /&gt;
        System.out.println(decorator2);&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
interface Contact extends Serializable{&lt;br /&gt;
    public static final String SPACE = &amp;quot; &amp;quot;;&lt;br /&gt;
    public String getFirstName();&lt;br /&gt;
    public String getLastName();&lt;br /&gt;
    public String getTitle();&lt;br /&gt;
    public String getOrganization();&lt;br /&gt;
    &lt;br /&gt;
    public void setFirstName(String newFirstName);&lt;br /&gt;
    public void setLastName(String newLastName);&lt;br /&gt;
    public void setTitle(String newTitle);&lt;br /&gt;
    public void setOrganization(String newOrganization);&lt;br /&gt;
}&lt;br /&gt;
class ContactImpl implements Contact{&lt;br /&gt;
    private String firstName;&lt;br /&gt;
    private String lastName;&lt;br /&gt;
    private String title;&lt;br /&gt;
    private String organization;&lt;br /&gt;
    &lt;br /&gt;
    public ContactImpl(){}&lt;br /&gt;
    public ContactImpl(String newFirstName, String newLastName,&lt;br /&gt;
        String newTitle, String newOrganization){&lt;br /&gt;
            firstName = newFirstName;&lt;br /&gt;
            lastName = newLastName;&lt;br /&gt;
            title = newTitle;&lt;br /&gt;
            organization = newOrganization;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public String getFirstName(){ return firstName; }&lt;br /&gt;
    public String getLastName(){ return lastName; }&lt;br /&gt;
    public String getTitle(){ return title; }&lt;br /&gt;
    public String getOrganization(){ return organization; }&lt;br /&gt;
    &lt;br /&gt;
    public void setFirstName(String newFirstName){ firstName = newFirstName; }&lt;br /&gt;
    public void setLastName(String newLastName){ lastName = newLastName; }&lt;br /&gt;
    public void setTitle(String newTitle){ title = newTitle; }&lt;br /&gt;
    public void setOrganization(String newOrganization){ organization = newOrganization; }&lt;br /&gt;
    &lt;br /&gt;
    public String toString(){&lt;br /&gt;
        return firstName + SPACE + lastName;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class Deliverable implements ProjectItem{&lt;br /&gt;
    private String name;&lt;br /&gt;
    private String description;&lt;br /&gt;
    private Contact owner;&lt;br /&gt;
    &lt;br /&gt;
    public Deliverable(){ }&lt;br /&gt;
    public Deliverable(String newName, String newDescription,&lt;br /&gt;
        Contact newOwner){&lt;br /&gt;
        name = newName;&lt;br /&gt;
        description = newDescription;&lt;br /&gt;
        owner = newOwner;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public String getName(){ return name; }&lt;br /&gt;
    public String getDescription(){ return description; }&lt;br /&gt;
    public Contact getOwner(){ return owner; }&lt;br /&gt;
    public double getTimeRequired(){ return 0; }&lt;br /&gt;
    &lt;br /&gt;
    public void setName(String newName){ name = newName; }&lt;br /&gt;
    public void setDescription(String newDescription){ description = newDescription; }&lt;br /&gt;
    public void setOwner(Contact newOwner){ owner = newOwner; }&lt;br /&gt;
    &lt;br /&gt;
    public String toString(){&lt;br /&gt;
        return &amp;quot;Deliverable: &amp;quot; + name;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class DependentProjectItem extends ProjectDecorator{&lt;br /&gt;
    private ProjectItem dependentItem;&lt;br /&gt;
    &lt;br /&gt;
    public DependentProjectItem(){ }&lt;br /&gt;
    public DependentProjectItem(ProjectItem newDependentItem){&lt;br /&gt;
        dependentItem = newDependentItem;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public ProjectItem getDependentItem(){ return dependentItem; }&lt;br /&gt;
    &lt;br /&gt;
    public void setDependentItem(ProjectItem newDependentItem){ dependentItem = newDependentItem; }&lt;br /&gt;
    &lt;br /&gt;
    public String toString(){&lt;br /&gt;
        return getProjectItem().toString() + EOL_STRING&lt;br /&gt;
            + &amp;quot;\tProjectItem dependent on: &amp;quot; + dependentItem;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
abstract class ProjectDecorator implements ProjectItem{&lt;br /&gt;
    private ProjectItem projectItem;&lt;br /&gt;
    &lt;br /&gt;
    protected ProjectItem getProjectItem(){ return projectItem; }&lt;br /&gt;
    public void setProjectItem(ProjectItem newProjectItem){ projectItem = newProjectItem; }&lt;br /&gt;
    &lt;br /&gt;
    public double getTimeRequired(){&lt;br /&gt;
        return projectItem.getTimeRequired();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
interface ProjectItem extends Serializable{&lt;br /&gt;
    public static final String EOL_STRING = System.getProperty(&amp;quot;line.separator&amp;quot;);&lt;br /&gt;
    public double getTimeRequired();&lt;br /&gt;
}&lt;br /&gt;
class Task implements ProjectItem{&lt;br /&gt;
    private String name;&lt;br /&gt;
    private ArrayList projectItems = new ArrayList();&lt;br /&gt;
    private Contact owner;&lt;br /&gt;
    private double timeRequired;&lt;br /&gt;
    &lt;br /&gt;
    public Task(){ }&lt;br /&gt;
    public Task(String newName, Contact newOwner,&lt;br /&gt;
        double newTimeRequired){&lt;br /&gt;
        name = newName;&lt;br /&gt;
        owner = newOwner;&lt;br /&gt;
        timeRequired = newTimeRequired;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public String getName(){ return name; }&lt;br /&gt;
    public ArrayList getProjectItems(){ return projectItems; }&lt;br /&gt;
    public Contact getOwner(){ return owner; }&lt;br /&gt;
    public double getTimeRequired(){&lt;br /&gt;
        double totalTime = timeRequired;&lt;br /&gt;
        Iterator items = projectItems.iterator();&lt;br /&gt;
        while(items.hasNext()){&lt;br /&gt;
            ProjectItem item = (ProjectItem)items.next();&lt;br /&gt;
            totalTime += item.getTimeRequired();&lt;br /&gt;
        }&lt;br /&gt;
        return totalTime;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void setName(String newName){ name = newName; }&lt;br /&gt;
    public void setOwner(Contact newOwner){ owner = newOwner; }&lt;br /&gt;
    public void setTimeRequired(double newTimeRequired){ timeRequired = newTimeRequired; }&lt;br /&gt;
    &lt;br /&gt;
    public void addProjectItem(ProjectItem element){&lt;br /&gt;
        if (!projectItems.contains(element)){&lt;br /&gt;
            projectItems.add(element);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public void removeProjectItem(ProjectItem element){&lt;br /&gt;
        projectItems.remove(element);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public String toString(){&lt;br /&gt;
        return &amp;quot;Task: &amp;quot; + name;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class SupportedProjectItem extends ProjectDecorator{&lt;br /&gt;
    private ArrayList supportingDocuments = new ArrayList();&lt;br /&gt;
    &lt;br /&gt;
    public SupportedProjectItem(){ }&lt;br /&gt;
    public SupportedProjectItem(File newSupportingDocument){&lt;br /&gt;
        addSupportingDocument(newSupportingDocument);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public ArrayList getSupportingDocuments(){&lt;br /&gt;
        return supportingDocuments;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void addSupportingDocument(File document){&lt;br /&gt;
        if (!supportingDocuments.contains(document)){&lt;br /&gt;
            supportingDocuments.add(document);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void removeSupportingDocument(File document){&lt;br /&gt;
        supportingDocuments.remove(document);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public String toString(){&lt;br /&gt;
        return getProjectItem().toString() + EOL_STRING&lt;br /&gt;
            + &amp;quot;\tSupporting Documents: &amp;quot; + supportingDocuments;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Decorator pattern in Java ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
The Design Patterns Java Companion&lt;br /&gt;
Copyright (C) 1998, by James W. Cooper&lt;br /&gt;
IBM Thomas J. Watson Research Center&lt;br /&gt;
*/&lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.Dimension;&lt;br /&gt;
import java.awt.Graphics;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import java.awt.event.MouseAdapter;&lt;br /&gt;
import java.awt.event.MouseEvent;&lt;br /&gt;
import java.awt.event.WindowAdapter;&lt;br /&gt;
import java.awt.event.WindowEvent;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JComponent;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
public class DecoWindow extends JFrame implements ActionListener {&lt;br /&gt;
  JButton Quit;&lt;br /&gt;
  public DecoWindow() {&lt;br /&gt;
    super(&amp;quot;Deco Button&amp;quot;);&lt;br /&gt;
    addWindowListener(new WindowAdapter() {&lt;br /&gt;
      public void windowClosing(WindowEvent e) {&lt;br /&gt;
        System.exit(0);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
    JPanel jp = new JPanel();&lt;br /&gt;
    getContentPane().add(jp);&lt;br /&gt;
    jp.add(new CoolDecorator(new JButton(&amp;quot;Cbutton&amp;quot;)));&lt;br /&gt;
    jp.add(new SlashDecorator(new CoolDecorator(new JButton(&amp;quot;Dbutton&amp;quot;))));&lt;br /&gt;
    //jp.add( new CoolDecorator(new JButton(&amp;quot;Dbutton&amp;quot;)));&lt;br /&gt;
    jp.add(Quit = new JButton(&amp;quot;Quit&amp;quot;));&lt;br /&gt;
    Quit.addActionListener(this);&lt;br /&gt;
    setSize(new Dimension(200, 100));&lt;br /&gt;
    setVisible(true);&lt;br /&gt;
    Quit.requestFocus();&lt;br /&gt;
  }&lt;br /&gt;
  public void actionPerformed(ActionEvent e) {&lt;br /&gt;
    System.exit(0);&lt;br /&gt;
  }&lt;br /&gt;
  static public void main(String argv[]) {&lt;br /&gt;
    new DecoWindow();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Decorator extends JComponent {&lt;br /&gt;
  public Decorator(JComponent c) {&lt;br /&gt;
    setLayout(new BorderLayout());&lt;br /&gt;
    add(&amp;quot;Center&amp;quot;, c);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class SlashDecorator extends Decorator {&lt;br /&gt;
  int x1, y1, w1, h1;&lt;br /&gt;
  public SlashDecorator(JComponent c) {&lt;br /&gt;
    super(c);&lt;br /&gt;
  }&lt;br /&gt;
  public void setBounds(int x, int y, int w, int h) {&lt;br /&gt;
    x1 = x;&lt;br /&gt;
    y1 = y;&lt;br /&gt;
    w1 = w;&lt;br /&gt;
    h1 = h;&lt;br /&gt;
    super.setBounds(x, y, w, h);&lt;br /&gt;
  }&lt;br /&gt;
  public void paint(Graphics g) {&lt;br /&gt;
    super.paint(g);&lt;br /&gt;
    g.setColor(Color.red);&lt;br /&gt;
    g.drawLine(0, 0, w1, h1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class CoolDecorator extends Decorator {&lt;br /&gt;
  boolean mouse_over; //true when mose over button&lt;br /&gt;
  JComponent thisComp;&lt;br /&gt;
  public CoolDecorator(JComponent c) {&lt;br /&gt;
    super(c);&lt;br /&gt;
    mouse_over = false;&lt;br /&gt;
    thisComp = this; //save this component&lt;br /&gt;
    //catch mouse movements in inner class&lt;br /&gt;
    c.addMouseListener(new MouseAdapter() {&lt;br /&gt;
      public void mouseEntered(MouseEvent e) {&lt;br /&gt;
        mouse_over = true; //set flag when mouse over&lt;br /&gt;
        thisComp.repaint();&lt;br /&gt;
      }&lt;br /&gt;
      public void mouseExited(MouseEvent e) {&lt;br /&gt;
        mouse_over = false; //clear flag when mouse not over&lt;br /&gt;
        thisComp.repaint();&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  //paint the button&lt;br /&gt;
  public void paint(Graphics g) {&lt;br /&gt;
    super.paint(g); //first draw the parent button&lt;br /&gt;
    if (!mouse_over)&lt;br /&gt;
    //if the mouse is not over the button&lt;br /&gt;
    //erase the borders&lt;br /&gt;
    {&lt;br /&gt;
      Dimension size = super.getSize();&lt;br /&gt;
      g.setColor(Color.lightGray);&lt;br /&gt;
      g.drawRect(0, 0, size.width - 1, size.height - 1);&lt;br /&gt;
      g.drawLine(size.width - 2, 0, size.width - 2, size.height - 1);&lt;br /&gt;
      g.drawLine(0, size.height - 2, size.width - 2, size.height - 2);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>