diff --git a/README.md b/README.md index 9e0034c..7927989 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,35 @@ -# DesignPatternsJava9 -This repo consists Gang of Four Design patterns code on Java 9. Each branch in the repository has code of 1 design pattern. Switch repository to try out different design patterns. +# What is Strategy Design Pattern +Strategy pattern is a behavioral software design pattern that enables selecting an algorithm at runtime. The strategy pattern +* Defines a family of algorithms, +* Encapsulates each algorithm, and +* Makes the algorithms interchangeable within that family. + +## Diagram +![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/strategy-pattern/diagrams/Strategy-Design-Pattern-class-diagram.jpeg "Diagram") + +![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/strategy-pattern/diagrams/Strategy-Design-Pattern-generic.jpeg "Diagram") + +![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/strategy-pattern/diagrams/strategyPatternSequenceDiagram.png "Diagram") + +### When to use Strategy Design Pattern +Strategy pattern is useful when we have multiple algorithms for specific task and we want our application to be flexible to chose any of the algorithm at runtime for specific task. + +### Learn Design Patterns with Java by Aseem Jain +This repository contains working project code used in video Course by Packt Publication with title "Learn Design Patterns with Java " authored by "Aseem Jain". + +### Course link: +https://www.packtpub.com/application-development/learn-design-patterns-java-9-video + +### ![ http://in.linkedin.com/in/premaseem](https://github.com/premaseem/DesignPatternsJava9/blob/master/linkedin.png "http://in.linkedin.com/in/premaseem") Profile: http://in.linkedin.com/in/premaseem + +### Authors blog on design patterns: +https://premaseem.wordpress.com/category/computers/design-patterns/ + +### Software Design pattern community face book page: +https://www.facebook.com/DesignPatternGuru/ + +### Note: +* This code base will work on Java 9 and above versions. +* `diagrams` folders carry UML diagrams. +* `pattern` folder has code of primary example. +* `patternBonus` folder has code of secondary or bonus example. diff --git a/diagrams/Strategy-Design-Pattern-class-diagram.jpeg b/diagrams/Strategy-Design-Pattern-class-diagram.jpeg new file mode 100644 index 0000000..0fb53c5 Binary files /dev/null and b/diagrams/Strategy-Design-Pattern-class-diagram.jpeg differ diff --git a/diagrams/Strategy-Design-Pattern-generic.jpeg b/diagrams/Strategy-Design-Pattern-generic.jpeg new file mode 100644 index 0000000..d402b39 Binary files /dev/null and b/diagrams/Strategy-Design-Pattern-generic.jpeg differ diff --git a/diagrams/strategyPatternSequenceDiagram.png b/diagrams/strategyPatternSequenceDiagram.png new file mode 100644 index 0000000..25e69e2 Binary files /dev/null and b/diagrams/strategyPatternSequenceDiagram.png differ diff --git a/pattern/src/com/premaseem/Client.java b/pattern/src/com/premaseem/Client.java index 15f05df..2083802 100644 --- a/pattern/src/com/premaseem/Client.java +++ b/pattern/src/com/premaseem/Client.java @@ -1,13 +1,24 @@ package com.premaseem; +import java.util.Scanner; + /* @author: Aseem Jain @title: Design Patterns with Java 9 @link: https://premaseem.wordpress.com/category/computers/design-patterns/ -@copyright: 2018 Packt Publication */ public class Client { public static void main (String[] args) { - System.out.println("Singleton cook example "); + System.out.println("Strategy Design pattern - Mountaineering app "); + System.out.println("Lets decide the strategy to cross mountain crevasse "); + Scanner scanner = new Scanner(System.in); + System.out.println("Enter the distance of crevasse ..."); + int distance = scanner.nextInt(); + + Context context = new Context(); + CrevasseCrossingStrategy crossingStrategy = context.getCrevasseCrossingStrategy(distance); + System.out.println("Using Strategy : "+ crossingStrategy.getClass().getSimpleName()); + crossingStrategy.crossCrevasse(); + } } diff --git a/pattern/src/com/premaseem/Context.java b/pattern/src/com/premaseem/Context.java new file mode 100644 index 0000000..bd7bbdc --- /dev/null +++ b/pattern/src/com/premaseem/Context.java @@ -0,0 +1,20 @@ +package com.premaseem; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ +public class Context { + + CrevasseCrossingStrategy crevasseCrossingStrategy; + + public CrevasseCrossingStrategy getCrevasseCrossingStrategy (Integer distance) { + if (distance < 3){ + crevasseCrossingStrategy = new JumpCrossStrategy(); + } else { + crevasseCrossingStrategy = new RopeCrossStrategy(); + } + return crevasseCrossingStrategy; + } +} diff --git a/pattern/src/com/premaseem/CrevasseCrossingStrategy.java b/pattern/src/com/premaseem/CrevasseCrossingStrategy.java new file mode 100644 index 0000000..449de4c --- /dev/null +++ b/pattern/src/com/premaseem/CrevasseCrossingStrategy.java @@ -0,0 +1,37 @@ +package com.premaseem; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ +interface CrevasseCrossingStrategy { + // Algorithm is collection of steps + void crossCrevasse(); +} + +class JumpCrossStrategy implements CrevasseCrossingStrategy { + + // Different algorithm or steps are defined in each sub class + @Override + public void crossCrevasse () { + System.out.println("Move 10 steps back"); + System.out.println("Start running as fast as possible"); + System.out.println("Jump over the Crevasse"); + System.out.println("Stop and Anchor your self"); + } +} + +class RopeCrossStrategy implements CrevasseCrossingStrategy { + + // Different algorithm or steps are defined in each sub class + @Override + public void crossCrevasse () { + System.out.println("Use Kernmantle rope"); + System.out.println("Tie rope with Anchor and through it on other side"); + System.out.println("Fix carabiner and fix it in rope"); + System.out.println("Cross using rope and untie yourself"); + } +} + + diff --git a/patternBonus/src/com/premaseem/Client.java b/patternBonus/src/com/premaseem/Client.java deleted file mode 100644 index 15f05df..0000000 --- a/patternBonus/src/com/premaseem/Client.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.premaseem; - -/* -@author: Aseem Jain -@title: Design Patterns with Java 9 -@link: https://premaseem.wordpress.com/category/computers/design-patterns/ -@copyright: 2018 Packt Publication -*/ -public class Client { - public static void main (String[] args) { - System.out.println("Singleton cook example "); - } -} diff --git a/patternBonus/src/com/premaseem/client/ClientMain.java b/patternBonus/src/com/premaseem/client/ClientMain.java new file mode 100644 index 0000000..efb27a8 --- /dev/null +++ b/patternBonus/src/com/premaseem/client/ClientMain.java @@ -0,0 +1,62 @@ +package com.premaseem.client; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ + +import java.util.Scanner; + +import com.premaseem.strategy.AirthematicOperationStrategy; +import com.premaseem.strategy.impl.AdditionStrategy; +import com.premaseem.strategy.impl.MultiplicationStragegy; +import com.premaseem.strategy.impl.SubstractionStrategy; + +public class ClientMain { + + public static void main (String[] args) { + System.out.println("This is Calculator application designed using Strategy Pattern"); + System.out.println("Client has several Strategy which can be consumed at run time "); + System.out.println("Please input 2 number for Strategic mathematical operation... "); + Scanner scan = new Scanner(System.in); + System.out.println("Please enter first number "); + Integer num1 = scan.nextInt(); + System.out.println("Please enter second number"); + Integer num2 = scan.nextInt(); + System.out.println("ADD"); + System.out.println("SUB"); + System.out.println("MUL"); + + // Initially Strategy is null, it would be assigned at run time + AirthematicOperationStrategy strategy = null; + System.out.println("Please enter OPERATION CODE, on the run time strategy would be picked based on your choice of operation"); + String operationCode = scan.next(); + + // Family of different algorithm is getting initialised here + if (operationCode.contains("ADD")) { + strategy = new AdditionStrategy(); + } + + if (operationCode.contains("SUB")) { + strategy = new SubstractionStrategy(); + } + + if (operationCode.contains("MUL")) { + strategy = new MultiplicationStragegy(); + } + + + System.out.printf("You picked strategy as %s", operationCode); + System.out.println(); + if (strategy != null) { + // Operation remains same but implementation algo changes dynamically + System.out.printf("Final result is %d", strategy.performOperation(num1, num2)); + } else { + System.out.println("Invalid operation picked :-( "); + } + System.out.println(); + System.out.println(" Thanks by Prem Aseem "); + + } +} diff --git a/patternBonus/src/com/premaseem/strategy/AirthematicOperationStrategy.java b/patternBonus/src/com/premaseem/strategy/AirthematicOperationStrategy.java new file mode 100644 index 0000000..9577421 --- /dev/null +++ b/patternBonus/src/com/premaseem/strategy/AirthematicOperationStrategy.java @@ -0,0 +1,13 @@ +package com.premaseem.strategy; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ + +public interface AirthematicOperationStrategy { + + Integer performOperation (Integer num1, Integer num2); + +} diff --git a/patternBonus/src/com/premaseem/strategy/impl/AdditionStrategy.java b/patternBonus/src/com/premaseem/strategy/impl/AdditionStrategy.java new file mode 100644 index 0000000..7d1250d --- /dev/null +++ b/patternBonus/src/com/premaseem/strategy/impl/AdditionStrategy.java @@ -0,0 +1,18 @@ +package com.premaseem.strategy.impl; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ + +import com.premaseem.strategy.AirthematicOperationStrategy; + +public class AdditionStrategy implements AirthematicOperationStrategy { + + @Override + public Integer performOperation(Integer num1, Integer num2) { + return num1 + num2; + } + +} diff --git a/patternBonus/src/com/premaseem/strategy/impl/MultiplicationStragegy.java b/patternBonus/src/com/premaseem/strategy/impl/MultiplicationStragegy.java new file mode 100644 index 0000000..19373fa --- /dev/null +++ b/patternBonus/src/com/premaseem/strategy/impl/MultiplicationStragegy.java @@ -0,0 +1,18 @@ +package com.premaseem.strategy.impl; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ + +import com.premaseem.strategy.AirthematicOperationStrategy; + +public class MultiplicationStragegy implements AirthematicOperationStrategy { + + @Override + public Integer performOperation(Integer num1, Integer num2) { + return num1 * num2; + } + +} diff --git a/patternBonus/src/com/premaseem/strategy/impl/SubstractionStrategy.java b/patternBonus/src/com/premaseem/strategy/impl/SubstractionStrategy.java new file mode 100644 index 0000000..41117a8 --- /dev/null +++ b/patternBonus/src/com/premaseem/strategy/impl/SubstractionStrategy.java @@ -0,0 +1,18 @@ +package com.premaseem.strategy.impl; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ + +import com.premaseem.strategy.AirthematicOperationStrategy; + +public class SubstractionStrategy implements AirthematicOperationStrategy { + + @Override + public Integer performOperation(Integer num1, Integer num2) { + return num1 - num2; + } + +}