1st Iteration - Implementation Steps
Each of these steps can be compiled and run as is. The steps are an example if iterative implementation. This is the actual unretouched code from Jack's first pass at this, except for step 6 which was the last step of the second pass, done for the Accelerated UHR Study Group at REALM on 4/13/99.
Step 1
// 1 - PartA with startPart(), no interface, // UnitTest with PartA.main(). /** * This class is a very simple test part. */ public class PartA { //---------- Initialization ------------------------------ public static void main(String args[]) { new PartA().startPart(); } //---------- Public Methods ------------------------------ public void startPart() { print(".startPart() - Entered"); } //---------- Private Methods ----------------------------- //--- Std private static void print(String text) { System.out.println("PartA" + text); } } // End class
Step 2
// 1 - PartA with startPart(), no interface, // UnitTest with PartA.main(). // 2 - Ditto with PartB, Unit Test by modifying // PartA.main(). public class PartA { //---------- Initialization ------------------------------ public static void main(String args[]) { new PartA().startPart(); new PartB().startPart(); } //---------- Public Methods ------------------------------ public void startPart() { print(".startPart() - Entered"); } //---------- Private Methods ----------------------------- //--- Std private static void print(String text) { System.out.println("PartA" + text); } } // End class //======================================================== class PartB { //---------- Public Methods ------------------------------ public void startPart() { print(".startPart() - Entered"); } //---------- Private Methods ----------------------------- //--- Std private static void print(String text) { System.out.println("PartB" + text); } } // End class
Step 3
// 1 - PartA with startPart(), no interface, // UnitTest with PartA.main(). // 2 - Ditto with PartB, Unit Test by modifying // PartA.main(). // 3. Create PartContext with no methods, create Part // interface with all methods, modify PartA and B to // implement Part, modify Unit Test to use Part interface. public class PartA implements Part { //---------- Initialization ------------------------------ public static void main(String args[]) { Part partA = new PartA(); partA.startPart(); Part partB = new PartB(); partB.startPart(); } //---------- Part Implementation ------------------------- public void setPartContext(PartContext context) { print(".setPartContext() - Not yet Implemented"); } public void startPart() { print(".startPart() - Entered"); } //---------- Private Methods ----------------------------- //--- Std private static void print(String text) { System.out.println("PartA" + text); } } // End class //======================================================== class PartB implements Part { //---------- Part Implementation ------------------------- public void setPartContext(PartContext context) { print(".setPartContext() - Not yet Implemented"); } public void startPart() { print(".startPart() - Entered"); } //---------- Private Methods ----------------------------- //--- Std private static void print(String text) { System.out.println("PartB" + text); } } // End class //======================================================== interface PartContext { // No methods for now } // End interface //======================================================== interface Part { public void setPartContext(PartContext context); public void startPart(); } // End interface
Step 4
// 1 - PartA with startPart(), no interface, // UnitTest with PartA.main(). // 2 - Ditto with PartB, Unit Test by modifying // PartA.main(). // 3. Create PartContext with no methods, create Part // interface with all methods, modify PartA and B to // implement Part, modify Unit Test to use Part interface. // 4. Create Mediator, let it do Unit Test. public class Mediator { //---------- Initialization ------------------------------ public static void main(String args[]) { Part partA = new PartA(); partA.startPart(); Part partB = new PartB(); partB.startPart(); } } // End class //======================================================== class PartA implements Part { //---------- Part Implementation ------------------------- public void setPartContext(PartContext context) { print(".setPartContext() - Not yet Implemented"); } public void startPart() { print(".startPart() - Entered"); } //---------- Private Methods ----------------------------- //--- Std private static void print(String text) { System.out.println("PartA" + text); } } // End class //======================================================== class PartB implements Part { //---------- Part Implementation ------------------------- public void setPartContext(PartContext context) { print(".setPartContext() - Not yet Implemented"); } public void startPart() { print(".startPart() - Entered"); } //---------- Private Methods ----------------------------- //--- Std private static void print(String text) { System.out.println("PartB" + text); } } // End class //======================================================== interface PartContext { // No methods for now } // End interface //======================================================== interface Part { public void setPartContext(PartContext context); public void startPart(); } // End interface
Step 5
// 1 - PartA with startPart(), no interface, // UnitTest with PartA.main(). // 2 - Ditto with PartB, Unit Test by modifying // PartA.main(). // 3. Create PartContext with no methods, create Part // interface with all methods, modify PartA and B to // implement Part, modify Unit Test to use Part interface. // 4. Create Mediator, let it do Unit Test. // 5. Create Container, modify Mediator to use it by adding // named parts. Container.startContainer() should call // startPart() on all its parts. Run Unit Test. import java.util.Enumeration; import java.util.Hashtable; public class Mediator { //---------- Initialization ------------------------------ public static void main(String args[]) { Container container = new Container(); container.addPart("A", new PartA()); container.addPart("B", new PartB()); container.startContainer(); } } // End class //======================================================== class Container { //---------- Private Fields ------------------------------ // Key = String name, Object = Part private Hashtable parts = new Hashtable(); //---------- Public Methods ------------------------------ public void addPart(String partName, Part part) { parts.put(partName, part); } public void startContainer() { // Call startPart() on all my parts Enumeration enum = parts.keys(); while (enum.hasMoreElements()) { String name = (String)enum.nextElement(); print(".startContainer() - About to start part '" + name + "'"); Part part = (Part)parts.get(name); part.startPart(); } } //---------- Private Methods ----------------------------- //--- Std private static void print(String text) { System.out.println("Container" + text); } } // End class //======================================================== class PartA implements Part { //---------- Part Implementation ------------------------- public void setPartContext(PartContext context) { print(".setPartContext() - Not yet Implemented"); } public void startPart() { print(".startPart() - Entered"); } //---------- Private Methods ----------------------------- //--- Std private static void print(String text) { System.out.println("PartA" + text); } } // End class //======================================================== class PartB implements Part { //---------- Part Implementation ------------------------- public void setPartContext(PartContext context) { print(".setPartContext() - Not yet Implemented"); } public void startPart() { print(".startPart() - Entered"); } //---------- Private Methods ----------------------------- //--- Std private static void print(String text) { System.out.println("PartB" + text); } } // End class //======================================================== interface PartContext { // No methods for now } // End interface //======================================================== interface Part { public void setPartContext(PartContext context); public void startPart(); } // End interface
Step 6
// 1. PartA with startPart(), no interface, // Unit Test with PartA.main(). // 2. Ditto with PartB, Unit Test with PartA.main(). // 3. Create PartContext with no methods, create Part // interface with all methods, modify PartA and B // to implement Part, modify Unit Test to use Part interface. // 4. Create Mediator, let it do Unit Test. // 5. Create Container, modify Mediator to use it by adding // named parts. Container.startContainer() should call // startPart() on all its parts. Run Unit Test. // 6. Modify PartContext to have getPart(), modify // Container to implement PartContext, modify Container to // call setPartContext() on parts, add printThis(String text) // to Part interface, modify parts to use // the context to call printThis() on each other. import java.util.Enumeration; import java.util.Hashtable; public class Mediator { //---------- Initialization ------------------------------ public static void main(String args[]) { Container container = new Container(); container.addPart("A", new PartA()); container.addPart("B", new PartB()); container.startContainer(); } } // End class //======================================================== class Container implements PartContext { //---------- Private Fields ------------------------------ // Key = String part name, Object = Part private Hashtable parts = new Hashtable(); //---------- PartContext Implementation ------------------ public Part getPart(String partName) { return (Part)parts.get(partName); } //---------- Public Methods ------------------------------ public void addPart(String partName, Part part) { parts.put(partName, part); part.setPartContext(this); } public void startContainer() { // Call startPart() on all my parts Enumeration enum = parts.keys(); while (enum.hasMoreElements()) { String key = (String)enum.nextElement(); print(".startContainer() - Starting part named " + key); Part part = (Part)parts.get(key); part.startPart(); } } //---------- Private Methods ----------------------------- //--- Std private static void print(String text) { System.out.println("Container" + text); } } // End class //======================================================== class PartA implements Part { //---------- Private Fields ------------------------------ private PartContext context; //---------- Part Implementation ------------------------- public void setPartContext(PartContext context) { this.context = context; } public void startPart() { print(".startPart() - Entered"); // Call printThis() on other part Part otherPart = context.getPart("B"); otherPart.printThis("Hello World"); } public void printThis(String text) { print(".printThis() - I'll be glad to print " + text); } //---------- Private Methods ----------------------------- //--- Std private static void print(String text) { System.out.println("PartA" + text); } } // End class //======================================================== class PartB implements Part { //---------- Private Fields ------------------------------ private PartContext context; //---------- Part Implementation ------------------------- public void setPartContext(PartContext context) { this.context = context; } public void startPart() { print(".startPart() - Entered"); // Call printThis() on other part Part otherPart = context.getPart("A"); otherPart.printThis("Hello Other World"); } public void printThis(String text) { print(".printThis() - I'll be glad to print " + text); } //---------- Private Methods ----------------------------- //--- Std private static void print(String text) { System.out.println("PartB" + text); } } // End class //======================================================== interface PartContext { public Part getPart(String partName); } // End interface //======================================================== interface Part { public void setPartContext(PartContext context); public void startPart(); public void printThis(String text); } // End interface