Skip to content

Strategy design pattern #13

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 35 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -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.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added diagrams/Strategy-Design-Pattern-generic.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added diagrams/strategyPatternSequenceDiagram.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 13 additions & 2 deletions pattern/src/com/premaseem/Client.java
Original file line number Diff line number Diff line change
@@ -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();

}
}
20 changes: 20 additions & 0 deletions pattern/src/com/premaseem/Context.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
37 changes: 37 additions & 0 deletions pattern/src/com/premaseem/CrevasseCrossingStrategy.java
Original file line number Diff line number Diff line change
@@ -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");
}
}


13 changes: 0 additions & 13 deletions patternBonus/src/com/premaseem/Client.java

This file was deleted.

62 changes: 62 additions & 0 deletions patternBonus/src/com/premaseem/client/ClientMain.java
Original file line number Diff line number Diff line change
@@ -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 ");

}
}
Original file line number Diff line number Diff line change
@@ -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);

}
18 changes: 18 additions & 0 deletions patternBonus/src/com/premaseem/strategy/impl/AdditionStrategy.java
Original file line number Diff line number Diff line change
@@ -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;
}

}
Original file line number Diff line number Diff line change
@@ -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;
}

}
Original file line number Diff line number Diff line change
@@ -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;
}

}