diff --git a/demos/demo3/Agile Methods (Simple Diagram).png b/demos/demo3/Agile Methods (Simple Diagram).png new file mode 100644 index 0000000..2ef0d39 Binary files /dev/null and b/demos/demo3/Agile Methods (Simple Diagram).png differ diff --git a/demos/demo3/Agile Methods (Simple Diagram).sdxml b/demos/demo3/Agile Methods (Simple Diagram).sdxml new file mode 100644 index 0000000..716ab42 Binary files /dev/null and b/demos/demo3/Agile Methods (Simple Diagram).sdxml differ diff --git a/demos/demo3/Gumball Collaboration (Simple Diagram).png b/demos/demo3/Gumball Collaboration (Simple Diagram).png new file mode 100644 index 0000000..2e4c963 Binary files /dev/null and b/demos/demo3/Gumball Collaboration (Simple Diagram).png differ diff --git a/demos/demo3/Gumball Collaboration (Simple Diagram).sdxml b/demos/demo3/Gumball Collaboration (Simple Diagram).sdxml new file mode 100644 index 0000000..e291034 Binary files /dev/null and b/demos/demo3/Gumball Collaboration (Simple Diagram).sdxml differ diff --git a/demos/demo3/gumball-junit-lab/ver1/GumballMachine.java b/demos/demo3/gumball-junit-lab/ver1/GumballMachine.java new file mode 100644 index 0000000..e29b100 --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver1/GumballMachine.java @@ -0,0 +1,43 @@ + +public class GumballMachine +{ + + private int num_gumballs; + private boolean has_quarter; + + public GumballMachine( int size ) + { + // initialise instance variables + this.num_gumballs = size; + this.has_quarter = false; + } + + public void insertQuarter(int coin) + { + if ( coin == 25 ) + this.has_quarter = true ; + else + this.has_quarter = false ; + } + + public void turnCrank() + { + if ( this.has_quarter ) + { + if ( this.num_gumballs > 0 ) + { + this.num_gumballs-- ; + this.has_quarter = false ; + System.out.println( "Thanks for your quarter. Gumball Ejected!" ) ; + } + else + { + System.out.println( "No More Gumballs! Sorry, can't return your quarter." ) ; + } + } + else + { + System.out.println( "Please insert a quarter" ) ; + } + } +} diff --git a/demos/demo3/gumball-junit-lab/ver1/README.TXT b/demos/demo3/gumball-junit-lab/ver1/README.TXT new file mode 100644 index 0000000..2bea2dd --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver1/README.TXT @@ -0,0 +1,12 @@ +------------------------------------------------------------------------ +This is the project README file. Here, you should describe your project. +Tell the reader (someone who does not know anything about this project) +all he/she needs to know. The comments should usually include at least: +------------------------------------------------------------------------ + +PROJECT TITLE: +PURPOSE OF PROJECT: +VERSION or DATE: +HOW TO START THIS PROJECT: +AUTHORS: +USER INSTRUCTIONS: diff --git a/demos/demo3/gumball-junit-lab/ver1/package.bluej b/demos/demo3/gumball-junit-lab/ver1/package.bluej new file mode 100644 index 0000000..0bd88c8 --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver1/package.bluej @@ -0,0 +1,25 @@ +#BlueJ package file +objectbench.height=76 +objectbench.width=783 +package.editor.height=508 +package.editor.width=675 +package.editor.x=300 +package.editor.y=103 +package.numDependencies=0 +package.numTargets=1 +package.showExtends=true +package.showUses=true +project.charset=UTF-8 +target1.editor.height=850 +target1.editor.width=863 +target1.editor.x=579 +target1.editor.y=155 +target1.height=50 +target1.name=GumballMachine +target1.naviview.expanded=true +target1.showInterface=false +target1.type=ClassTarget +target1.typeParameters= +target1.width=130 +target1.x=90 +target1.y=10 diff --git a/demos/demo3/gumball-junit-lab/ver2/README.TXT b/demos/demo3/gumball-junit-lab/ver2/README.TXT new file mode 100644 index 0000000..2bea2dd --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver2/README.TXT @@ -0,0 +1,12 @@ +------------------------------------------------------------------------ +This is the project README file. Here, you should describe your project. +Tell the reader (someone who does not know anything about this project) +all he/she needs to know. The comments should usually include at least: +------------------------------------------------------------------------ + +PROJECT TITLE: +PURPOSE OF PROJECT: +VERSION or DATE: +HOW TO START THIS PROJECT: +AUTHORS: +USER INSTRUCTIONS: diff --git a/demos/demo3/gumball-junit-lab/ver2/diagrams.asta b/demos/demo3/gumball-junit-lab/ver2/diagrams.asta new file mode 100644 index 0000000..a363b26 Binary files /dev/null and b/demos/demo3/gumball-junit-lab/ver2/diagrams.asta differ diff --git a/demos/demo3/gumball-junit-lab/ver2/gumball/GumballMachine.java b/demos/demo3/gumball-junit-lab/ver2/gumball/GumballMachine.java new file mode 100644 index 0000000..dcff08b --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver2/gumball/GumballMachine.java @@ -0,0 +1,46 @@ +package gumball; + +public class GumballMachine implements IGumball +{ + + private int num_gumballs; + private boolean has_quarter; + + public GumballMachine( int size ) + { + // initialise instance variables + this.num_gumballs = size; + this.has_quarter = false; + } + + public void insertQuarter() + { + this.has_quarter = true ; + } + + public void turnCrank() + { + if ( this.has_quarter ) + { + if ( this.num_gumballs > 0 ) + { + this.num_gumballs-- ; + this.has_quarter = false ; + System.out.println( "Thanks for your quarter. Gumball Ejected!" ) ; + } + else + { + System.out.println( "No More Gumballs! Sorry, can't return your quarter." ) ; + } + } + else + { + System.out.println( "Please insert a quarter" ) ; + } + } + + public boolean hasGumball() + { + return true ; + } +} diff --git a/demos/demo3/gumball-junit-lab/ver2/gumball/GumballStub.java b/demos/demo3/gumball-junit-lab/ver2/gumball/GumballStub.java new file mode 100644 index 0000000..b1c54ce --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver2/gumball/GumballStub.java @@ -0,0 +1,16 @@ +package gumball; + + +/** + * Write a description of class GumballStub here. + * + * @author (your name) + * @version (a version number or a date) + */ +public class GumballStub implements IGumball +{ + + public void insertQuarter() {} + public void turnCrank() {} + public boolean hasGumball() { return true; } +} diff --git a/demos/demo3/gumball-junit-lab/ver2/gumball/IGumball.java b/demos/demo3/gumball-junit-lab/ver2/gumball/IGumball.java new file mode 100644 index 0000000..b0fc4f7 --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver2/gumball/IGumball.java @@ -0,0 +1,16 @@ +package gumball; + + +/** + * Write a description of interface IGumball here. + * + * @author (your name) + * @version (a version number or a date) + */ +public interface IGumball +{ + + public void insertQuarter() ; + public void turnCrank() ; + public boolean hasGumball() ; +} diff --git a/demos/demo3/gumball-junit-lab/ver2/gumball/Kid.java b/demos/demo3/gumball-junit-lab/ver2/gumball/Kid.java new file mode 100644 index 0000000..5f1eadb --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver2/gumball/Kid.java @@ -0,0 +1,28 @@ +package gumball; + + +/** + * Write a description of class Kid here. + * + * @author (your name) + * @version (a version number or a date) + */ +public class Kid +{ + private IGumball machine; + + /** + * Constructor for objects of class Kid + */ + public Kid( IGumball m ) + { + machine = m ; + } + + + public void Mommy() + { + machine.insertQuarter() ; + machine.turnCrank() ; + } +} diff --git a/demos/demo3/gumball-junit-lab/ver2/gumball/KidTest.java b/demos/demo3/gumball-junit-lab/ver2/gumball/KidTest.java new file mode 100644 index 0000000..5f077a7 --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver2/gumball/KidTest.java @@ -0,0 +1,73 @@ +package gumball; + + + +import static org.junit.Assert.*; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * The test class KidTest. + * + * @author (your name) + * @version (a version number or a date) + */ +public class KidTest +{ + private gumball.IGumball m; + + /** + * Default constructor for test class KidTest + */ + public KidTest() + { + } + + /** + * Sets up the test fixture. + * + * Called before every test case method. + */ + @Before + public void setUp() + { + //m = new gumball.GumballMachine(10); + m = new gumball.GumballStub() ; + } + + /** + * Tears down the test fixture. + * + * Called after every test case method. + */ + @After + public void tearDown() + { + } + + @Test + public void testHappy() + { + m.insertQuarter(); + m.turnCrank(); + } + + @Test + public void testHappy2() + { + m.insertQuarter(); + m.turnCrank(); + assertEquals(true, m.hasGumball()); + } + + @Test + public void noQuarter() + { + m.turnCrank(); + assertEquals(false, m.hasGumball()); + } +} + + + diff --git a/demos/demo3/gumball-junit-lab/ver2/gumball/package.bluej b/demos/demo3/gumball-junit-lab/ver2/gumball/package.bluej new file mode 100644 index 0000000..ba2651c --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver2/gumball/package.bluej @@ -0,0 +1,89 @@ +#BlueJ package file +dependency1.from=Kid +dependency1.to=IGumball +dependency1.type=UsesDependency +dependency2.from=KidTest +dependency2.to=GumballMachine +dependency2.type=UsesDependency +dependency3.from=KidTest +dependency3.to=IGumball +dependency3.type=UsesDependency +dependency4.from=KidTest +dependency4.to=GumballStub +dependency4.type=UsesDependency +objectbench.height=76 +objectbench.width=810 +package.editor.height=525 +package.editor.width=702 +package.editor.x=50 +package.editor.y=162 +package.numDependencies=4 +package.numTargets=5 +package.showExtends=true +package.showUses=false +target1.editor.height=700 +target1.editor.width=900 +target1.editor.x=325 +target1.editor.y=288 +target1.height=50 +target1.name=IGumball +target1.naviview.expanded=true +target1.showInterface=false +target1.type=InterfaceTarget +target1.typeParameters= +target1.width=80 +target1.x=260 +target1.y=100 +target2.editor.height=700 +target2.editor.width=900 +target2.editor.x=257 +target2.editor.y=147 +target2.height=50 +target2.name=KidTest +target2.naviview.expanded=true +target2.showInterface=false +target2.type=UnitTestTargetJunit4 +target2.typeParameters= +target2.width=80 +target2.x=290 +target2.y=230 +target3.association=KidTest +target3.editor.height=700 +target3.editor.width=900 +target3.editor.x=199 +target3.editor.y=226 +target3.height=50 +target3.name=Kid +target3.naviview.expanded=true +target3.showInterface=false +target3.type=ClassTarget +target3.typeParameters= +target3.width=80 +target3.x=260 +target3.y=260 +target4.editor.height=700 +target4.editor.width=900 +target4.editor.x=303 +target4.editor.y=275 +target4.height=50 +target4.name=GumballMachine +target4.naviview.expanded=true +target4.showInterface=false +target4.type=ClassTarget +target4.typeParameters= +target4.width=130 +target4.x=70 +target4.y=100 +target5.editor.height=700 +target5.editor.width=900 +target5.editor.x=90 +target5.editor.y=182 +target5.height=50 +target5.name=GumballStub +target5.naviview.expanded=true +target5.showInterface=false +target5.type=ClassTarget +target5.typeParameters= +target5.width=100 +target5.x=80 +target5.y=170 diff --git a/demos/demo3/gumball-junit-lab/ver2/package.bluej b/demos/demo3/gumball-junit-lab/ver2/package.bluej new file mode 100644 index 0000000..5219f56 --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver2/package.bluej @@ -0,0 +1,22 @@ +#BlueJ package file +package.editor.height=400 +package.editor.width=560 +package.editor.x=39 +package.editor.y=347 +package.numDependencies=0 +package.numTargets=2 +package.showExtends=true +package.showUses=true +project.charset=UTF-8 +target1.height=62 +target1.name=state +target1.type=PackageTarget +target1.width=80 +target1.x=70 +target1.y=10 +target2.height=62 +target2.name=gumball +target2.type=PackageTarget +target2.width=80 +target2.x=160 +target2.y=10 diff --git a/demos/demo3/gumball-junit-lab/ver3/README.TXT b/demos/demo3/gumball-junit-lab/ver3/README.TXT new file mode 100644 index 0000000..2bea2dd --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver3/README.TXT @@ -0,0 +1,12 @@ +------------------------------------------------------------------------ +This is the project README file. Here, you should describe your project. +Tell the reader (someone who does not know anything about this project) +all he/she needs to know. The comments should usually include at least: +------------------------------------------------------------------------ + +PROJECT TITLE: +PURPOSE OF PROJECT: +VERSION or DATE: +HOW TO START THIS PROJECT: +AUTHORS: +USER INSTRUCTIONS: diff --git a/demos/demo3/gumball-junit-lab/ver3/diagrams.asta b/demos/demo3/gumball-junit-lab/ver3/diagrams.asta new file mode 100644 index 0000000..57aa368 Binary files /dev/null and b/demos/demo3/gumball-junit-lab/ver3/diagrams.asta differ diff --git a/demos/demo3/gumball-junit-lab/ver3/gumball/GumballException.java b/demos/demo3/gumball-junit-lab/ver3/gumball/GumballException.java new file mode 100644 index 0000000..ca71e8e --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver3/gumball/GumballException.java @@ -0,0 +1,6 @@ +package gumball; + +public class GumballException extends Exception +{ + +} diff --git a/demos/demo3/gumball-junit-lab/ver3/gumball/GumballMachine.java b/demos/demo3/gumball-junit-lab/ver3/gumball/GumballMachine.java new file mode 100644 index 0000000..c9468d6 --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver3/gumball/GumballMachine.java @@ -0,0 +1,54 @@ +package gumball; + +public class GumballMachine implements IGumball +{ + + private int num_gumballs; + private boolean has_quarter; + private boolean has_gumball; + + public GumballMachine( int size ) + { + // initialise instance variables + this.num_gumballs = size; + this.has_quarter = false; + this.has_gumball = true ; + } + + public void insertQuarter() throws GumballException + { + this.has_quarter = true ; + } + + public void turnCrank() throws GumballException + { + if ( this.has_quarter ) + { + if ( this.num_gumballs > 0 ) + { + this.num_gumballs-- ; + this.has_quarter = false ; + this.has_gumball = true ; + System.out.println( "Thanks for your quarter. Gumball Ejected!" ) ; + } + else + { + System.out.println( "No More Gumballs! Sorry, can't return your quarter." ) ; + } + } + else + { + System.out.println( "Please insert a quarter" ) ; + } + } + + public boolean hasGumball() + { + return this.has_gumball ; + } + + public String takeGumball() { + this.has_gumball = false ; + return "Gumball" ; + } +} diff --git a/demos/demo3/gumball-junit-lab/ver3/gumball/GumballStub.java b/demos/demo3/gumball-junit-lab/ver3/gumball/GumballStub.java new file mode 100644 index 0000000..3555153 --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver3/gumball/GumballStub.java @@ -0,0 +1,60 @@ +package gumball; + + +/** + * Write a description of class GumballStub here. + * + * @author (your name) + * @version (a version number or a date) + */ +public class GumballStub implements IGumball +{ + boolean hasQuarter ; + boolean hasGumball ; + + public GumballStub() { + hasQuarter = false ; + hasGumball = false ; + } + + public void insertQuarter() throws GumballException + { + if ( this.hasQuarter ) + { + throw new HasQuarterException() ; + } + else + { + this.hasQuarter = true ; + } + } + + public void turnCrank() throws GumballException + { + if ( this.hasQuarter ) + { + this.hasGumball = true ; + this.hasQuarter = false ; + } + else + { + throw new NoQuarterException() ; + } + } + + public boolean hasGumball() { + return this.hasGumball; + } + + public String takeGumball() { + if ( this.hasGumball ) + { + this.hasGumball = false ; + return "Gumball" ; + } + else + { + return "" ; + } + } +} diff --git a/demos/demo3/gumball-junit-lab/ver3/gumball/HasQuarterException.java b/demos/demo3/gumball-junit-lab/ver3/gumball/HasQuarterException.java new file mode 100644 index 0000000..6d40a6a --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver3/gumball/HasQuarterException.java @@ -0,0 +1,6 @@ +package gumball; + +public class HasQuarterException extends GumballException +{ + +} diff --git a/demos/demo3/gumball-junit-lab/ver3/gumball/IGumball.java b/demos/demo3/gumball-junit-lab/ver3/gumball/IGumball.java new file mode 100644 index 0000000..6622d7e --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver3/gumball/IGumball.java @@ -0,0 +1,17 @@ +package gumball; + + +/** + * Write a description of interface IGumball here. + * + * @author (your name) + * @version (a version number or a date) + */ +public interface IGumball +{ + + public void insertQuarter() throws GumballException ; + public void turnCrank() throws GumballException ; + public boolean hasGumball() ; + public String takeGumball() ; +} diff --git a/demos/demo3/gumball-junit-lab/ver3/gumball/Kid.java b/demos/demo3/gumball-junit-lab/ver3/gumball/Kid.java new file mode 100644 index 0000000..4028446 --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver3/gumball/Kid.java @@ -0,0 +1,46 @@ +package gumball; + +public class Kid +{ + private IGumball machine; + private int numQuarters ; + private int numGumballs ; + + /** + * Constructor for objects of class Kid + */ + public Kid( IGumball m ) + { + machine = m ; + numQuarters = 0 ; + numGumballs = 0 ; + } + + public void giveQuarters( int q ) + { + numQuarters += q ; + } + + public void buyGumball() + { + try + { + if ( numQuarters > 0 ) + { + numQuarters-- ; + machine.insertQuarter() ; + machine.turnCrank() ; + if ( machine.hasGumball() ) + { + machine.takeGumball() ; + numGumballs++ ; + } + } + else + { + System.out.println( "I'm out of quarters!" ) ; + } + } + catch( Exception e ) {} + } +} diff --git a/demos/demo3/gumball-junit-lab/ver3/gumball/NoQuarterException.java b/demos/demo3/gumball-junit-lab/ver3/gumball/NoQuarterException.java new file mode 100644 index 0000000..993d12e --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver3/gumball/NoQuarterException.java @@ -0,0 +1,13 @@ +package gumball; + + +/** + * Write a description of class NoQuarterException here. + * + * @author (your name) + * @version (a version number or a date) + */ +public class NoQuarterException extends GumballException +{ + +} diff --git a/demos/demo3/gumball-junit-lab/ver3/gumball/UnitTest.java b/demos/demo3/gumball-junit-lab/ver3/gumball/UnitTest.java new file mode 100644 index 0000000..10ceaff --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver3/gumball/UnitTest.java @@ -0,0 +1,104 @@ +package gumball; + + + +import static org.junit.Assert.*; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * The test class Test. + * + * @author (your name) + * @version (a version number or a date) + */ +public class UnitTest +{ + + private gumball.IGumball m; + + /** + * Default constructor for test class Test + */ + public UnitTest() + { + } + + /** + * Sets up the test fixture. + * + * Called before every test case method. + */ + @Before + public void setUp() + { + //m = new gumball.GumballMachine(10); + m = new gumball.GumballStub() ; + } + + /** + * Tears down the test fixture. + * + * Called after every test case method. + */ + @After + public void tearDown() + { + } + + + @Test + public void testHappy() + { + try { + m.insertQuarter(); + m.turnCrank(); + assertEquals(true, m.hasGumball()); + } + catch ( GumballException e ) + { + fail( e.getMessage() ) ; + } + } + + @Test + public void testNoQuarter() + { + try { + m.turnCrank(); + assertEquals(false, m.hasGumball()); + } + catch ( NoQuarterException e ) + { + assertTrue(true) ; + } + catch ( GumballException e ) + { + fail( "Invalid Exception Thrown!" ) ; + } + } + + + @Test + public void testHasQuarter() + { + try { + m.insertQuarter(); + m.insertQuarter(); + fail( "Should Throw an Exception" ) ; + } + catch ( HasQuarterException e ) + { + assertTrue(true) ; + } + catch ( GumballException e ) + { + fail( "Invalid Exception Thrown!" ) ; + } + } + + +} + + diff --git a/demos/demo3/gumball-junit-lab/ver3/gumball/package.bluej b/demos/demo3/gumball-junit-lab/ver3/gumball/package.bluej new file mode 100644 index 0000000..40c112a --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver3/gumball/package.bluej @@ -0,0 +1,148 @@ +#BlueJ package file +dependency1.from=UnitTest +dependency1.to=IGumball +dependency1.type=UsesDependency +dependency10.from=UnitTest +dependency10.to=GumballMachine +dependency10.type=UsesDependency +dependency11.from=Kid +dependency11.to=IGumball +dependency11.type=UsesDependency +dependency2.from=UnitTest +dependency2.to=GumballStub +dependency2.type=UsesDependency +dependency3.from=GumballMachine +dependency3.to=GumballException +dependency3.type=UsesDependency +dependency4.from=GumballStub +dependency4.to=GumballException +dependency4.type=UsesDependency +dependency5.from=UnitTest +dependency5.to=GumballException +dependency5.type=UsesDependency +dependency6.from=GumballStub +dependency6.to=NoQuarterException +dependency6.type=UsesDependency +dependency7.from=GumballStub +dependency7.to=HasQuarterException +dependency7.type=UsesDependency +dependency8.from=UnitTest +dependency8.to=NoQuarterException +dependency8.type=UsesDependency +dependency9.from=UnitTest +dependency9.to=HasQuarterException +dependency9.type=UsesDependency +objectbench.height=76 +objectbench.width=886 +package.editor.height=525 +package.editor.width=778 +package.editor.x=552 +package.editor.y=53 +package.numDependencies=11 +package.numTargets=8 +package.showExtends=true +package.showUses=false +target1.editor.height=700 +target1.editor.width=900 +target1.editor.x=117 +target1.editor.y=289 +target1.height=50 +target1.name=IGumball +target1.naviview.expanded=true +target1.showInterface=false +target1.type=InterfaceTarget +target1.typeParameters= +target1.width=80 +target1.x=230 +target1.y=190 +target2.editor.height=700 +target2.editor.width=900 +target2.editor.x=381 +target2.editor.y=416 +target2.height=50 +target2.name=Kid +target2.naviview.expanded=true +target2.showInterface=false +target2.type=ClassTarget +target2.typeParameters= +target2.width=80 +target2.x=230 +target2.y=10 +target3.editor.height=700 +target3.editor.width=900 +target3.editor.x=815 +target3.editor.y=312 +target3.height=50 +target3.name=GumballMachine +target3.naviview.expanded=true +target3.showInterface=false +target3.type=ClassTarget +target3.typeParameters= +target3.width=130 +target3.x=50 +target3.y=100 +target4.editor.height=700 +target4.editor.width=900 +target4.editor.x=90 +target4.editor.y=182 +target4.height=50 +target4.name=GumballStub +target4.naviview.expanded=true +target4.showInterface=false +target4.type=ClassTarget +target4.typeParameters= +target4.width=100 +target4.x=50 +target4.y=190 +target5.editor.height=700 +target5.editor.width=900 +target5.editor.x=807 +target5.editor.y=90 +target5.height=50 +target5.name=HasQuarterException +target5.naviview.expanded=true +target5.showInterface=false +target5.type=ClassTarget +target5.typeParameters= +target5.width=150 +target5.x=520 +target5.y=190 +target6.editor.height=700 +target6.editor.width=900 +target6.editor.x=807 +target6.editor.y=90 +target6.height=50 +target6.name=GumballException +target6.naviview.expanded=true +target6.showInterface=false +target6.type=ClassTarget +target6.typeParameters= +target6.width=140 +target6.x=410 +target6.y=90 +target7.editor.height=700 +target7.editor.width=900 +target7.editor.x=807 +target7.editor.y=90 +target7.height=50 +target7.name=NoQuarterException +target7.naviview.expanded=true +target7.showInterface=false +target7.type=ClassTarget +target7.typeParameters= +target7.width=150 +target7.x=350 +target7.y=190 +target8.editor.height=700 +target8.editor.width=900 +target8.editor.x=48 +target8.editor.y=62 +target8.height=50 +target8.name=UnitTest +target8.naviview.expanded=true +target8.showInterface=false +target8.type=UnitTestTargetJunit4 +target8.typeParameters= +target8.width=80 +target8.x=230 +target8.y=100 diff --git a/demos/demo3/gumball-junit-lab/ver3/package.bluej b/demos/demo3/gumball-junit-lab/ver3/package.bluej new file mode 100644 index 0000000..5219f56 --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver3/package.bluej @@ -0,0 +1,22 @@ +#BlueJ package file +package.editor.height=400 +package.editor.width=560 +package.editor.x=39 +package.editor.y=347 +package.numDependencies=0 +package.numTargets=2 +package.showExtends=true +package.showUses=true +project.charset=UTF-8 +target1.height=62 +target1.name=state +target1.type=PackageTarget +target1.width=80 +target1.x=70 +target1.y=10 +target2.height=62 +target2.name=gumball +target2.type=PackageTarget +target2.width=80 +target2.x=160 +target2.y=10 diff --git a/demos/demo3/gumball-junit-lab/ver4/README.TXT b/demos/demo3/gumball-junit-lab/ver4/README.TXT new file mode 100644 index 0000000..2bea2dd --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver4/README.TXT @@ -0,0 +1,12 @@ +------------------------------------------------------------------------ +This is the project README file. Here, you should describe your project. +Tell the reader (someone who does not know anything about this project) +all he/she needs to know. The comments should usually include at least: +------------------------------------------------------------------------ + +PROJECT TITLE: +PURPOSE OF PROJECT: +VERSION or DATE: +HOW TO START THIS PROJECT: +AUTHORS: +USER INSTRUCTIONS: diff --git a/demos/demo3/gumball-junit-lab/ver4/diagrams.asta b/demos/demo3/gumball-junit-lab/ver4/diagrams.asta new file mode 100644 index 0000000..19ef03a Binary files /dev/null and b/demos/demo3/gumball-junit-lab/ver4/diagrams.asta differ diff --git a/demos/demo3/gumball-junit-lab/ver4/gumball/GumballException.java b/demos/demo3/gumball-junit-lab/ver4/gumball/GumballException.java new file mode 100644 index 0000000..ca71e8e --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver4/gumball/GumballException.java @@ -0,0 +1,6 @@ +package gumball; + +public class GumballException extends Exception +{ + +} diff --git a/demos/demo3/gumball-junit-lab/ver4/gumball/GumballMachine.java b/demos/demo3/gumball-junit-lab/ver4/gumball/GumballMachine.java new file mode 100644 index 0000000..c9468d6 --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver4/gumball/GumballMachine.java @@ -0,0 +1,54 @@ +package gumball; + +public class GumballMachine implements IGumball +{ + + private int num_gumballs; + private boolean has_quarter; + private boolean has_gumball; + + public GumballMachine( int size ) + { + // initialise instance variables + this.num_gumballs = size; + this.has_quarter = false; + this.has_gumball = true ; + } + + public void insertQuarter() throws GumballException + { + this.has_quarter = true ; + } + + public void turnCrank() throws GumballException + { + if ( this.has_quarter ) + { + if ( this.num_gumballs > 0 ) + { + this.num_gumballs-- ; + this.has_quarter = false ; + this.has_gumball = true ; + System.out.println( "Thanks for your quarter. Gumball Ejected!" ) ; + } + else + { + System.out.println( "No More Gumballs! Sorry, can't return your quarter." ) ; + } + } + else + { + System.out.println( "Please insert a quarter" ) ; + } + } + + public boolean hasGumball() + { + return this.has_gumball ; + } + + public String takeGumball() { + this.has_gumball = false ; + return "Gumball" ; + } +} diff --git a/demos/demo3/gumball-junit-lab/ver4/gumball/GumballStub.java b/demos/demo3/gumball-junit-lab/ver4/gumball/GumballStub.java new file mode 100644 index 0000000..3555153 --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver4/gumball/GumballStub.java @@ -0,0 +1,60 @@ +package gumball; + + +/** + * Write a description of class GumballStub here. + * + * @author (your name) + * @version (a version number or a date) + */ +public class GumballStub implements IGumball +{ + boolean hasQuarter ; + boolean hasGumball ; + + public GumballStub() { + hasQuarter = false ; + hasGumball = false ; + } + + public void insertQuarter() throws GumballException + { + if ( this.hasQuarter ) + { + throw new HasQuarterException() ; + } + else + { + this.hasQuarter = true ; + } + } + + public void turnCrank() throws GumballException + { + if ( this.hasQuarter ) + { + this.hasGumball = true ; + this.hasQuarter = false ; + } + else + { + throw new NoQuarterException() ; + } + } + + public boolean hasGumball() { + return this.hasGumball; + } + + public String takeGumball() { + if ( this.hasGumball ) + { + this.hasGumball = false ; + return "Gumball" ; + } + else + { + return "" ; + } + } +} diff --git a/demos/demo3/gumball-junit-lab/ver4/gumball/HasQuarterException.java b/demos/demo3/gumball-junit-lab/ver4/gumball/HasQuarterException.java new file mode 100644 index 0000000..6d40a6a --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver4/gumball/HasQuarterException.java @@ -0,0 +1,6 @@ +package gumball; + +public class HasQuarterException extends GumballException +{ + +} diff --git a/demos/demo3/gumball-junit-lab/ver4/gumball/IGumball.java b/demos/demo3/gumball-junit-lab/ver4/gumball/IGumball.java new file mode 100644 index 0000000..6622d7e --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver4/gumball/IGumball.java @@ -0,0 +1,17 @@ +package gumball; + + +/** + * Write a description of interface IGumball here. + * + * @author (your name) + * @version (a version number or a date) + */ +public interface IGumball +{ + + public void insertQuarter() throws GumballException ; + public void turnCrank() throws GumballException ; + public boolean hasGumball() ; + public String takeGumball() ; +} diff --git a/demos/demo3/gumball-junit-lab/ver4/gumball/Kid.java b/demos/demo3/gumball-junit-lab/ver4/gumball/Kid.java new file mode 100644 index 0000000..4028446 --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver4/gumball/Kid.java @@ -0,0 +1,46 @@ +package gumball; + +public class Kid +{ + private IGumball machine; + private int numQuarters ; + private int numGumballs ; + + /** + * Constructor for objects of class Kid + */ + public Kid( IGumball m ) + { + machine = m ; + numQuarters = 0 ; + numGumballs = 0 ; + } + + public void giveQuarters( int q ) + { + numQuarters += q ; + } + + public void buyGumball() + { + try + { + if ( numQuarters > 0 ) + { + numQuarters-- ; + machine.insertQuarter() ; + machine.turnCrank() ; + if ( machine.hasGumball() ) + { + machine.takeGumball() ; + numGumballs++ ; + } + } + else + { + System.out.println( "I'm out of quarters!" ) ; + } + } + catch( Exception e ) {} + } +} diff --git a/demos/demo3/gumball-junit-lab/ver4/gumball/NoQuarterException.java b/demos/demo3/gumball-junit-lab/ver4/gumball/NoQuarterException.java new file mode 100644 index 0000000..993d12e --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver4/gumball/NoQuarterException.java @@ -0,0 +1,13 @@ +package gumball; + + +/** + * Write a description of class NoQuarterException here. + * + * @author (your name) + * @version (a version number or a date) + */ +public class NoQuarterException extends GumballException +{ + +} diff --git a/demos/demo3/gumball-junit-lab/ver4/gumball/UnitTest.java b/demos/demo3/gumball-junit-lab/ver4/gumball/UnitTest.java new file mode 100644 index 0000000..10ceaff --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver4/gumball/UnitTest.java @@ -0,0 +1,104 @@ +package gumball; + + + +import static org.junit.Assert.*; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * The test class Test. + * + * @author (your name) + * @version (a version number or a date) + */ +public class UnitTest +{ + + private gumball.IGumball m; + + /** + * Default constructor for test class Test + */ + public UnitTest() + { + } + + /** + * Sets up the test fixture. + * + * Called before every test case method. + */ + @Before + public void setUp() + { + //m = new gumball.GumballMachine(10); + m = new gumball.GumballStub() ; + } + + /** + * Tears down the test fixture. + * + * Called after every test case method. + */ + @After + public void tearDown() + { + } + + + @Test + public void testHappy() + { + try { + m.insertQuarter(); + m.turnCrank(); + assertEquals(true, m.hasGumball()); + } + catch ( GumballException e ) + { + fail( e.getMessage() ) ; + } + } + + @Test + public void testNoQuarter() + { + try { + m.turnCrank(); + assertEquals(false, m.hasGumball()); + } + catch ( NoQuarterException e ) + { + assertTrue(true) ; + } + catch ( GumballException e ) + { + fail( "Invalid Exception Thrown!" ) ; + } + } + + + @Test + public void testHasQuarter() + { + try { + m.insertQuarter(); + m.insertQuarter(); + fail( "Should Throw an Exception" ) ; + } + catch ( HasQuarterException e ) + { + assertTrue(true) ; + } + catch ( GumballException e ) + { + fail( "Invalid Exception Thrown!" ) ; + } + } + + +} + + diff --git a/demos/demo3/gumball-junit-lab/ver4/gumball/package.bluej b/demos/demo3/gumball-junit-lab/ver4/gumball/package.bluej new file mode 100644 index 0000000..3fb5aaa --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver4/gumball/package.bluej @@ -0,0 +1,125 @@ +#BlueJ package file +dependency1.from=UnitTest +dependency1.to=IGumball +dependency1.type=UsesDependency +dependency10.from=UnitTest +dependency10.to=GumballMachine +dependency10.type=UsesDependency +dependency11.from=Kid +dependency11.to=IGumball +dependency11.type=UsesDependency +dependency2.from=UnitTest +dependency2.to=GumballStub +dependency2.type=UsesDependency +dependency3.from=GumballMachine +dependency3.to=GumballException +dependency3.type=UsesDependency +dependency4.from=GumballStub +dependency4.to=GumballException +dependency4.type=UsesDependency +dependency5.from=UnitTest +dependency5.to=GumballException +dependency5.type=UsesDependency +dependency6.from=GumballStub +dependency6.to=NoQuarterException +dependency6.type=UsesDependency +dependency7.from=GumballStub +dependency7.to=HasQuarterException +dependency7.type=UsesDependency +dependency8.from=UnitTest +dependency8.to=NoQuarterException +dependency8.type=UsesDependency +dependency9.from=UnitTest +dependency9.to=HasQuarterException +dependency9.type=UsesDependency +objectbench.height=101 +objectbench.width=1048 +package.divider.horizontal=0.6 +package.divider.vertical=0.8061041292639138 +package.editor.height=442 +package.editor.width=938 +package.editor.x=265 +package.editor.y=32 +package.frame.height=615 +package.frame.width=1072 +package.numDependencies=11 +package.numTargets=8 +package.showExtends=true +package.showUses=false +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=IGumball +target1.naviview.expanded=true +target1.showInterface=false +target1.type=InterfaceTarget +target1.typeParameters= +target1.width=80 +target1.x=230 +target1.y=190 +target2.height=50 +target2.name=Kid +target2.naviview.expanded=true +target2.showInterface=false +target2.type=ClassTarget +target2.typeParameters= +target2.width=80 +target2.x=230 +target2.y=10 +target3.height=50 +target3.name=GumballMachine +target3.naviview.expanded=true +target3.showInterface=false +target3.type=ClassTarget +target3.typeParameters= +target3.width=130 +target3.x=50 +target3.y=100 +target4.height=50 +target4.name=GumballStub +target4.naviview.expanded=true +target4.showInterface=false +target4.type=ClassTarget +target4.typeParameters= +target4.width=100 +target4.x=50 +target4.y=190 +target5.height=50 +target5.name=HasQuarterException +target5.naviview.expanded=true +target5.showInterface=false +target5.type=ClassTarget +target5.typeParameters= +target5.width=150 +target5.x=520 +target5.y=190 +target6.height=50 +target6.name=GumballException +target6.naviview.expanded=true +target6.showInterface=false +target6.type=ClassTarget +target6.typeParameters= +target6.width=140 +target6.x=410 +target6.y=90 +target7.height=50 +target7.name=NoQuarterException +target7.naviview.expanded=true +target7.showInterface=false +target7.type=ClassTarget +target7.typeParameters= +target7.width=150 +target7.x=350 +target7.y=190 +target8.height=50 +target8.name=UnitTest +target8.naviview.expanded=true +target8.showInterface=false +target8.type=UnitTestTargetJunit4 +target8.typeParameters= +target8.width=80 +target8.x=230 +target8.y=100 diff --git a/demos/demo3/gumball-junit-lab/ver4/package.bluej b/demos/demo3/gumball-junit-lab/ver4/package.bluej new file mode 100644 index 0000000..5219f56 --- /dev/null +++ b/demos/demo3/gumball-junit-lab/ver4/package.bluej @@ -0,0 +1,22 @@ +#BlueJ package file +package.editor.height=400 +package.editor.width=560 +package.editor.x=39 +package.editor.y=347 +package.numDependencies=0 +package.numTargets=2 +package.showExtends=true +package.showUses=true +project.charset=UTF-8 +target1.height=62 +target1.name=state +target1.type=PackageTarget +target1.width=80 +target1.x=70 +target1.y=10 +target2.height=62 +target2.name=gumball +target2.type=PackageTarget +target2.width=80 +target2.x=160 +target2.y=10 diff --git a/demos/patterns/adapter/classAdapter/AdapteeParent.java b/demos/patterns/adapter/classAdapter/AdapteeParent.java new file mode 100644 index 0000000..00e8945 --- /dev/null +++ b/demos/patterns/adapter/classAdapter/AdapteeParent.java @@ -0,0 +1,12 @@ +package adapter.classAdapter; + +public class AdapteeParent { + + public void printMessage(String msg) { + System.out.println( msg ); + } + +} + + + diff --git a/demos/patterns/adapter/classAdapter/Adapter.java b/demos/patterns/adapter/classAdapter/Adapter.java new file mode 100644 index 0000000..8c616ca --- /dev/null +++ b/demos/patterns/adapter/classAdapter/Adapter.java @@ -0,0 +1,15 @@ +package adapter.classAdapter; + +public class Adapter extends AdapteeParent implements Target { + + /** + * @see adapter.classAdapter.Target#sayHello() + */ + public void sayHello() { + super.printMessage( "Hello" ); + } + +} + + + diff --git a/demos/patterns/adapter/classAdapter/Client.java b/demos/patterns/adapter/classAdapter/Client.java new file mode 100644 index 0000000..07a1e07 --- /dev/null +++ b/demos/patterns/adapter/classAdapter/Client.java @@ -0,0 +1,13 @@ +package adapter.classAdapter; + +public class Client { + + public void runTest() + { + Target obj = new Adapter() ; + obj.sayHello() ; + } + +} + + diff --git a/demos/patterns/adapter/classAdapter/Target.java b/demos/patterns/adapter/classAdapter/Target.java new file mode 100644 index 0000000..7670181 --- /dev/null +++ b/demos/patterns/adapter/classAdapter/Target.java @@ -0,0 +1,7 @@ +package adapter.classAdapter; + +public interface Target { + + public void sayHello(); +} + diff --git a/demos/patterns/adapter/classAdapter/package.bluej b/demos/patterns/adapter/classAdapter/package.bluej new file mode 100644 index 0000000..5a8d878 --- /dev/null +++ b/demos/patterns/adapter/classAdapter/package.bluej @@ -0,0 +1,54 @@ +#BlueJ package file +dependency1.from=Client +dependency1.to=Target +dependency1.type=UsesDependency +dependency2.from=Client +dependency2.to=Adapter +dependency2.type=UsesDependency +objectbench.height=132 +objectbench.width=461 +package.divider.horizontal=0.6 +package.divider.vertical=0.7406716417910447 +package.editor.height=390 +package.editor.width=684 +package.editor.x=134 +package.editor.y=89 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=2 +package.numTargets=4 +package.showExtends=true +package.showUses=true +readme.height=60 +readme.name=@README +readme.width=48 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=Target +target1.showInterface=false +target1.type=InterfaceTarget +target1.width=80 +target1.x=60 +target1.y=110 +target2.height=50 +target2.name=Adapter +target2.showInterface=false +target2.type=ClassTarget +target2.width=80 +target2.x=250 +target2.y=190 +target3.height=50 +target3.name=Client +target3.showInterface=false +target3.type=ClassTarget +target3.width=80 +target3.x=270 +target3.y=70 +target4.height=50 +target4.name=AdapteeParent +target4.showInterface=false +target4.type=ClassTarget +target4.width=120 +target4.x=80 +target4.y=220 diff --git a/demos/patterns/adapter/objectAdapter/Adaptee.java b/demos/patterns/adapter/objectAdapter/Adaptee.java new file mode 100644 index 0000000..00554c1 --- /dev/null +++ b/demos/patterns/adapter/objectAdapter/Adaptee.java @@ -0,0 +1,7 @@ +package adapter.objectAdapter; + +public interface Adaptee { + + public abstract void printMessage(String msg); +} + diff --git a/demos/patterns/adapter/objectAdapter/AdapteeObject.java b/demos/patterns/adapter/objectAdapter/AdapteeObject.java new file mode 100644 index 0000000..7b8de5c --- /dev/null +++ b/demos/patterns/adapter/objectAdapter/AdapteeObject.java @@ -0,0 +1,15 @@ +package adapter.objectAdapter; + +public class AdapteeObject implements Adaptee { + + private TargetObject targetObject; + + /** + * @see adapter.objectAdapter.Adaptee#printMessage(java.lang.String) + */ + public void printMessage(String msg) { + System.out.println( msg ) ; + } + +} + diff --git a/demos/patterns/adapter/objectAdapter/Client.java b/demos/patterns/adapter/objectAdapter/Client.java new file mode 100644 index 0000000..4e1c1e5 --- /dev/null +++ b/demos/patterns/adapter/objectAdapter/Client.java @@ -0,0 +1,15 @@ +package adapter.objectAdapter; + +public class Client { + + public void runTest() + { + Target obj = new TargetObject() ; + obj.sayHello() ; + } + +} + + + + diff --git a/demos/patterns/adapter/objectAdapter/Target.java b/demos/patterns/adapter/objectAdapter/Target.java new file mode 100644 index 0000000..c250057 --- /dev/null +++ b/demos/patterns/adapter/objectAdapter/Target.java @@ -0,0 +1,7 @@ +package adapter.objectAdapter; + +public interface Target { + + public abstract void sayHello(); +} + diff --git a/demos/patterns/adapter/objectAdapter/TargetObject.java b/demos/patterns/adapter/objectAdapter/TargetObject.java new file mode 100644 index 0000000..635e76c --- /dev/null +++ b/demos/patterns/adapter/objectAdapter/TargetObject.java @@ -0,0 +1,22 @@ +package adapter.objectAdapter; + +public class TargetObject implements Target { + + private AdapteeObject adaptee; + + public TargetObject() + { + adaptee = new AdapteeObject() ; + } + + /** + * @see adapter.objectAdapter.Target#sayHello() + */ + public void sayHello() { + adaptee.printMessage("Hello"); + } + +} + + + diff --git a/demos/patterns/adapter/objectAdapter/package.bluej b/demos/patterns/adapter/objectAdapter/package.bluej new file mode 100644 index 0000000..3ff4a70 --- /dev/null +++ b/demos/patterns/adapter/objectAdapter/package.bluej @@ -0,0 +1,67 @@ +#BlueJ package file +dependency1.from=AdapteeObject +dependency1.to=TargetObject +dependency1.type=UsesDependency +dependency2.from=Client +dependency2.to=Target +dependency2.type=UsesDependency +dependency3.from=Client +dependency3.to=TargetObject +dependency3.type=UsesDependency +dependency4.from=TargetObject +dependency4.to=AdapteeObject +dependency4.type=UsesDependency +objectbench.height=134 +objectbench.width=776 +package.divider.horizontal=0.6 +package.divider.vertical=0.7398523985239852 +package.editor.height=394 +package.editor.width=674 +package.editor.x=133 +package.editor.y=89 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=4 +package.numTargets=5 +package.showExtends=true +package.showUses=false +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=Target +target1.showInterface=false +target1.type=InterfaceTarget +target1.width=80 +target1.x=360 +target1.y=110 +target2.height=50 +target2.name=Adaptee +target2.showInterface=false +target2.type=InterfaceTarget +target2.width=80 +target2.x=100 +target2.y=90 +target3.height=50 +target3.name=AdapteeObject +target3.showInterface=false +target3.type=ClassTarget +target3.width=120 +target3.x=80 +target3.y=210 +target4.height=50 +target4.name=Client +target4.showInterface=false +target4.type=ClassTarget +target4.width=80 +target4.x=220 +target4.y=90 +target5.height=50 +target5.name=TargetObject +target5.showInterface=false +target5.type=ClassTarget +target5.width=110 +target5.x=250 +target5.y=210 diff --git a/demos/patterns/adapter/package.bluej b/demos/patterns/adapter/package.bluej new file mode 100644 index 0000000..85c5677 --- /dev/null +++ b/demos/patterns/adapter/package.bluej @@ -0,0 +1,32 @@ +#BlueJ package file +objectbench.height=162 +objectbench.width=461 +package.divider.horizontal=0.6 +package.divider.vertical=0.6847014925373134 +package.editor.height=360 +package.editor.width=684 +package.editor.x=114 +package.editor.y=69 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=0 +package.numTargets=2 +package.showExtends=true +package.showUses=true +readme.height=60 +readme.name=@README +readme.width=48 +readme.x=10 +readme.y=10 +target1.height=62 +target1.name=objectAdapter +target1.type=PackageTarget +target1.width=110 +target1.x=250 +target1.y=90 +target2.height=62 +target2.name=classAdapter +target2.type=PackageTarget +target2.width=100 +target2.x=120 +target2.y=90 diff --git a/demos/patterns/chain_of_responsibility/Client.java b/demos/patterns/chain_of_responsibility/Client.java new file mode 100644 index 0000000..94aefbd --- /dev/null +++ b/demos/patterns/chain_of_responsibility/Client.java @@ -0,0 +1,25 @@ +package chain_of_responsibility; + +public class Client { + + public static void runTest() + { + Handler h1 = new ConcreteHandler1() ; + Handler h2 = new ConcreteHandler2() ; + Handler h3 = new ConcreteHandler3() ; + + h1.setSuccessor(h2); + h2.setSuccessor(h3); + + System.out.println( "Sending R2..."); + h1.handleRequest("R2"); + System.out.println( "Sending R3..."); + h1.handleRequest("R3"); + System.out.println( "Sending R1..."); + h1.handleRequest("R1"); + System.out.println( "Sending RX..."); + h1.handleRequest("RX"); + + } + +} diff --git a/demos/patterns/chain_of_responsibility/ConcreteHandler1.java b/demos/patterns/chain_of_responsibility/ConcreteHandler1.java new file mode 100644 index 0000000..a5576a1 --- /dev/null +++ b/demos/patterns/chain_of_responsibility/ConcreteHandler1.java @@ -0,0 +1,25 @@ +package chain_of_responsibility; + +public class ConcreteHandler1 implements Handler { + + private Handler successor = null; + + public void handleRequest( String request ) { + System.out.println( "R1 got the request..."); + if ( request.equalsIgnoreCase("R1") ) + { + System.out.println( this.getClass().getName() + " => This one is mine!"); + } + else + { + if ( successor != null ) + successor.handleRequest(request); + } + + } + + public void setSuccessor(Handler next) { + this.successor = next ; + } + +} diff --git a/demos/patterns/chain_of_responsibility/ConcreteHandler2.java b/demos/patterns/chain_of_responsibility/ConcreteHandler2.java new file mode 100644 index 0000000..8931480 --- /dev/null +++ b/demos/patterns/chain_of_responsibility/ConcreteHandler2.java @@ -0,0 +1,26 @@ +package chain_of_responsibility; + +public class ConcreteHandler2 implements Handler { + + private Handler successor = null; + + public void handleRequest( String request ) { + System.out.println( "R2 got the request..."); + if ( request.equalsIgnoreCase("R2") ) + { + System.out.println( this.getClass().getName() + " => This one is mine!"); + } + else + { + if ( successor != null ) + successor.handleRequest(request); + } + + } + + public void setSuccessor(Handler next) { + this.successor = next ; + } + + +} diff --git a/demos/patterns/chain_of_responsibility/ConcreteHandler3.java b/demos/patterns/chain_of_responsibility/ConcreteHandler3.java new file mode 100644 index 0000000..bba7a5a --- /dev/null +++ b/demos/patterns/chain_of_responsibility/ConcreteHandler3.java @@ -0,0 +1,27 @@ +package chain_of_responsibility; + +public class ConcreteHandler3 implements Handler { + + + private Handler successor = null; + + public void handleRequest( String request ) { + System.out.println( "R3 got the request..."); + if ( request.equalsIgnoreCase("R3") ) + { + System.out.println( this.getClass().getName() + " => This one is mine!"); + } + else + { + if ( successor != null ) + successor.handleRequest(request); + } + + } + + public void setSuccessor(Handler next) { + this.successor = next ; + } + + +} diff --git a/demos/patterns/chain_of_responsibility/Handler.java b/demos/patterns/chain_of_responsibility/Handler.java new file mode 100644 index 0000000..d0fee29 --- /dev/null +++ b/demos/patterns/chain_of_responsibility/Handler.java @@ -0,0 +1,8 @@ +package chain_of_responsibility; + +public interface Handler { + + void handleRequest( String request ); + void setSuccessor(Handler next); + +} diff --git a/demos/patterns/chain_of_responsibility/package.bluej b/demos/patterns/chain_of_responsibility/package.bluej new file mode 100644 index 0000000..b048f62 --- /dev/null +++ b/demos/patterns/chain_of_responsibility/package.bluej @@ -0,0 +1,76 @@ +#BlueJ package file +dependency1.from=ConcreteHandler3 +dependency1.to=Handler +dependency1.type=UsesDependency +dependency2.from=ConcreteHandler2 +dependency2.to=Handler +dependency2.type=UsesDependency +dependency3.from=ConcreteHandler1 +dependency3.to=Handler +dependency3.type=UsesDependency +dependency4.from=Client +dependency4.to=Handler +dependency4.type=UsesDependency +dependency5.from=Client +dependency5.to=ConcreteHandler1 +dependency5.type=UsesDependency +dependency6.from=Client +dependency6.to=ConcreteHandler2 +dependency6.type=UsesDependency +dependency7.from=Client +dependency7.to=ConcreteHandler3 +dependency7.type=UsesDependency +objectbench.height=109 +objectbench.width=776 +package.divider.horizontal=0.6 +package.divider.vertical=0.7859778597785978 +package.editor.height=419 +package.editor.width=674 +package.editor.x=114 +package.editor.y=69 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=7 +package.numTargets=5 +package.showExtends=true +package.showUses=false +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=ConcreteHandler3 +target1.showInterface=false +target1.type=ClassTarget +target1.width=140 +target1.x=200 +target1.y=100 +target2.height=50 +target2.name=ConcreteHandler2 +target2.showInterface=false +target2.type=ClassTarget +target2.width=140 +target2.x=440 +target2.y=190 +target3.height=50 +target3.name=ConcreteHandler1 +target3.showInterface=false +target3.type=ClassTarget +target3.width=140 +target3.x=280 +target3.y=200 +target4.height=50 +target4.name=Handler +target4.showInterface=false +target4.type=InterfaceTarget +target4.width=80 +target4.x=420 +target4.y=90 +target5.height=50 +target5.name=Client +target5.showInterface=false +target5.type=ClassTarget +target5.width=80 +target5.x=100 +target5.y=180 diff --git a/demos/patterns/command/Client.java b/demos/patterns/command/Client.java new file mode 100644 index 0000000..93c87a7 --- /dev/null +++ b/demos/patterns/command/Client.java @@ -0,0 +1,38 @@ +package command; + +public class Client { + private String helloMessage = "Hello World!" ; + private String goodbyeMessage = "Goodbye World!" ; + private Menu appMenu = new Menu() ; + + public Menu getMenu() { + return appMenu ; + } + + public void runSetup() { + MenuItem hello = new MenuItem() ; + MenuItem goodbye = new MenuItem() ; + Command sayHello = new ConcreteCommand(); + Command sayGoodbye = new ConcreteCommand(); + sayHello.setReceiver( + new Receiver() { + public void doAction() { + System.out.println( helloMessage ); + } + } + ); + sayGoodbye.setReceiver( + new Receiver() { + public void doAction() { + System.out.println( goodbyeMessage ); + } + } + ); + hello.setCommand( sayHello ); + goodbye.setCommand( sayGoodbye ); + appMenu.addMenuItem(hello, "hello"); + appMenu.addMenuItem(goodbye, "goodbye"); + } + +} + diff --git a/demos/patterns/command/Command.java b/demos/patterns/command/Command.java new file mode 100644 index 0000000..98ea583 --- /dev/null +++ b/demos/patterns/command/Command.java @@ -0,0 +1,8 @@ +package command; + +public interface Command { + + public abstract void execute(); + public abstract void setReceiver(Receiver target); +} + diff --git a/demos/patterns/command/ConcreteCommand.java b/demos/patterns/command/ConcreteCommand.java new file mode 100644 index 0000000..0f129f7 --- /dev/null +++ b/demos/patterns/command/ConcreteCommand.java @@ -0,0 +1,16 @@ +package command; + +public class ConcreteCommand implements Command { + + private Receiver theReceiver ; + + public void execute() { + theReceiver.doAction(); + } + + public void setReceiver(Receiver target) { + theReceiver = target ; + } + +} + diff --git a/demos/patterns/command/Invoker.java b/demos/patterns/command/Invoker.java new file mode 100644 index 0000000..6c15b8a --- /dev/null +++ b/demos/patterns/command/Invoker.java @@ -0,0 +1,8 @@ +package command; + +public interface Invoker { + + public abstract void setCommand(Command cmd); + public abstract void invoke(); +} + diff --git a/demos/patterns/command/Menu.java b/demos/patterns/command/Menu.java new file mode 100644 index 0000000..4755f99 --- /dev/null +++ b/demos/patterns/command/Menu.java @@ -0,0 +1,22 @@ +package command; + +import java.util.HashMap; + +public class Menu { + + private HashMap menuItems = new HashMap() ; + + public void addMenuItem( MenuItem item, String key ) { + menuItems.put( key, item ) ; + } + + public void selectMenuItem( String key ) { + MenuItem item = menuItems.get(key) ; + if ( item != null ) + item.invoke(); + else + System.out.println( "Menu Item Not Found: " + key ); + } + +} + diff --git a/demos/patterns/command/MenuItem.java b/demos/patterns/command/MenuItem.java new file mode 100644 index 0000000..1e893f1 --- /dev/null +++ b/demos/patterns/command/MenuItem.java @@ -0,0 +1,16 @@ +package command; + +public class MenuItem implements Invoker { + + private Command theCommand ; + + public void setCommand(Command cmd) { + theCommand = cmd ; + } + + public void invoke() { + theCommand.execute(); + } + +} + diff --git a/demos/patterns/command/Receiver.java b/demos/patterns/command/Receiver.java new file mode 100644 index 0000000..dca381b --- /dev/null +++ b/demos/patterns/command/Receiver.java @@ -0,0 +1,8 @@ +package command; + +public interface Receiver { + + public void doAction() ; + +} + diff --git a/demos/patterns/command/package.bluej b/demos/patterns/command/package.bluej new file mode 100644 index 0000000..750ee6e --- /dev/null +++ b/demos/patterns/command/package.bluej @@ -0,0 +1,99 @@ +#BlueJ package file +dependency1.from=Invoker +dependency1.to=Command +dependency1.type=UsesDependency +dependency10.from=Client +dependency10.to=Receiver +dependency10.type=UsesDependency +dependency2.from=Command +dependency2.to=Receiver +dependency2.type=UsesDependency +dependency3.from=ConcreteCommand +dependency3.to=Receiver +dependency3.type=UsesDependency +dependency4.from=MenuItem +dependency4.to=Command +dependency4.type=UsesDependency +dependency5.from=Menu +dependency5.to=MenuItem +dependency5.type=UsesDependency +dependency6.from=Client +dependency6.to=Menu +dependency6.type=UsesDependency +dependency7.from=Client +dependency7.to=MenuItem +dependency7.type=UsesDependency +dependency8.from=Client +dependency8.to=Command +dependency8.type=UsesDependency +dependency9.from=Client +dependency9.to=ConcreteCommand +dependency9.type=UsesDependency +objectbench.height=109 +objectbench.width=776 +package.divider.horizontal=0.6 +package.divider.vertical=0.7859778597785978 +package.editor.height=419 +package.editor.width=674 +package.editor.x=114 +package.editor.y=69 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=10 +package.numTargets=7 +package.showExtends=true +package.showUses=false +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=Invoker +target1.showInterface=false +target1.type=InterfaceTarget +target1.width=80 +target1.x=150 +target1.y=120 +target2.height=50 +target2.name=Command +target2.showInterface=false +target2.type=InterfaceTarget +target2.width=90 +target2.x=450 +target2.y=110 +target3.height=50 +target3.name=ConcreteCommand +target3.showInterface=false +target3.type=ClassTarget +target3.width=150 +target3.x=400 +target3.y=200 +target4.height=50 +target4.name=Receiver +target4.showInterface=false +target4.type=InterfaceTarget +target4.width=80 +target4.x=310 +target4.y=120 +target5.height=50 +target5.name=MenuItem +target5.showInterface=false +target5.type=ClassTarget +target5.width=90 +target5.x=280 +target5.y=200 +target6.height=50 +target6.name=Menu +target6.showInterface=false +target6.type=ClassTarget +target6.width=80 +target6.x=20 +target6.y=120 +target7.height=50 +target7.name=Client +target7.showInterface=false +target7.type=ClassTarget +target7.width=80 +target7.x=20 +target7.y=200 diff --git a/demos/patterns/composite/BuildOrder.java b/demos/patterns/composite/BuildOrder.java new file mode 100644 index 0000000..965314f --- /dev/null +++ b/demos/patterns/composite/BuildOrder.java @@ -0,0 +1,32 @@ +package composite; + +public class BuildOrder { + + public static Component getOrder() + { + Composite order = new Composite( "Order" ) ; + order.addChild(new Leaf("Crispy Onion Strings", 5.50 )); + order.addChild(new Leaf("The Purist", 8.00 )); + Composite customBurger = new Composite( "Build Your Own Burger" ) ; + customBurger.addChild(new Leaf("Beef, 1/3 lb on a Bun", 9.50 )); // base price for 1/3 lb + customBurger.addChild(new Leaf("Danish Blue Cheese", 0.00 )); // 1 cheese free, extra cheese +1.00 + customBurger.addChild(new Leaf("Horseradish Cheddar", 1.00 )); // extra cheese +1.00 + customBurger.addChild(new Leaf("Bermuda Red Onion", 0.00 )); // 4 toppings free, extra +.75 + customBurger.addChild(new Leaf("Black Olives", 0.00 )); // 4 toppings free, extra +.75 + customBurger.addChild(new Leaf("Carrot Strings", 0.00 )); // 4 toppings free, extra +.75 + customBurger.addChild(new Leaf("Coleslaw", 0.00 )); // 4 toppings free, extra +.75 + customBurger.addChild(new Leaf("Applewood Smoked Bacon", 1.50 )); // premium topping +1.50 + customBurger.addChild(new Leaf("Appricot Sauce", 0.00 )); // 1 sauce free, extra +.75 + order.addChild( customBurger ); + return order ; + } + +} + + +/* + +Counter Burger Menu: +https://thecounterburger.emn8.com/?store=Times%20Square + +*/ \ No newline at end of file diff --git a/demos/patterns/composite/Client.java b/demos/patterns/composite/Client.java new file mode 100644 index 0000000..00941cd --- /dev/null +++ b/demos/patterns/composite/Client.java @@ -0,0 +1,12 @@ +package composite; + +public class Client { + + public static void runTest() + { + Component theOrder = BuildOrder.getOrder() ; + theOrder.printDescription(); + + } +} + diff --git a/demos/patterns/composite/Component.java b/demos/patterns/composite/Component.java new file mode 100644 index 0000000..dee2bbc --- /dev/null +++ b/demos/patterns/composite/Component.java @@ -0,0 +1,11 @@ +package composite; + +public interface Component { + + void printDescription() ; + void addChild(Component c); + void removeChild(Component c); + Component getChild(int i); + +} + diff --git a/demos/patterns/composite/Composite.java b/demos/patterns/composite/Composite.java new file mode 100644 index 0000000..e816e5d --- /dev/null +++ b/demos/patterns/composite/Composite.java @@ -0,0 +1,36 @@ +package composite; + +import java.util.ArrayList; + +public class Composite implements Component { + + private ArrayList components = new ArrayList() ; + private String description ; + + public Composite ( String d ) + { + description = d ; + } + + public void printDescription() { + System.out.println( description ); + for (Component obj : components) + { + obj.printDescription(); + } + } + + public void addChild(Component c) { + components.add( c ) ; + } + + public void removeChild(Component c) { + components.remove(c) ; + } + + public Component getChild(int i) { + return components.get( i ) ; + } + +} + diff --git a/demos/patterns/composite/Leaf.java b/demos/patterns/composite/Leaf.java new file mode 100644 index 0000000..efcfd69 --- /dev/null +++ b/demos/patterns/composite/Leaf.java @@ -0,0 +1,36 @@ +package composite; + +import java.text.DecimalFormat; + + +public class Leaf implements Component { + + private String description ; + private Double price ; + + public Leaf ( String d, Double p ) + { + description = d ; + price = p ; + } + + public void printDescription() { + DecimalFormat fmt = new DecimalFormat("0.00"); + System.out.println( description + " " + fmt.format(price) ) ; + } + + public void addChild(Component c) { + // no implementation + } + + public void removeChild(Component c) { + // no implementation + } + + public Component getChild(int i) { + // no implementation + return null ; + } + +} + diff --git a/demos/patterns/composite/package.bluej b/demos/patterns/composite/package.bluej new file mode 100644 index 0000000..238cfaa --- /dev/null +++ b/demos/patterns/composite/package.bluej @@ -0,0 +1,76 @@ +#BlueJ package file +dependency1.from=Composite +dependency1.to=Component +dependency1.type=UsesDependency +dependency2.from=BuildOrder +dependency2.to=Component +dependency2.type=UsesDependency +dependency3.from=BuildOrder +dependency3.to=Composite +dependency3.type=UsesDependency +dependency4.from=BuildOrder +dependency4.to=Leaf +dependency4.type=UsesDependency +dependency5.from=Leaf +dependency5.to=Component +dependency5.type=UsesDependency +dependency6.from=Client +dependency6.to=Component +dependency6.type=UsesDependency +dependency7.from=Client +dependency7.to=BuildOrder +dependency7.type=UsesDependency +objectbench.height=134 +objectbench.width=776 +package.divider.horizontal=0.6 +package.divider.vertical=0.7398523985239852 +package.editor.height=394 +package.editor.width=674 +package.editor.x=114 +package.editor.y=69 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=7 +package.numTargets=5 +package.showExtends=true +package.showUses=false +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=Composite +target1.showInterface=false +target1.type=ClassTarget +target1.width=90 +target1.x=440 +target1.y=280 +target2.height=50 +target2.name=BuildOrder +target2.showInterface=false +target2.type=ClassTarget +target2.width=90 +target2.x=130 +target2.y=280 +target3.height=50 +target3.name=Leaf +target3.showInterface=false +target3.type=ClassTarget +target3.width=80 +target3.x=290 +target3.y=280 +target4.height=50 +target4.name=Client +target4.showInterface=false +target4.type=ClassTarget +target4.width=80 +target4.x=130 +target4.y=140 +target5.height=50 +target5.name=Component +target5.showInterface=false +target5.type=InterfaceTarget +target5.width=100 +target5.x=350 +target5.y=140 diff --git a/demos/patterns/decorator/Component.java b/demos/patterns/decorator/Component.java new file mode 100644 index 0000000..7bc6937 --- /dev/null +++ b/demos/patterns/decorator/Component.java @@ -0,0 +1,7 @@ +package decorator; + +public interface Component { + + String operation(); + +} diff --git a/demos/patterns/decorator/ConcreteComponent.java b/demos/patterns/decorator/ConcreteComponent.java new file mode 100644 index 0000000..cdac43d --- /dev/null +++ b/demos/patterns/decorator/ConcreteComponent.java @@ -0,0 +1,9 @@ +package decorator; + +public class ConcreteComponent implements Component { + + public String operation() { + return "Hello World!"; + } + +} diff --git a/demos/patterns/decorator/ConcreteDecoratorA.java b/demos/patterns/decorator/ConcreteDecoratorA.java new file mode 100644 index 0000000..d0e4eb2 --- /dev/null +++ b/demos/patterns/decorator/ConcreteDecoratorA.java @@ -0,0 +1,22 @@ +package decorator; + +public class ConcreteDecoratorA extends Decorator { + + private String addedState; + + public ConcreteDecoratorA( Component c) + { + super( c ) ; + } + + public String operation() + { + addedState = super.operation() ; + return addedBehavior( addedState ) ; + } + + private String addedBehavior(String in) { + return "" + addedState + "" ; + } + +} diff --git a/demos/patterns/decorator/ConcreteDecoratorB.java b/demos/patterns/decorator/ConcreteDecoratorB.java new file mode 100644 index 0000000..ab5110d --- /dev/null +++ b/demos/patterns/decorator/ConcreteDecoratorB.java @@ -0,0 +1,22 @@ +package decorator; + +public class ConcreteDecoratorB extends Decorator { + + private String addedState; + + public ConcreteDecoratorB( Component c) + { + super( c ) ; + } + + public String operation() + { + addedState = super.operation() ; + return addedBehavior( addedState ) ; + } + + private String addedBehavior(String in) { + return "

" + addedState + "

" ; + } + +} diff --git a/demos/patterns/decorator/Decorator.java b/demos/patterns/decorator/Decorator.java new file mode 100644 index 0000000..8b9ecb3 --- /dev/null +++ b/demos/patterns/decorator/Decorator.java @@ -0,0 +1,17 @@ +package decorator; + +public class Decorator implements Component { + + private Component component; + + public Decorator( Component c ) + { + component = c ; + } + + public String operation() + { + return component.operation() ; + } + +} diff --git a/demos/patterns/decorator/Tester.java b/demos/patterns/decorator/Tester.java new file mode 100644 index 0000000..86ef14b --- /dev/null +++ b/demos/patterns/decorator/Tester.java @@ -0,0 +1,11 @@ +package decorator; + +public class Tester { + + public static void runTest() + { + Component obj = new ConcreteDecoratorB( new ConcreteDecoratorA( new ConcreteComponent() ) ) ; + String result = obj.operation() ; + System.out.println( result ); + } +} diff --git a/demos/patterns/decorator/package.bluej b/demos/patterns/decorator/package.bluej new file mode 100644 index 0000000..38fd81e --- /dev/null +++ b/demos/patterns/decorator/package.bluej @@ -0,0 +1,62 @@ +#BlueJ package file +objectbench.height=109 +objectbench.width=776 +package.divider.horizontal=0.6 +package.divider.vertical=0.7859778597785978 +package.editor.height=419 +package.editor.width=674 +package.editor.x=114 +package.editor.y=69 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=0 +package.numTargets=6 +package.showExtends=true +package.showUses=true +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=ConcreteDecoratorA +target1.showInterface=false +target1.type=ClassTarget +target1.width=150 +target1.x=150 +target1.y=100 +target2.height=50 +target2.name=Decorator +target2.showInterface=false +target2.type=ClassTarget +target2.width=90 +target2.x=400 +target2.y=100 +target3.height=50 +target3.name=ConcreteComponent +target3.showInterface=false +target3.type=ClassTarget +target3.width=150 +target3.x=220 +target3.y=300 +target4.height=50 +target4.name=Tester +target4.showInterface=false +target4.type=ClassTarget +target4.width=80 +target4.x=50 +target4.y=300 +target5.height=50 +target5.name=ConcreteDecoratorB +target5.showInterface=false +target5.type=ClassTarget +target5.width=150 +target5.x=160 +target5.y=180 +target6.height=50 +target6.name=Component +target6.showInterface=false +target6.type=InterfaceTarget +target6.width=100 +target6.x=400 +target6.y=220 diff --git a/demos/patterns/decorator/test.html b/demos/patterns/decorator/test.html new file mode 100644 index 0000000..3a34cc5 --- /dev/null +++ b/demos/patterns/decorator/test.html @@ -0,0 +1,4 @@ + +

+Hello World +

diff --git a/demos/patterns/factory_method/Creator.java b/demos/patterns/factory_method/Creator.java new file mode 100644 index 0000000..76feddc --- /dev/null +++ b/demos/patterns/factory_method/Creator.java @@ -0,0 +1,26 @@ +package factory_method; + +public abstract class Creator { + + String order ; + + public abstract Engine getEngine(); + + public void takeOrder(String order) { + this.order = order ; + } + + public void buildOrder() { + Engine eng = getEngine() ; + System.out.println( "Building Order: " + this.order ); + System.out.println( "Pull Engine..." + + eng.getClass().getName() ); + System.out.println( "Assemble Car..." ); + System.out.println( "Paint..."); + System.out.println( "Ship..."); + } + +} + + + diff --git a/demos/patterns/factory_method/Electric.java b/demos/patterns/factory_method/Electric.java new file mode 100644 index 0000000..d69f279 --- /dev/null +++ b/demos/patterns/factory_method/Electric.java @@ -0,0 +1,5 @@ +package factory_method; + +public class Electric implements Engine { + +} diff --git a/demos/patterns/factory_method/Engine.java b/demos/patterns/factory_method/Engine.java new file mode 100644 index 0000000..f59de3c --- /dev/null +++ b/demos/patterns/factory_method/Engine.java @@ -0,0 +1,5 @@ +package factory_method; + +public interface Engine { + +} diff --git a/demos/patterns/factory_method/Gas.java b/demos/patterns/factory_method/Gas.java new file mode 100644 index 0000000..8b58271 --- /dev/null +++ b/demos/patterns/factory_method/Gas.java @@ -0,0 +1,5 @@ +package factory_method; + +public class Gas implements Engine { + +} diff --git a/demos/patterns/factory_method/Hybrid.java b/demos/patterns/factory_method/Hybrid.java new file mode 100644 index 0000000..7fa49df --- /dev/null +++ b/demos/patterns/factory_method/Hybrid.java @@ -0,0 +1,5 @@ +package factory_method; + +public class Hybrid implements Engine { + +} diff --git a/demos/patterns/factory_method/PriusFactory.java b/demos/patterns/factory_method/PriusFactory.java new file mode 100644 index 0000000..ae59ed6 --- /dev/null +++ b/demos/patterns/factory_method/PriusFactory.java @@ -0,0 +1,11 @@ +package factory_method; + +public class PriusFactory extends Creator { + + public Engine getEngine() { + return new Hybrid(); + } + +} + + diff --git a/demos/patterns/factory_method/TeslaFactory.java b/demos/patterns/factory_method/TeslaFactory.java new file mode 100644 index 0000000..ab281ac --- /dev/null +++ b/demos/patterns/factory_method/TeslaFactory.java @@ -0,0 +1,9 @@ +package factory_method; + +public class TeslaFactory extends Creator { + + public Engine getEngine() { + return new Electric() ; + } + +} diff --git a/demos/patterns/factory_method/VolvoFactory.java b/demos/patterns/factory_method/VolvoFactory.java new file mode 100644 index 0000000..2494c87 --- /dev/null +++ b/demos/patterns/factory_method/VolvoFactory.java @@ -0,0 +1,9 @@ +package factory_method; + +public class VolvoFactory extends Creator { + + public Engine getEngine() { + return new Gas(); + } + +} diff --git a/demos/patterns/factory_method/package.bluej b/demos/patterns/factory_method/package.bluej new file mode 100644 index 0000000..82a6922 --- /dev/null +++ b/demos/patterns/factory_method/package.bluej @@ -0,0 +1,76 @@ +#BlueJ package file +objectbench.height=101 +objectbench.width=776 +package.divider.horizontal=0.6 +package.divider.vertical=0.8007380073800738 +package.editor.height=427 +package.editor.width=674 +package.editor.x=114 +package.editor.y=69 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=0 +package.numTargets=8 +package.showExtends=true +package.showUses=true +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=TeslaFactory +target1.showInterface=false +target1.type=ClassTarget +target1.width=110 +target1.x=20 +target1.y=160 +target2.height=50 +target2.name=Electric +target2.showInterface=false +target2.type=ClassTarget +target2.width=80 +target2.x=300 +target2.y=90 +target3.height=50 +target3.name=Gas +target3.showInterface=false +target3.type=ClassTarget +target3.width=80 +target3.x=520 +target3.y=270 +target4.height=50 +target4.name=Hybrid +target4.showInterface=false +target4.type=ClassTarget +target4.width=80 +target4.x=340 +target4.y=270 +target5.height=50 +target5.name=PriusFactory +target5.showInterface=false +target5.type=ClassTarget +target5.width=100 +target5.x=130 +target5.y=260 +target6.height=50 +target6.name=VolvoFactory +target6.showInterface=false +target6.type=ClassTarget +target6.width=110 +target6.x=240 +target6.y=180 +target7.height=50 +target7.name=Creator +target7.showInterface=false +target7.type=AbstractTarget +target7.width=80 +target7.x=140 +target7.y=90 +target8.height=50 +target8.name=Engine +target8.showInterface=false +target8.type=InterfaceTarget +target8.width=80 +target8.x=430 +target8.y=150 diff --git a/demos/patterns/iterator/QueryResults.java b/demos/patterns/iterator/QueryResults.java new file mode 100644 index 0000000..95d18ad --- /dev/null +++ b/demos/patterns/iterator/QueryResults.java @@ -0,0 +1,8 @@ +package iterator; + +public interface QueryResults { + + QueryResultsIterator createIterator(); + void fetchData() ; +} + diff --git a/demos/patterns/iterator/QueryResultsImpl.java b/demos/patterns/iterator/QueryResultsImpl.java new file mode 100644 index 0000000..7de8676 --- /dev/null +++ b/demos/patterns/iterator/QueryResultsImpl.java @@ -0,0 +1,29 @@ +package iterator; + +import java.util.ArrayList; + +public class QueryResultsImpl implements QueryResults { + + private ArrayList results = new ArrayList() ; + + public void fetchData() + { + // setup a sample list + results.add( "Item 1") ; + results.add( "Item 2") ; + results.add( "Item 3") ; + results.add( "Item 4") ; + results.add( "Item 5") ; + results.add( "Item 6") ; + results.add( "Item 7") ; + results.add( "Item 8") ; + results.add( "Item 9") ; + results.add( "Item 10") ; + } + + public QueryResultsIterator createIterator() { + return new QueryResultsIteratorImpl( results ); + } + +} + diff --git a/demos/patterns/iterator/QueryResultsIterator.java b/demos/patterns/iterator/QueryResultsIterator.java new file mode 100644 index 0000000..06bee0f --- /dev/null +++ b/demos/patterns/iterator/QueryResultsIterator.java @@ -0,0 +1,11 @@ +package iterator; + +public interface QueryResultsIterator { + + String first(); + String next(); + String currentItem(); + boolean isDone(); + +} + diff --git a/demos/patterns/iterator/QueryResultsIteratorImpl.java b/demos/patterns/iterator/QueryResultsIteratorImpl.java new file mode 100644 index 0000000..c359266 --- /dev/null +++ b/demos/patterns/iterator/QueryResultsIteratorImpl.java @@ -0,0 +1,39 @@ +package iterator; + +import java.util.ArrayList; + +public class QueryResultsIteratorImpl implements QueryResultsIterator { + + private ArrayList results ; + private int cursor ; + private int max ; + + public QueryResultsIteratorImpl(ArrayList r) + { + results = r ; + cursor = 0 ; + max = r.size() ; + } + + public String first() { + return results.get( 0 ) ; + } + + public String next() { + cursor++ ; + if ( !isDone() ) + return results.get( cursor ) ; + else + return "" ; + } + + public String currentItem() { + return results.get( cursor ) ; + } + + public boolean isDone() { + return (cursor == max) ; + } + +} + diff --git a/demos/patterns/iterator/QueryTool.java b/demos/patterns/iterator/QueryTool.java new file mode 100644 index 0000000..0edec56 --- /dev/null +++ b/demos/patterns/iterator/QueryTool.java @@ -0,0 +1,27 @@ +package iterator; + +public class QueryTool { + + public class Query { + public QueryResults executeQuery(String query) { + System.out.println( "Executing Query: " + query ); + QueryResults resultSet = new QueryResultsImpl() ; + resultSet.fetchData(); + return resultSet ; + } + } + + public void runTest() + { + Query q = new Query() ; + QueryResults resultSet = q.executeQuery("select * from test"); + QueryResultsIterator iter = resultSet.createIterator() ; + while ( !iter.isDone() ) + { + System.out.println( iter.currentItem() ); + iter.next(); + } + } + +} + diff --git a/demos/patterns/iterator/package.bluej b/demos/patterns/iterator/package.bluej new file mode 100644 index 0000000..79d3120 --- /dev/null +++ b/demos/patterns/iterator/package.bluej @@ -0,0 +1,73 @@ +#BlueJ package file +dependency1.from=QueryResultsImpl +dependency1.to=QueryResultsIterator +dependency1.type=UsesDependency +dependency2.from=QueryResultsImpl +dependency2.to=QueryResultsIteratorImpl +dependency2.type=UsesDependency +dependency3.from=QueryResults +dependency3.to=QueryResultsIterator +dependency3.type=UsesDependency +dependency4.from=QueryTool +dependency4.to=QueryResults +dependency4.type=UsesDependency +dependency5.from=QueryTool +dependency5.to=QueryResultsImpl +dependency5.type=UsesDependency +dependency6.from=QueryTool +dependency6.to=QueryResultsIterator +dependency6.type=UsesDependency +objectbench.height=113 +objectbench.width=776 +package.divider.horizontal=0.6 +package.divider.vertical=0.7785977859778598 +package.editor.height=415 +package.editor.width=674 +package.editor.x=114 +package.editor.y=69 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=6 +package.numTargets=5 +package.showExtends=true +package.showUses=false +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=QueryResultsImpl +target1.showInterface=false +target1.type=ClassTarget +target1.width=130 +target1.x=430 +target1.y=230 +target2.height=50 +target2.name=QueryResultsIterator +target2.showInterface=false +target2.type=InterfaceTarget +target2.width=150 +target2.x=200 +target2.y=130 +target3.height=50 +target3.name=QueryResults +target3.showInterface=false +target3.type=InterfaceTarget +target3.width=110 +target3.x=440 +target3.y=130 +target4.height=50 +target4.name=QueryResultsIteratorImpl +target4.showInterface=false +target4.type=ClassTarget +target4.width=180 +target4.x=180 +target4.y=230 +target5.height=50 +target5.name=QueryTool +target5.showInterface=false +target5.type=ClassTarget +target5.width=90 +target5.x=20 +target5.y=130 diff --git a/demos/patterns/observer/ConcreteObserver.java b/demos/patterns/observer/ConcreteObserver.java new file mode 100644 index 0000000..757304e --- /dev/null +++ b/demos/patterns/observer/ConcreteObserver.java @@ -0,0 +1,23 @@ +package observer; + +public class ConcreteObserver implements Observer { + + protected String observerState; + protected ConcreteSubject subject; + + public ConcreteObserver( ConcreteSubject theSubject ) + { + this.subject = theSubject ; + } + + public void update() { + // do nothing + } + + public void showState() + { + System.out.println( "Observer: " + this.getClass().getName() + " = " + observerState ); + } + +} + diff --git a/demos/patterns/observer/ConcreteSubject.java b/demos/patterns/observer/ConcreteSubject.java new file mode 100644 index 0000000..3be0290 --- /dev/null +++ b/demos/patterns/observer/ConcreteSubject.java @@ -0,0 +1,41 @@ +package observer; + +import java.util.ArrayList; + +public class ConcreteSubject implements Subject { + + private String subjectState; + + private ArrayList observers = new ArrayList() ; + + public String getState() { + return subjectState ; + } + + public void setState(String status) { + subjectState = status ; + notifyObservers(); + } + + public void attach(Observer obj) { + observers.add(obj) ; + } + + public void detach(Observer obj) { + observers.remove(obj) ; + } + + public void notifyObservers() { + for (Observer obj : observers) + { + obj.update(); + } + } + + public void showState() + { + System.out.println( "Subject: " + this.getClass().getName() + " = " + subjectState ); + } + +} + diff --git a/demos/patterns/observer/Observer.java b/demos/patterns/observer/Observer.java new file mode 100644 index 0000000..df84c69 --- /dev/null +++ b/demos/patterns/observer/Observer.java @@ -0,0 +1,7 @@ +package observer; + +public interface Observer { + + public abstract void update(); +} + diff --git a/demos/patterns/observer/ObserverTest.java b/demos/patterns/observer/ObserverTest.java new file mode 100644 index 0000000..6c01382 --- /dev/null +++ b/demos/patterns/observer/ObserverTest.java @@ -0,0 +1,61 @@ +package observer; + + + +import static org.junit.Assert.*; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * The test class ObserverTest. + * + * @author (your name) + * @version (a version number or a date) + */ +public class ObserverTest +{ + /** + * Default constructor for test class ObserverTest + */ + public ObserverTest() + { + } + + /** + * Sets up the test fixture. + * + * Called before every test case method. + */ + @Before + public void setUp() + { + } + + /** + * Tears down the test fixture. + * + * Called after every test case method. + */ + @After + public void tearDown() + { + } + + @Test + public void test1() + { + observer.TheEconomy s = new observer.TheEconomy(); + observer.Pessimist p = new observer.Pessimist(s); + observer.Optimist o = new observer.Optimist(s); + s.attach(p); + s.attach(o); + s.setState("The New iPad is out today"); + p.showState(); + o.showState(); + s.setState("Hey, Its Friday!"); + p.showState(); + o.showState(); + } +} + diff --git a/demos/patterns/observer/Optimist.java b/demos/patterns/observer/Optimist.java new file mode 100644 index 0000000..2792f68 --- /dev/null +++ b/demos/patterns/observer/Optimist.java @@ -0,0 +1,28 @@ +package observer; + +public class Optimist extends ConcreteObserver { + + public Optimist( ConcreteSubject sub ) + { + super( sub ) ; + } + + public void update() { + if ( subject.getState().equalsIgnoreCase("The Price of gas is at $5.00/gal") ) + { + observerState = "Great! It's time to go green." ; + } + else if ( subject.getState().equalsIgnoreCase( "The New iPad is out today" ) ) + { + observerState = "Apple, take my money!" ; + } + else + { + observerState = ":)" ; + } + } + +} + + + diff --git a/demos/patterns/observer/Pessimist.java b/demos/patterns/observer/Pessimist.java new file mode 100644 index 0000000..d103d2c --- /dev/null +++ b/demos/patterns/observer/Pessimist.java @@ -0,0 +1,26 @@ +package observer; + +public class Pessimist extends ConcreteObserver { + + public Pessimist( ConcreteSubject sub ) + { + super( sub ) ; + } + + public void update() { + if ( subject.getState().equalsIgnoreCase("The Price of gas is at $5.00/gal") ) + { + observerState = "This is the beginning of the end of the world!" ; + } + else if ( subject.getState().equalsIgnoreCase( "The New iPad is out today" ) ) + { + observerState = "Not another iPad!" ; + } + else + { + observerState = ":(" ; + } + } + +} + diff --git a/demos/patterns/observer/Subject.java b/demos/patterns/observer/Subject.java new file mode 100644 index 0000000..74e04c2 --- /dev/null +++ b/demos/patterns/observer/Subject.java @@ -0,0 +1,9 @@ +package observer; + +public interface Subject { + + public abstract void attach(Observer obj); + public abstract void detach(Observer obj); + public abstract void notifyObservers(); +} + diff --git a/demos/patterns/observer/TheEconomy.java b/demos/patterns/observer/TheEconomy.java new file mode 100644 index 0000000..76b0539 --- /dev/null +++ b/demos/patterns/observer/TheEconomy.java @@ -0,0 +1,17 @@ +package observer; + +public class TheEconomy extends ConcreteSubject { + + public TheEconomy() + { + super.setState("The Price of gas is at $5.00/gal"); + } + +} + +/* + +The Price of gas is at $5.00/gal +The New iPad is out today + +*/ diff --git a/demos/patterns/observer/package.bluej b/demos/patterns/observer/package.bluej new file mode 100644 index 0000000..d7e6320 --- /dev/null +++ b/demos/patterns/observer/package.bluej @@ -0,0 +1,76 @@ +#BlueJ package file +objectbench.height=101 +objectbench.width=776 +package.divider.horizontal=0.6 +package.divider.vertical=0.8007380073800738 +package.editor.height=427 +package.editor.width=674 +package.editor.x=114 +package.editor.y=69 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=0 +package.numTargets=8 +package.showExtends=true +package.showUses=true +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=Optimist +target1.showInterface=false +target1.type=ClassTarget +target1.width=80 +target1.x=470 +target1.y=290 +target2.height=50 +target2.name=ObserverTest +target2.showInterface=false +target2.type=UnitTestTargetJunit4 +target2.width=110 +target2.x=290 +target2.y=20 +target3.height=50 +target3.name=ConcreteSubject +target3.showInterface=false +target3.type=ClassTarget +target3.width=130 +target3.x=110 +target3.y=220 +target4.height=50 +target4.name=Observer +target4.showInterface=false +target4.type=InterfaceTarget +target4.width=80 +target4.x=310 +target4.y=140 +target5.height=50 +target5.name=TheEconomy +target5.showInterface=false +target5.type=ClassTarget +target5.width=110 +target5.x=120 +target5.y=310 +target6.height=50 +target6.name=ConcreteObserver +target6.showInterface=false +target6.type=ClassTarget +target6.width=140 +target6.x=410 +target6.y=210 +target7.height=50 +target7.name=Subject +target7.showInterface=false +target7.type=InterfaceTarget +target7.width=80 +target7.x=130 +target7.y=130 +target8.height=50 +target8.name=Pessimist +target8.showInterface=false +target8.type=ClassTarget +target8.width=80 +target8.x=310 +target8.y=290 diff --git a/demos/patterns/package.bluej b/demos/patterns/package.bluej new file mode 100644 index 0000000..c629bdd --- /dev/null +++ b/demos/patterns/package.bluej @@ -0,0 +1,97 @@ +#BlueJ package file +editor.fx.0.height=0 +editor.fx.0.width=0 +editor.fx.0.x=0 +editor.fx.0.y=0 +objectbench.height=163 +objectbench.width=600 +package.divider.horizontal=0.599802371541502 +package.divider.vertical=0.7384615384615385 +package.editor.height=473 +package.editor.width=916 +package.editor.x=94 +package.editor.y=49 +package.frame.height=714 +package.frame.width=1032 +package.numDependencies=0 +package.numTargets=12 +package.showExtends=true +package.showUses=true +project.charset=UTF-8 +readme.height=60 +readme.name=@README +readme.width=48 +readme.x=10 +readme.y=10 +target1.height=62 +target1.name=singleton +target1.type=PackageTarget +target1.width=80 +target1.x=360 +target1.y=10 +target10.height=62 +target10.name=state +target10.type=PackageTarget +target10.width=80 +target10.x=500 +target10.y=10 +target11.height=62 +target11.name=factory_method +target11.type=PackageTarget +target11.width=120 +target11.x=350 +target11.y=120 +target12.height=62 +target12.name=strategy +target12.type=PackageTarget +target12.width=80 +target12.x=500 +target12.y=220 +target2.height=62 +target2.name=decorator +target2.type=PackageTarget +target2.width=80 +target2.x=250 +target2.y=120 +target3.height=62 +target3.name=adapter +target3.type=PackageTarget +target3.width=80 +target3.x=90 +target3.y=10 +target4.height=62 +target4.name=chain_of_responsibility +target4.type=PackageTarget +target4.width=160 +target4.x=70 +target4.y=120 +target5.height=62 +target5.name=command +target5.type=PackageTarget +target5.width=80 +target5.x=80 +target5.y=220 +target6.height=62 +target6.name=proxy +target6.type=PackageTarget +target6.width=80 +target6.x=500 +target6.y=120 +target7.height=62 +target7.name=observer +target7.type=PackageTarget +target7.width=80 +target7.x=220 +target7.y=10 +target8.height=62 +target8.name=iterator +target8.type=PackageTarget +target8.width=80 +target8.x=360 +target8.y=220 +target9.height=62 +target9.name=composite +target9.type=PackageTarget +target9.width=90 +target9.x=210 +target9.y=220 diff --git a/demos/patterns/proxy/AccessProxy.java b/demos/patterns/proxy/AccessProxy.java new file mode 100644 index 0000000..eeb87d4 --- /dev/null +++ b/demos/patterns/proxy/AccessProxy.java @@ -0,0 +1,28 @@ +package proxy; + +public class AccessProxy implements SubjectProxy { + + RealSubject subject = new RealSubject() ; + + /** + * @see proxy.SubjectProxy#readData(java.lang.String) + */ + public String readData(String authToken) throws Exception { + if ( authToken.equalsIgnoreCase("1234567890") ) + return subject.readData() ; + else + throw new Exception( "Unauthorized Access" ) ; + } + + /** + * @see proxy.SubjectProxy#writeData(java.lang.String, java.lang.String) + */ + public void writeData(String authToken, String data) throws Exception { + if ( authToken.equalsIgnoreCase("1234567890") ) + subject.writeData(data); + else + throw new Exception( "Unauthorized Access" ) ; + } + +} + diff --git a/demos/patterns/proxy/CachingProxy.java b/demos/patterns/proxy/CachingProxy.java new file mode 100644 index 0000000..7f2d38d --- /dev/null +++ b/demos/patterns/proxy/CachingProxy.java @@ -0,0 +1,33 @@ +package proxy; + +public class CachingProxy implements SubjectProxy { + + RealSubject subject = new RealSubject(); + String dataCache = null; + Boolean cacheExpired = false; + + /** + * @see proxy.SubjectProxy#readData(java.lang.String) + */ + public String readData(String authToken) throws Exception { + if (dataCache != null && !cacheExpired) { + System.out.println("Cache hit! Returning cached data."); + return dataCache; + } + else { + dataCache = subject.readData(); + cacheExpired = false; + return dataCache; + } + } + + /** + * @see proxy.SubjectProxy#writeData(java.lang.String, java.lang.String) + */ + public void writeData(String authToken, String data) throws Exception { + subject.writeData(data); + dataCache = data; + cacheExpired = false; + } +} + diff --git a/demos/patterns/proxy/Client.java b/demos/patterns/proxy/Client.java new file mode 100644 index 0000000..6b731bf --- /dev/null +++ b/demos/patterns/proxy/Client.java @@ -0,0 +1,30 @@ +package proxy; + +public class Client { + + private SubjectProxy proxy1 = new AccessProxy() ; + private SubjectProxy proxy2 = new CachingProxy() ; + private SubjectProxy proxy3 = new RemotingProxy() ; + + public void runTest() { + try { + // read + System.out.println( proxy1.readData("1234567890") ); + System.out.println( proxy2.readData("1234567890") ); + System.out.println( proxy3.readData("1234567890") ); + // cache hit + System.out.println( proxy2.readData("1234567890") ); + // write + proxy1.writeData("1234567890", "New Data"); + proxy2.writeData("1234567890", "New Data"); + proxy3.writeData("1234567890", "New Data"); + // access violation + proxy1.readData("0000000000"); + } + catch (Exception e) + { + System.out.println( e.getMessage() ); + } + } +} + diff --git a/demos/patterns/proxy/RealSubject.java b/demos/patterns/proxy/RealSubject.java new file mode 100644 index 0000000..42246c2 --- /dev/null +++ b/demos/patterns/proxy/RealSubject.java @@ -0,0 +1,27 @@ +package proxy; + +public class RealSubject { + + String theData ; + + public RealSubject() + { + theData = "Hello World!" ; + } + + /** + * @see proxy.SubjectProxy#readData(java.lang.String) + */ + public String readData() { + return theData ; + } + + /** + * @see proxy.SubjectProxy#writeData(java.lang.String, java.lang.String) + */ + public void writeData(String data) { + theData = data ; + } + +} + diff --git a/demos/patterns/proxy/RemotingProxy.java b/demos/patterns/proxy/RemotingProxy.java new file mode 100644 index 0000000..b48106c --- /dev/null +++ b/demos/patterns/proxy/RemotingProxy.java @@ -0,0 +1,26 @@ +package proxy; + +public class RemotingProxy implements SubjectProxy { + + private class HttpClient { + public String get( String url ) { return "The Remote Data!" ; } + public void put( String url, String data ) { System.out.println( "Remote Host Update Processed!");} + } + // subject is remote! access will be via HTTP PUT/GET + HttpClient httpClient = new HttpClient() ; + + /** + * @see proxy.SubjectProxy#readData(java.lang.String) + */ + public String readData(String authToken) throws Exception { + return httpClient.get( "http://remoteserver/data/id/12345" ) ; + } + + /** + * @see proxy.SubjectProxy#writeData(java.lang.String, java.lang.String) + */ + public void writeData(String authToken, String data) throws Exception { + httpClient.put( "http://remoteserver/data/id/12345", data); + } +} + diff --git a/demos/patterns/proxy/SubjectProxy.java b/demos/patterns/proxy/SubjectProxy.java new file mode 100644 index 0000000..420d9db --- /dev/null +++ b/demos/patterns/proxy/SubjectProxy.java @@ -0,0 +1,8 @@ +package proxy; + +public interface SubjectProxy { + + public abstract String readData(String authToken) throws Exception ; + public abstract void writeData(String authToken, String data) throws Exception ; +} + diff --git a/demos/patterns/proxy/package.bluej b/demos/patterns/proxy/package.bluej new file mode 100644 index 0000000..0762493 --- /dev/null +++ b/demos/patterns/proxy/package.bluej @@ -0,0 +1,62 @@ +#BlueJ package file +objectbench.height=109 +objectbench.width=776 +package.divider.horizontal=0.6 +package.divider.vertical=0.7859778597785978 +package.editor.height=419 +package.editor.width=674 +package.editor.x=114 +package.editor.y=69 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=0 +package.numTargets=6 +package.showExtends=true +package.showUses=true +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=SubjectProxy +target1.showInterface=false +target1.type=InterfaceTarget +target1.width=110 +target1.x=280 +target1.y=110 +target2.height=50 +target2.name=RealSubject +target2.showInterface=false +target2.type=ClassTarget +target2.width=100 +target2.x=500 +target2.y=120 +target3.height=50 +target3.name=AccessProxy +target3.showInterface=false +target3.type=ClassTarget +target3.width=110 +target3.x=150 +target3.y=200 +target4.height=50 +target4.name=RemotingProxy +target4.showInterface=false +target4.type=ClassTarget +target4.width=120 +target4.x=260 +target4.y=280 +target5.height=50 +target5.name=Client +target5.showInterface=false +target5.type=ClassTarget +target5.width=80 +target5.x=40 +target5.y=110 +target6.height=50 +target6.name=CachingProxy +target6.showInterface=false +target6.type=ClassTarget +target6.width=110 +target6.x=430 +target6.y=250 diff --git a/demos/patterns/singleton/Client.java b/demos/patterns/singleton/Client.java new file mode 100644 index 0000000..4f8151b --- /dev/null +++ b/demos/patterns/singleton/Client.java @@ -0,0 +1,18 @@ +package singleton; + +public class Client { + + private Singleton theSingleton; + + public void runTest() { + + // error - can not instantiate directly + //theSingleton = new Singleton() ; + + // access the singleton instance + theSingleton = Singleton.getInstance() ; + + } + +} + diff --git a/demos/patterns/singleton/Singleton.java b/demos/patterns/singleton/Singleton.java new file mode 100644 index 0000000..d9f62d3 --- /dev/null +++ b/demos/patterns/singleton/Singleton.java @@ -0,0 +1,23 @@ +package singleton; + +/* classic version */ + +public class Singleton { + + private static Singleton instance; + + private Singleton() { + } + + public static Singleton getInstance() { + if (instance == null) { + instance = new Singleton(); + } + return instance; + } +} + + + + + diff --git a/demos/patterns/singleton/SingletonDoubleCheckLock.java b/demos/patterns/singleton/SingletonDoubleCheckLock.java new file mode 100644 index 0000000..270d876 --- /dev/null +++ b/demos/patterns/singleton/SingletonDoubleCheckLock.java @@ -0,0 +1,24 @@ +package singleton; + +/* double check lock version -- not guaranteed to work prior to Java 5 */ + +public class SingletonDoubleCheckLock { + + private volatile static SingletonDoubleCheckLock uniqueInstance; + + private SingletonDoubleCheckLock() { + } + + public static SingletonDoubleCheckLock getInstance() { + if (uniqueInstance == null) { + synchronized (SingletonDoubleCheckLock.class) { + if (uniqueInstance == null) { + uniqueInstance = new SingletonDoubleCheckLock(); + } + } + } + return uniqueInstance; + } +} + + diff --git a/demos/patterns/singleton/SingletonThreadSafe.java b/demos/patterns/singleton/SingletonThreadSafe.java new file mode 100644 index 0000000..873d1e3 --- /dev/null +++ b/demos/patterns/singleton/SingletonThreadSafe.java @@ -0,0 +1,20 @@ +package singleton; + +/* thread safe version */ + +public class SingletonThreadSafe { + + private static SingletonThreadSafe uniqueInstance; + + private SingletonThreadSafe() { + } + + public static synchronized SingletonThreadSafe getInstance() { + if (uniqueInstance == null) { + uniqueInstance = new SingletonThreadSafe(); + } + return uniqueInstance; + } + +} + diff --git a/demos/patterns/singleton/package.bluej b/demos/patterns/singleton/package.bluej new file mode 100644 index 0000000..a8169ac --- /dev/null +++ b/demos/patterns/singleton/package.bluej @@ -0,0 +1,51 @@ +#BlueJ package file +dependency1.from=Client +dependency1.to=Singleton +dependency1.type=UsesDependency +objectbench.height=109 +objectbench.width=776 +package.divider.horizontal=0.6 +package.divider.vertical=0.7859778597785978 +package.editor.height=419 +package.editor.width=674 +package.editor.x=114 +package.editor.y=69 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=1 +package.numTargets=4 +package.showExtends=true +package.showUses=true +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=SingletonDoubleCheckLock +target1.showInterface=false +target1.type=ClassTarget +target1.width=200 +target1.x=70 +target1.y=90 +target2.height=50 +target2.name=Singleton +target2.showInterface=false +target2.type=ClassTarget +target2.width=80 +target2.x=60 +target2.y=210 +target3.height=50 +target3.name=Client +target3.showInterface=false +target3.type=ClassTarget +target3.width=80 +target3.x=190 +target3.y=160 +target4.height=50 +target4.name=SingletonThreadSafe +target4.showInterface=false +target4.type=ClassTarget +target4.width=160 +target4.x=310 +target4.y=210 diff --git a/demos/patterns/state/VirtualMachineManager.java b/demos/patterns/state/VirtualMachineManager.java new file mode 100644 index 0000000..56acc1f --- /dev/null +++ b/demos/patterns/state/VirtualMachineManager.java @@ -0,0 +1,53 @@ +package state; + +public class VirtualMachineManager { + + VirtualMachineState poweredOnState ; + VirtualMachineState poweredOffState ; + VirtualMachineState suspendedState ; + VirtualMachineState currentState ; + + public VirtualMachineManager() + { + poweredOnState = new VmPoweredOn(this); + poweredOffState = new VmPoweredOff(this); + suspendedState = new VmSuspended(this); + currentState = poweredOffState ; + } + + public void powerOn() { + System.out.println( "powering on..."); + currentState.doPowerOn(); + } + + public void powerOff() { + System.out.println( "powering off..."); + currentState.doPowerOff(); + } + + public void suspend() { + System.out.println( "suspending..."); + currentState.doSuspend(); + } + + public void reset() { + System.out.println( "reset vm..."); + currentState.doReset(); + } + + void setState(VmStates nextState) { + switch( nextState ) { + case OFF : currentState = poweredOffState ; break ; + case ON : currentState = poweredOnState ; break ; + case SUSPENDED: currentState = suspendedState ; break ; + } + + } + + public void showState() + { + System.out.println( "Current State: " + currentState.getClass().getName()); + } + +} + diff --git a/demos/patterns/state/VirtualMachineState.java b/demos/patterns/state/VirtualMachineState.java new file mode 100644 index 0000000..70795eb --- /dev/null +++ b/demos/patterns/state/VirtualMachineState.java @@ -0,0 +1,10 @@ +package state; + +public interface VirtualMachineState { + + public abstract void doPowerOn(); + public abstract void doPowerOff(); + public abstract void doSuspend(); + public abstract void doReset(); +} + diff --git a/demos/patterns/state/VmPoweredOff.java b/demos/patterns/state/VmPoweredOff.java new file mode 100644 index 0000000..cb277fd --- /dev/null +++ b/demos/patterns/state/VmPoweredOff.java @@ -0,0 +1,16 @@ +package state; + +public class VmPoweredOff extends VmState { + + public VmPoweredOff( VirtualMachineManager vmm ) + { + super( vmm ) ; + } + + @Override + public void doPowerOn() { + vm_manager.setState( VmStates.ON ); + } + +} + diff --git a/demos/patterns/state/VmPoweredOn.java b/demos/patterns/state/VmPoweredOn.java new file mode 100644 index 0000000..f81beae --- /dev/null +++ b/demos/patterns/state/VmPoweredOn.java @@ -0,0 +1,26 @@ +package state; + +public class VmPoweredOn extends VmState { + + public VmPoweredOn( VirtualMachineManager vmm ) + { + super( vmm ) ; + } + + @Override + public void doPowerOff() { + vm_manager.setState( VmStates.OFF ); + } + + @Override + public void doSuspend() { + vm_manager.setState( VmStates.SUSPENDED ); + } + + @Override + public void doReset() { + vm_manager.setState( VmStates.ON ); + } + +} + diff --git a/demos/patterns/state/VmState.java b/demos/patterns/state/VmState.java new file mode 100644 index 0000000..7c2968d --- /dev/null +++ b/demos/patterns/state/VmState.java @@ -0,0 +1,28 @@ +package state; + +public class VmState implements VirtualMachineState { + + VirtualMachineManager vm_manager; + + public VmState(VirtualMachineManager vmm) { + vm_manager = vmm ; + } + + public void doPowerOn() { + System.out.println( "Power On is not valid in " + this.getClass().getName() + " state." ); + } + + public void doPowerOff() { + System.out.println( "Power Off is not valid in " + this.getClass().getName() + " state." ); + } + + public void doSuspend() { + System.out.println( "Suspend is not valid in " + this.getClass().getName() + " state." ); + } + + public void doReset() { + System.out.println( "Reset is not valid in " + this.getClass().getName() + " state." ); + } + +} + diff --git a/demos/patterns/state/VmStates.java b/demos/patterns/state/VmStates.java new file mode 100644 index 0000000..d6dfe54 --- /dev/null +++ b/demos/patterns/state/VmStates.java @@ -0,0 +1,5 @@ +package state; + +public enum VmStates { + ON, OFF, SUSPENDED +} diff --git a/demos/patterns/state/VmSuspended.java b/demos/patterns/state/VmSuspended.java new file mode 100644 index 0000000..d6977d7 --- /dev/null +++ b/demos/patterns/state/VmSuspended.java @@ -0,0 +1,16 @@ +package state; + +public class VmSuspended extends VmState { + + public VmSuspended( VirtualMachineManager vmm ) + { + super( vmm ) ; + } + + @Override + public void doPowerOn() { + vm_manager.setState( VmStates.ON ); + } + +} + diff --git a/demos/patterns/state/package.bluej b/demos/patterns/state/package.bluej new file mode 100644 index 0000000..aca5b99 --- /dev/null +++ b/demos/patterns/state/package.bluej @@ -0,0 +1,105 @@ +#BlueJ package file +dependency1.from=VmSuspended +dependency1.to=VirtualMachineManager +dependency1.type=UsesDependency +dependency10.from=VirtualMachineManager +dependency10.to=VmStates +dependency10.type=UsesDependency +dependency11.from=VmPoweredOn +dependency11.to=VirtualMachineManager +dependency11.type=UsesDependency +dependency12.from=VmPoweredOn +dependency12.to=VmStates +dependency12.type=UsesDependency +dependency2.from=VmSuspended +dependency2.to=VmStates +dependency2.type=UsesDependency +dependency3.from=VmState +dependency3.to=VirtualMachineManager +dependency3.type=UsesDependency +dependency4.from=VmPoweredOff +dependency4.to=VirtualMachineManager +dependency4.type=UsesDependency +dependency5.from=VmPoweredOff +dependency5.to=VmStates +dependency5.type=UsesDependency +dependency6.from=VirtualMachineManager +dependency6.to=VirtualMachineState +dependency6.type=UsesDependency +dependency7.from=VirtualMachineManager +dependency7.to=VmPoweredOn +dependency7.type=UsesDependency +dependency8.from=VirtualMachineManager +dependency8.to=VmPoweredOff +dependency8.type=UsesDependency +dependency9.from=VirtualMachineManager +dependency9.to=VmSuspended +dependency9.type=UsesDependency +objectbench.height=101 +objectbench.width=776 +package.divider.horizontal=0.6 +package.divider.vertical=0.8007380073800738 +package.editor.height=427 +package.editor.width=674 +package.editor.x=114 +package.editor.y=69 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=12 +package.numTargets=7 +package.showExtends=true +package.showUses=false +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=VmSuspended +target1.showInterface=false +target1.type=ClassTarget +target1.width=120 +target1.x=440 +target1.y=110 +target2.height=50 +target2.name=VmState +target2.showInterface=false +target2.type=ClassTarget +target2.width=80 +target2.x=380 +target2.y=230 +target3.height=50 +target3.name=VmPoweredOff +target3.showInterface=false +target3.type=ClassTarget +target3.width=120 +target3.x=230 +target3.y=120 +target4.height=50 +target4.name=VmStates +target4.showInterface=false +target4.type=EnumTarget +target4.width=80 +target4.x=90 +target4.y=140 +target5.height=50 +target5.name=VirtualMachineState +target5.showInterface=false +target5.type=InterfaceTarget +target5.width=150 +target5.x=440 +target5.y=350 +target6.height=50 +target6.name=VirtualMachineManager +target6.showInterface=false +target6.type=ClassTarget +target6.width=170 +target6.x=30 +target6.y=240 +target7.height=50 +target7.name=VmPoweredOn +target7.showInterface=false +target7.type=ClassTarget +target7.width=120 +target7.x=230 +target7.y=340 diff --git a/demos/patterns/strategy/BubbleSort.java b/demos/patterns/strategy/BubbleSort.java new file mode 100644 index 0000000..b3eca4f --- /dev/null +++ b/demos/patterns/strategy/BubbleSort.java @@ -0,0 +1,58 @@ +package strategy; + +/* + Source: http://www.cs.ubc.ca/~harrison/Java/BubbleSort2Algorithm.java.html + */ + + +/* + * @(#)BubbleSortAlgorithm.java 1.6 95/01/31 James Gosling + * + * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved. + * + * Permission to use, copy, modify, and distribute this software + * and its documentation for NON-COMMERCIAL purposes and without + * fee is hereby granted provided that this copyright notice + * appears in all copies. Please refer to the file "copyright.html" + * for further important copyright and licensing information. + * + * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF + * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED + * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. + */ + +/** + * A bubble sort demonstration algorithm + * SortAlgorithm.java, Thu Oct 27 10:32:35 1994 + * + * @author James Gosling + * @version 1.6, 31 Jan 1995 + * + * Modified 23 Jun 1995 by Jason Harrison@cs.ubc.ca: + * Algorithm completes early when no items have been swapped in the + * last pass. + */ + +public class BubbleSort implements SortingStrategy { + + public void sort(int a[]) throws Exception { + for (int i = a.length; --i>=0; ) { + boolean flipped = false; + for (int j = 0; j a[j+1]) { + int T = a[j]; + a[j] = a[j+1]; + a[j+1] = T; + flipped = true; + } + } + if (!flipped) { + return; + } + } + } +} + diff --git a/demos/patterns/strategy/DataSet.java b/demos/patterns/strategy/DataSet.java new file mode 100644 index 0000000..72e8670 --- /dev/null +++ b/demos/patterns/strategy/DataSet.java @@ -0,0 +1,57 @@ +package strategy; + +import java.util.ArrayList; + +public class DataSet { + + private ArrayList data = new ArrayList() ; + private SortingStrategy strategy; + private int[] sortedList = new int[12] ; + + public DataSet() + { + strategy = new BubbleSort() ; + data.clear(); + data.add( 198 ) ; + data.add( 56 ) ; + data.add( 12 ) ; + data.add( 34 ) ; + data.add( 62 ) ; + data.add( 99 ) ; + data.add( 145 ) ; + data.add( 87 ) ; + data.add( 26 ) ; + data.add( 37 ) ; + data.add( 13 ) ; + data.add( 16 ) ; + for ( int i = 0; i < data.size(); i++ ) + sortedList[i] = data.get(i) ; + } + + public void doSort() { + try { + strategy.sort( sortedList ); + System.out.println( "List sorted with " + strategy.toString() ); + } catch ( Exception e ) + { + System.out.println( e.toString() ); + } + } + + public void display() { + for ( int i = 0; i < 12; i++ ) + System.out.println( sortedList[i] ); + } + + public void resetData() { + for ( int i = 0; i < data.size(); i++ ) + sortedList[i] = data.get(i) ; + System.out.println( "Data Reset Done!"); + } + + public void changeStrategy(SortingStrategy s) { + strategy = s ; + } + +} + diff --git a/demos/patterns/strategy/MergeSort.java b/demos/patterns/strategy/MergeSort.java new file mode 100644 index 0000000..2b6e733 --- /dev/null +++ b/demos/patterns/strategy/MergeSort.java @@ -0,0 +1,82 @@ +package strategy; + +/* + Source: http://www.cs.ubc.ca/~harrison/Java/MergeSortAlgorithm.java.html + */ + + +/* +* @(#)MergeSortAlgorithm.java 1.0 95/06/23 Jason Harrison +* +* Copyright (c) 1995 University of British Columbia +* +* Permission to use, copy, modify, and distribute this software +* and its documentation for NON-COMMERCIAL purposes and without +* fee is hereby granted provided that this copyright notice +* appears in all copies. Please refer to the file "copyright.html" +* for further important copyright and licensing information. +* +* UBC MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF +* THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. UBC SHALL NOT BE LIABLE FOR +* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR +* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. +*/ + +/** + * A merge sort demonstration algorithm + * SortAlgorithm.java, Thu Oct 27 10:32:35 1994 + * + * @author Jason Harrison@cs.ubc.ca + * @version 1.1, 12 Jan 1998 + */ +public class MergeSort implements SortingStrategy { + + private void sort(int a[], int lo0, int hi0) throws Exception { + int lo = lo0; + int hi = hi0; + + if (lo >= hi) { + return; + } + int mid = (lo + hi) / 2; + + /* + * Partition the list into two lists and sort them recursively + */ + sort(a, lo, mid); + sort(a, mid + 1, hi); + + /* + * Merge the two sorted lists + */ + int end_lo = mid; + int start_hi = mid + 1; + while ((lo <= end_lo) && (start_hi <= hi)) { + if (a[lo] < a[start_hi]) { + lo++; + } else { + /* + * a[lo] >= a[start_hi] + * The next element comes from the second list, + * move the a[start_hi] element into the next + * position and shuffle all the other elements up. + */ + int T = a[start_hi]; + for (int k = start_hi - 1; k >= lo; k--) { + a[k+1] = a[k]; + } + a[lo] = T; + lo++; + end_lo++; + start_hi++; + } + } + } + + public void sort(int a[]) throws Exception { + sort(a, 0, a.length-1); + } +} + diff --git a/demos/patterns/strategy/QuickSort.java b/demos/patterns/strategy/QuickSort.java new file mode 100644 index 0000000..d4980ba --- /dev/null +++ b/demos/patterns/strategy/QuickSort.java @@ -0,0 +1,137 @@ +package strategy; + +/* + Source: http://www.cs.ubc.ca/~harrison/Java/QSortAlgorithm.java.html + */ + + +/* + * @(#)QSortAlgorithm.java 1.6f 95/01/31 James Gosling + * + * Copyright (c) 1994-1995 Sun Microsystems, Inc. All Rights Reserved. + * + * Permission to use, copy, modify, and distribute this software + * and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and + * without fee is hereby granted. + * Please refer to the file http://java.sun.com/copy_trademarks.html + * for further important copyright and trademark information and to + * http://java.sun.com/licensing.html for further important licensing + * information for the Java (tm) Technology. + * + * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF + * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED + * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. + * + * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE + * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE + * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT + * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE + * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE + * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE + * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). SUN + * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR + * HIGH RISK ACTIVITIES. + */ + +/** + * A quick sort demonstration algorithm + * SortAlgorithm.java, Thu Oct 27 10:32:35 1994 + * + * @author James Gosling + * @version 1.6f, 31 Jan 1995 + */ +/** + * 19 Feb 1996: Fixed to avoid infinite loop discoved by Paul Haeberli. + * Misbehaviour expressed when the pivot element was not unique. + * -Jason Harrison + * + * 21 Jun 1996: Modified code based on comments from Paul Haeberli, and + * Peter Schweizer (Peter.Schweizer@mni.fh-giessen.de). + * Used Daeron Meyer's (daeron@geom.umn.edu) code for the + * new pivoting code. - Jason Harrison + * + * 09 Jan 1998: Another set of bug fixes by Thomas Everth (everth@wave.co.nz) + * and John Brzustowski (jbrzusto@gpu.srv.ualberta.ca). + */ + +public class QuickSort implements SortingStrategy { + + private void sort(int a[], int lo0, int hi0) throws Exception { + int lo = lo0; + int hi = hi0; + if (lo >= hi) { + return; + } + else if( lo == hi - 1 ) { + /* + * sort a two element list by swapping if necessary + */ + if (a[lo] > a[hi]) { + int T = a[lo]; + a[lo] = a[hi]; + a[hi] = T; + } + return; + } + + + /* + * Pick a pivot and move it out of the way + */ + int pivot = a[(lo + hi) / 2]; + a[(lo + hi) / 2] = a[hi]; + a[hi] = pivot; + + while( lo < hi ) { + /* + * Search forward from a[lo] until an element is found that + * is greater than the pivot or lo >= hi + */ + while (a[lo] <= pivot && lo < hi) { + lo++; + } + + /* + * Search backward from a[hi] until element is found that + * is less than the pivot, or lo >= hi + */ + while (pivot <= a[hi] && lo < hi ) { + hi--; + } + + /* + * Swap elements a[lo] and a[hi] + */ + if( lo < hi ) { + int T = a[lo]; + a[lo] = a[hi]; + a[hi] = T; + } + + } + + /* + * Put the median in the "center" of the list + */ + a[hi0] = a[hi]; + a[hi] = pivot; + + /* + * Recursive calls, elements a[lo0] to a[lo-1] are less than or + * equal to pivot, elements a[hi+1] to a[hi0] are greater than + * pivot. + */ + sort(a, lo0, lo-1); + sort(a, hi+1, hi0); + } + + public void sort(int a[]) throws Exception { + sort(a, 0, a.length-1); + } +} + + + diff --git a/demos/patterns/strategy/SortingStrategy.java b/demos/patterns/strategy/SortingStrategy.java new file mode 100644 index 0000000..ab6e736 --- /dev/null +++ b/demos/patterns/strategy/SortingStrategy.java @@ -0,0 +1,15 @@ +package strategy; + +public interface SortingStrategy { + + void sort(int[] data) throws Exception ; + +} + + +/* + +http://en.wikipedia.org/wiki/Sorting_algorithm +http://www.cs.ubc.ca/~harrison/Java/sorting-demo.html + + */ diff --git a/demos/patterns/strategy/Tester.java b/demos/patterns/strategy/Tester.java new file mode 100644 index 0000000..94b80b1 --- /dev/null +++ b/demos/patterns/strategy/Tester.java @@ -0,0 +1,24 @@ +package strategy; + +public class Tester { + + public static void runTest() + { + DataSet dataset = new DataSet() ; // defaults to BubbleSort + dataset.display(); + dataset.doSort(); + dataset.display(); + dataset.resetData(); + dataset.display(); + dataset.changeStrategy( new MergeSort() ); + dataset.doSort(); + dataset.display(); + dataset.resetData(); + dataset.display(); + dataset.changeStrategy( new QuickSort() ); + dataset.doSort(); + dataset.display(); + } + +} + diff --git a/demos/patterns/strategy/package.bluej b/demos/patterns/strategy/package.bluej new file mode 100644 index 0000000..3492bf0 --- /dev/null +++ b/demos/patterns/strategy/package.bluej @@ -0,0 +1,77 @@ +#BlueJ package file +dependency1.from=Tester +dependency1.to=DataSet +dependency1.type=UsesDependency +dependency2.from=Tester +dependency2.to=MergeSort +dependency2.type=UsesDependency +dependency3.from=Tester +dependency3.to=QuickSort +dependency3.type=UsesDependency +dependency4.from=DataSet +dependency4.to=SortingStrategy +dependency4.type=UsesDependency +dependency5.from=DataSet +dependency5.to=BubbleSort +dependency5.type=UsesDependency +objectbench.height=109 +objectbench.width=776 +package.divider.horizontal=0.6 +package.divider.vertical=0.7859778597785978 +package.editor.height=419 +package.editor.width=674 +package.editor.x=114 +package.editor.y=69 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=5 +package.numTargets=6 +package.showExtends=true +package.showUses=false +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=QuickSort +target1.showInterface=false +target1.type=ClassTarget +target1.width=90 +target1.x=310 +target1.y=230 +target2.height=50 +target2.name=SortingStrategy +target2.showInterface=false +target2.type=InterfaceTarget +target2.width=120 +target2.x=400 +target2.y=120 +target3.height=50 +target3.name=Tester +target3.showInterface=false +target3.type=ClassTarget +target3.width=80 +target3.x=20 +target3.y=130 +target4.height=50 +target4.name=DataSet +target4.showInterface=false +target4.type=ClassTarget +target4.width=80 +target4.x=140 +target4.y=130 +target5.height=50 +target5.name=BubbleSort +target5.showInterface=false +target5.type=ClassTarget +target5.width=90 +target5.x=540 +target5.y=230 +target6.height=50 +target6.name=MergeSort +target6.showInterface=false +target6.type=ClassTarget +target6.width=90 +target6.x=430 +target6.y=230