1 //----------------------------------------------------------------------
2 //
3 // PerfectJPattern: "Design patterns are good but components are better!"
4 // Example.java Copyright (c) 2009 Giovanni Azua Garcia
5 // bravegag@hotmail.com
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License
9 // as published by the Free Software Foundation; either version 3
10 // of the License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, see <http://www.gnu.org/licenses/>.
19 //
20 //----------------------------------------------------------------------
21 package org.perfectjpattern.core.behavioral.delegate;
22
23 import java.util.*;
24
25 import org.perfectjpattern.core.api.extras.delegate.*;
26 import org.perfectjpattern.core.extras.delegate.*;
27 import org.slf4j.*;
28
29 /**
30 * Startup Main for the Delegate Pattern Example code
31 *
32 * @author <a href="mailto:bravegag@hotmail.com">Giovanni Azua</a>
33 * @version $Revision: 1.0 $Date: Apr 5, 2008 10:11:17 PM $
34 */
35 //CHECKSTYLE:OFF
36 public final
37 class Example
38 // CHECKSTYLE:ON
39 {
40 //------------------------------------------------------------------------
41 // public
42 //------------------------------------------------------------------------
43 public static void
44 main(String[] anArguments)
45 {
46 //---------------------------------------------------------------
47 // Arbitrary types that have a size awareness but do not
48 // share a common interface, therefore it could not be possible
49 // writing a reusable code to get their sizes in a single way.
50 // In this case without using Delegates, different adapter
51 // implementations would be required:
52 //
53 // * String.length() is a function
54 // * StringBuilder.length() is another function
55 // * List.size() is another function
56 //---------------------------------------------------------------
57 String myString = "Remember String instances are immutable ...";
58 theLogger.debug(myString);
59 theLogger.debug("String length is: '" + myString.length() + "'");
60
61 StringBuilder myBuilder = new StringBuilder();
62 myBuilder.append("StringBuilder on the other hand");
63 myBuilder.append("are not immutable");
64 theLogger.debug(myBuilder.toString());
65 theLogger.debug("Builder length is: '" + myBuilder.length() + "'");
66
67 List<Integer> myList = new ArrayList<Integer>();
68 myList.add(Integer.valueOf(0));
69 myList.add(Integer.valueOf(1));
70 myList.add(Integer.valueOf(2));
71 myList.add(Integer.valueOf(3));
72 myList.add(Integer.valueOf(4));
73 theLogger.debug(Arrays.deepToString(myList.toArray()));
74 theLogger.debug("List size is: '" + myList.size() + "'");
75
76 //---------------------------------------------------------------
77 // Create a delegate that unifies the interface view of all different
78 // non-matching types and method signatures
79 //---------------------------------------------------------------
80 IDelegator<ISizeAware> myDelegator = new Delegator<ISizeAware>(
81 ISizeAware.class);
82
83 //---------------------------------------------------------------
84 // Create the delegates i.e. "function pointers"
85 //---------------------------------------------------------------
86 List<ISizeAware> mySizeAwares = new ArrayList<ISizeAware>();
87 mySizeAwares.add(myDelegator.build(myString, "length"));
88 mySizeAwares.add(myDelegator.build(myBuilder, "length"));
89 mySizeAwares.add(myDelegator.build(myList, "size"));
90
91 //---------------------------------------------------------------
92 // Use the delegates
93 //---------------------------------------------------------------
94 for (ISizeAware mySizeAware : mySizeAwares)
95 {
96 theLogger.debug(String.valueOf(mySizeAware.getSize()));
97 }
98 }
99
100 //------------------------------------------------------------------------
101 // protected
102 //------------------------------------------------------------------------
103 protected static void
104 setLogger(Logger aLogger)
105 {
106 theLogger = aLogger;
107 }
108
109 //------------------------------------------------------------------------
110 // members
111 //------------------------------------------------------------------------
112 /**
113 * Provides logging facilities for this class
114 */
115 private static Logger theLogger = LoggerFactory.getLogger(Example.class);
116 }