diff --git a/README.md b/README.md index 9e0034c..39db381 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,32 @@ -# 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 Command Design Pattern +Command encapsulate all information needed to perform an action. It allows the requester of a particular action to be decoupled from the object that performs the action. + +## Diagram +![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/chain-of-responsibility/diagrams/template-method-Pattern-class-diagram.jpeg "Diagram") + +![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/chain-of-responsibility/diagrams/Template-method-Design-Pattern-generic.jpeg "Diagram") + +![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/chain-of-responsibility/diagrams/template-method-sequence.png "Diagram") + +### When to use Command Design Pattern +The invoker should be decoupled from the object handling the invocation. + +### 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/Template-method-Design-Pattern-generic.jpeg b/diagrams/Template-method-Design-Pattern-generic.jpeg new file mode 100644 index 0000000..ff8839c Binary files /dev/null and b/diagrams/Template-method-Design-Pattern-generic.jpeg differ diff --git a/diagrams/template-method-Pattern-class-diagram.jpeg b/diagrams/template-method-Pattern-class-diagram.jpeg new file mode 100644 index 0000000..c890e57 Binary files /dev/null and b/diagrams/template-method-Pattern-class-diagram.jpeg differ diff --git a/diagrams/template-method-sequence.png b/diagrams/template-method-sequence.png new file mode 100644 index 0000000..ecbbaef Binary files /dev/null and b/diagrams/template-method-sequence.png differ diff --git a/pattern/src/com/premaseem/ATMmoneyDispenser/Client.java b/pattern/src/com/premaseem/ATMmoneyDispenser/Client.java new file mode 100644 index 0000000..ad7da2d --- /dev/null +++ b/pattern/src/com/premaseem/ATMmoneyDispenser/Client.java @@ -0,0 +1,52 @@ +package com.premaseem.ATMmoneyDispenser; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ + +import java.util.Scanner; + +public class Client { + + public static void main(String[] args) { + + System.out.println("Welcome to ATM Money dispenser program designed using Chain of Responsibility"); + Scanner scan = new Scanner(System.in); + + MoneyChainHandler hundredDollarHandler_100 = new HundrenDollarHandler_100(100); + MoneyChainHandler fiftyDollarHandler_50 = new FiftyDollarHandler_50(50); + MoneyChainHandler tenDollarHandler_10 = new TenDollarHandler_10(10); + MoneyChainHandler fiveDollarHandler_5 = new FiveDollarHandler_5(5); + MoneyChainHandler twoDollarHandler_2 = new TwoDollarHandler_2(2); + MoneyChainHandler oneDollarHandler_1 = new OneDollarHandler_1(1); + + // Setting up the change + hundredDollarHandler_100.setNextHandler(fiftyDollarHandler_50); + fiftyDollarHandler_50.setNextHandler(tenDollarHandler_10); + tenDollarHandler_10.setNextHandler(fiveDollarHandler_5); + fiveDollarHandler_5.setNextHandler(twoDollarHandler_2); + twoDollarHandler_2.setNextHandler(oneDollarHandler_1); + + String repeatRunFlag = "y"; + while (!repeatRunFlag.equalsIgnoreCase("no")) { + System.out.println("Please enter amount you want to withdraw eg 3450 "); + int choice = scan.nextInt(); + hundredDollarHandler_100.handler(choice); + + System.out.println("============================="); + + System.out.println("Press No to Exit and any other character to repeat .... "); + try { + repeatRunFlag = scan.next(); + } catch (Exception e) { + repeatRunFlag = "n"; + } + } + + System.out.println("\n $$$$$$$$$$$$$$$$$$$$ Thanks by Prem Aseem $$$$$$$$$$$$$$$$$$$$$$ \n "); + System.out.println("\n $$$$$$$$$$$$$$$$$$$$$ www.premaseem.me $$$$$$$$$$$$$$$$$$$$$$ \n "); + + } +} diff --git a/pattern/src/com/premaseem/ATMmoneyDispenser/MoneyChainHandler.java b/pattern/src/com/premaseem/ATMmoneyDispenser/MoneyChainHandler.java new file mode 100644 index 0000000..39dba97 --- /dev/null +++ b/pattern/src/com/premaseem/ATMmoneyDispenser/MoneyChainHandler.java @@ -0,0 +1,66 @@ +package com.premaseem.ATMmoneyDispenser; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ + +public abstract class MoneyChainHandler { + MoneyChainHandler nextHandler = null; + Integer noteDenomination = 0; + + public MoneyChainHandler setNextHandler (MoneyChainHandler nextHandler) { + this.nextHandler = nextHandler; + return this.nextHandler; + } + + public void handler (int dollarBill) { + int notes = dollarBill / noteDenomination; + int remainingAmount = dollarBill % noteDenomination; + + if (notes > 0) { + System.out.printf("dispatched %d X %d = %d handled by %s \n", noteDenomination, notes, (noteDenomination * notes), this.getClass().getSimpleName()); + } + if (nextHandler != null && remainingAmount > 0) { + nextHandler.handler(remainingAmount); + } + } + +} + +class HundrenDollarHandler_100 extends MoneyChainHandler { + public HundrenDollarHandler_100 (Integer noteDenomination) { + this.noteDenomination = noteDenomination; + } +} + +class FiftyDollarHandler_50 extends MoneyChainHandler { + public FiftyDollarHandler_50 (Integer noteDenomination) { + this.noteDenomination = noteDenomination; + } +} + +class TenDollarHandler_10 extends MoneyChainHandler { + public TenDollarHandler_10 (Integer noteDenomination) { + this.noteDenomination = noteDenomination; + } +} + +class FiveDollarHandler_5 extends MoneyChainHandler { + public FiveDollarHandler_5 (Integer noteDenomination) { + this.noteDenomination = noteDenomination; + } +} + +class TwoDollarHandler_2 extends MoneyChainHandler { + public TwoDollarHandler_2 (Integer noteDenomination) { + this.noteDenomination = noteDenomination; + } +} + +class OneDollarHandler_1 extends MoneyChainHandler { + public OneDollarHandler_1 (Integer noteDenomination) { + this.noteDenomination = noteDenomination; + } +} diff --git a/pattern/src/com/premaseem/Client.java b/pattern/src/com/premaseem/Client.java deleted file mode 100644 index 15f05df..0000000 --- a/pattern/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.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/chainOfResponsibility/loggerProgram/ClientFileForLoggerProgram.java b/patternBonus/src/com/premaseem/chainOfResponsibility/loggerProgram/ClientFileForLoggerProgram.java new file mode 100644 index 0000000..66e485f --- /dev/null +++ b/patternBonus/src/com/premaseem/chainOfResponsibility/loggerProgram/ClientFileForLoggerProgram.java @@ -0,0 +1,62 @@ +package com.premaseem.chainOfResponsibility.loggerProgram; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class ClientFileForLoggerProgram { + + public static void main(String[] args) { + + System.out.println("Welcome to Logger program designed using Chain of Responsibility "); + Scanner scan = new Scanner(System.in); + LogHandler logHandler; + LogHandler allLogLevelHandler = new AllLogLevelHandler(); + LogHandler debugLogHandler = new DebugLogHandler(); + LogHandler errorLogHandler = new ErrorLogHandler(); + LogHandler fatalLogHandler = new FatalLogHandler(); + LogHandler criticalLogHandler = new CriticalLogHandler(); + + // Setting up the chain + allLogLevelHandler.setNextHandler(debugLogHandler); + debugLogHandler.setNextHandler(errorLogHandler); + errorLogHandler.setNextHandler(fatalLogHandler); + fatalLogHandler.setNextHandler(criticalLogHandler); + + // Log level priority, high rank covers all below handlers + List logHandlers = new ArrayList(10); + logHandlers.add(0,allLogLevelHandler); + logHandlers.add(1,debugLogHandler); + logHandlers.add(2,errorLogHandler); + logHandlers.add(3,fatalLogHandler); + logHandlers.add(4,criticalLogHandler); + + String repeatRunFlag = "y"; + while (!repeatRunFlag.equalsIgnoreCase("no")) { + System.out.println("Please enter message to be logged "); + String message = scan.next(); + System.out.println("Please choose the level from 1 to 5 for logging "); + System.out.println("INFO(5), DEBUG(4), ERROR(3), FATAL(2), CRITICAL(1)"); + try{ + int choice = scan.nextInt(); + logHandler = logHandlers.get(choice); + }catch (Exception e){ + logHandler = logHandlers.get(0); + } + + logHandler.handler(message); + + System.out.println("============================="); + + System.out.println("Press No to Exit and any other character to repeat .... "); + try { + repeatRunFlag = scan.next(); + } catch (Exception e) { + repeatRunFlag = "n"; + } + } + + System.out.println("\n $$$$$$$$$$$$$$$$$$$$ Thanks by Prem Aseem $$$$$$$$$$$$$$$$$$$$$$ \n "); + System.out.println("\n $$$$$$$$$$$$$$$$$$$$$ www.premaseem.me $$$$$$$$$$$$$$$$$$$$$$ \n "); + } +} diff --git a/patternBonus/src/com/premaseem/chainOfResponsibility/loggerProgram/LogHandler.java b/patternBonus/src/com/premaseem/chainOfResponsibility/loggerProgram/LogHandler.java new file mode 100644 index 0000000..ef66613 --- /dev/null +++ b/patternBonus/src/com/premaseem/chainOfResponsibility/loggerProgram/LogHandler.java @@ -0,0 +1,51 @@ +package com.premaseem.chainOfResponsibility.loggerProgram; + +public abstract class LogHandler { + + + public enum LOG_LEVEL { + INFO(5), + DEBUG(4), + ERROR(3), + FATAL(2), + CRITICAL(1); + + Integer priority =1; + LOG_LEVEL(int priorityLevel){ + priority = priorityLevel; + } + } + + LogHandler nextHandler = null; + + public void setNextHandler(LogHandler nextHandler) { + this.nextHandler = nextHandler; + } + + public void handler(String message) { + System.out.printf(" %s console is printing message = %S \n " , this.getClass().getSimpleName(), message ); + if(nextHandler !=null){ + nextHandler.handler(message); + } + } +} + +class AllLogLevelHandler extends LogHandler{ + +} + +class DebugLogHandler extends LogHandler{ + +} + +class ErrorLogHandler extends LogHandler{ + +} + +class FatalLogHandler extends LogHandler{ + +} + +class CriticalLogHandler extends LogHandler{ + +} diff --git a/patternBonus/src/com/premaseem/chainOfResponsibility/numberHandler/Client.java b/patternBonus/src/com/premaseem/chainOfResponsibility/numberHandler/Client.java new file mode 100644 index 0000000..a50588c --- /dev/null +++ b/patternBonus/src/com/premaseem/chainOfResponsibility/numberHandler/Client.java @@ -0,0 +1,46 @@ +package com.premaseem.chainOfResponsibility.numberHandler; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ + +import java.util.Scanner; + +public class Client { + + public static void main(String[] args) { + + System.out.println("Welcome to Number identifier program designed using Chain of Responsibility "); + Scanner scan = new Scanner(System.in); + + NumberChain positiveNumberHandler = new PositiveNumberHandler(); + NumberChain negativeNumberHandler = new NegativeNumberHandler(); + NumberChain neutralNumberHandler = new ZeroNumberHandler(); + + // Setting up the chain + positiveNumberHandler.setNextHandler(negativeNumberHandler); + negativeNumberHandler.setNextHandler(neutralNumberHandler); + + String repeatRunFlag = "y"; + while (!repeatRunFlag.equalsIgnoreCase("no")) { + System.out.println("Please enter any number 0, less then or greater then zero eg. -22 or 89 ? "); + int choice = scan.nextInt(); + positiveNumberHandler.handler(choice); + + System.out.println("============================="); + + System.out.println("Press No to Exit and any other character to repeat .... "); + try { + repeatRunFlag = scan.next(); + } catch (Exception e) { + repeatRunFlag = "n"; + } + } + + System.out.println("\n $$$$$$$$$$$$$$$$$$$$ Thanks by Prem Aseem $$$$$$$$$$$$$$$$$$$$$$ \n "); + System.out.println("\n $$$$$$$$$$$$$$$$$$$$$ www.premaseem.me $$$$$$$$$$$$$$$$$$$$$$ \n "); + + } +} diff --git a/patternBonus/src/com/premaseem/chainOfResponsibility/numberHandler/NumberChain.java b/patternBonus/src/com/premaseem/chainOfResponsibility/numberHandler/NumberChain.java new file mode 100644 index 0000000..d1bdbcf --- /dev/null +++ b/patternBonus/src/com/premaseem/chainOfResponsibility/numberHandler/NumberChain.java @@ -0,0 +1,53 @@ +package com.premaseem.chainOfResponsibility.numberHandler; + +public abstract class NumberChain { + + NumberChain nextHandler = null; + + public NumberChain setNextHandler(NumberChain nextHandler) { + this.nextHandler = nextHandler; + return this.nextHandler; + } + + public abstract void handler(int requestNumber); + +} + +class PositiveNumberHandler extends NumberChain { + + @Override + public void handler(int requestNumber) { + if (requestNumber > 0) { + System.out.println(this.getClass().getSimpleName() +" handled number " + requestNumber); + }else{ + if(nextHandler!=null) + nextHandler.handler(requestNumber); + } + } +} + +class NegativeNumberHandler extends NumberChain { + + @Override + public void handler(int requestNumber) { + if (requestNumber < 0) { + System.out.println(this.getClass().getSimpleName() +" handled number " + requestNumber); + }else{ + if(nextHandler!=null) + nextHandler.handler(requestNumber); + } + } +} + +class ZeroNumberHandler extends NumberChain { + + @Override + public void handler(int requestNumber) { + if (requestNumber == 0) { + System.out.println(this.getClass().getSimpleName() +" handled number " + requestNumber); + }else{ + if(nextHandler!=null) + nextHandler.handler(requestNumber); + } + } +}