diff --git a/README.md b/README.md index 9e0034c..4f68938 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 Visitor Design Pattern +Visitor design pattern uses a visitor class which changes the executing algorithm of an element class. By this way, execution algorithm of element can vary as and when visitor varies. + +## Diagram +![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/visitor-pattern/diagrams/Visitor-Pattern-class-diagram%20.png "Diagram") + +![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/visitor-pattern/diagrams/visitorPattern-generic.jpeg "Diagram") + +![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/visitor-pattern/diagrams/VisitorSequenceDiagram.png "Diagram") + +### When to use Visitor Design Pattern +Visitor pattern is used when we have to perform an operation on a group of similar kind of Objects. With the help of visitor pattern, we can move the operational logic from the objects(Elements) to another class (Visitor class). + +### 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/Visitor-Pattern-class-diagram .png b/diagrams/Visitor-Pattern-class-diagram .png new file mode 100644 index 0000000..c2c9211 Binary files /dev/null and b/diagrams/Visitor-Pattern-class-diagram .png differ diff --git a/diagrams/VisitorSequenceDiagram.png b/diagrams/VisitorSequenceDiagram.png new file mode 100644 index 0000000..16e981f Binary files /dev/null and b/diagrams/VisitorSequenceDiagram.png differ diff --git a/diagrams/visiting faculty.JPG b/diagrams/visiting faculty.JPG new file mode 100644 index 0000000..b19dc5e Binary files /dev/null and b/diagrams/visiting faculty.JPG differ diff --git a/diagrams/visitorPattern-generic.jpeg b/diagrams/visitorPattern-generic.jpeg new file mode 100644 index 0000000..6fc4ae2 Binary files /dev/null and b/diagrams/visitorPattern-generic.jpeg differ 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/pattern/src/com/premaseem/ClientStudent.java b/pattern/src/com/premaseem/ClientStudent.java new file mode 100644 index 0000000..d6e8419 --- /dev/null +++ b/pattern/src/com/premaseem/ClientStudent.java @@ -0,0 +1,46 @@ +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/ +*/ +public class ClientStudent { + public static void main (String[] args) { + System.out.println(); + System.out.println("University Lecture application designed using Visitor design pattern \n"); + System.out.println("Subject available for lectures are:-"); + System.out.println("Maths"); + System.out.println("Computers"); + System.out.println("Aviation"); + System.out.println(); + System.out.println("Please pick subject ..."); + + Scanner scanner = new Scanner(System.in); + String subjectOption = scanner.next(); + if (subjectOption.equalsIgnoreCase("Maths")){ + System.out.println("Math can be taught by in house Faculty"); + Subject subject = new Maths(); + subject.teach(); + } + + if (subjectOption.equalsIgnoreCase("Computers")){ + System.out.println("Computers needs visiting Faculty, lets call Prof. Prem Aseem Jain :-)"); + Subject subject = new Computer(); + VisitingFaculty profAseem = new ProfAseem(); + subject.acceptVisitingFacultytoTeach(profAseem); + } + + if (subjectOption.equalsIgnoreCase("Aviation")){ + System.out.println("Aviation needs visiting Faculty, lets call Prof. Prem Aseem Jain :-)"); + Subject subject = new Aviation(); + VisitingFaculty profAseem = new ProfAseem(); + subject.acceptVisitingFacultytoTeach(profAseem); + } + + System.out.println("Class over - Go Home and have fun :-) "); + + } +} diff --git a/pattern/src/com/premaseem/Subject.java b/pattern/src/com/premaseem/Subject.java new file mode 100644 index 0000000..5b8c2b4 --- /dev/null +++ b/pattern/src/com/premaseem/Subject.java @@ -0,0 +1,39 @@ +package com.premaseem; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ +public abstract class Subject { + + abstract void acceptVisitingFacultytoTeach (VisitingFaculty visitingFaculty); + + void teach(){ + System.out.println("IN-HOUSE Faculty teaching "+ this.getClass().getSimpleName()+" subject"); + } +} + +class Aviation extends Subject{ + + @Override + void acceptVisitingFacultytoTeach (VisitingFaculty visitingFaculty) { + visitingFaculty.teach(this); + } +} + +class Computer extends Subject{ + + @Override + void acceptVisitingFacultytoTeach (VisitingFaculty visitingFaculty) { + visitingFaculty.teach(this); + } +} + +class Maths extends Subject{ + + @Override + void acceptVisitingFacultytoTeach (VisitingFaculty visitingFaculty) { + visitingFaculty.teach(this); + } +} diff --git a/pattern/src/com/premaseem/VisitingFaculty.java b/pattern/src/com/premaseem/VisitingFaculty.java new file mode 100644 index 0000000..ce35af6 --- /dev/null +++ b/pattern/src/com/premaseem/VisitingFaculty.java @@ -0,0 +1,49 @@ +package com.premaseem; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ + +public interface VisitingFaculty { + void teach (Aviation aviation); + void teach (Computer computer); + void teach (Maths maths); +} + +class ProfAseem implements VisitingFaculty{ + + @Override + public void teach (Aviation aviation) { + System.out.println("Visiting Faculty teaching Aviation subject"); + } + + @Override + public void teach (Computer computer) { + System.out.println("Visiting Faculty teaching Computer subject"); + } + + @Override + public void teach (Maths maths) { + System.out.println("Visiting Faculty teaching Maths subject"); + } +} + +class AnyOtherProfessor implements VisitingFaculty{ + + @Override + public void teach (Aviation aviation) { + System.out.println("Visiting Faculty teaching Aviation subject"); + } + + @Override + public void teach (Computer computer) { + System.out.println("Visiting Faculty teaching Computer subject"); + } + + @Override + public void teach (Maths maths) { + System.out.println("Visiting Faculty teaching Maths subject"); + } +} 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/ClientFile.java b/patternBonus/src/com/premaseem/ClientFile.java new file mode 100644 index 0000000..f616086 --- /dev/null +++ b/patternBonus/src/com/premaseem/ClientFile.java @@ -0,0 +1,60 @@ +package com.premaseem; + +import java.util.Scanner; + +public class ClientFile { + + public static void main(String[] args) { + + System.out.println("Welcome to Party host example which uses visitor pattern "); + Scanner scan = new Scanner(System.in); + Party party; + CookVisitorI visitorCook; + int repeatRunFlag = 1; + while (repeatRunFlag == 1) { + System.out.println("Which party do you want to host "); + System.out.println("press 1 for Loud party "); + System.out.println("press 2 for Silent party "); + int tvType = scan.nextInt(); + if (tvType == 1) { + party = new LoudParty(); + } else { + party = new CalmParty(); + } + + System.out.println("How would you want to manage cooking of food "); + System.out.println(" Press 1 for a visitor Veg Cook "); + System.out.println(" Press 2 for a visitor Non- Veg Cook "); + System.out.println(" Press 3 for in house cooking (no visitor) "); + + int type = scan.nextInt(); + try { + switch (type) { + case 1: + visitorCook = new VegCookVisitor(); + party.accept(visitorCook); + break; + case 2: + visitorCook = new NonVegCookVisitor(); + party.accept(visitorCook); + break; + case 3: + party.cookInHouse(); + break; + } + + + } catch (Exception e1) { + e1.printStackTrace(); + } + System.out.println("============================="); + System.out.println("Press 1 to Repeat .... "); + try { + repeatRunFlag = scan.nextInt(); + } catch (Exception e) { + repeatRunFlag = 0; + } + + } + } +} diff --git a/patternBonus/src/com/premaseem/CookVisitorI.java b/patternBonus/src/com/premaseem/CookVisitorI.java new file mode 100644 index 0000000..25264e0 --- /dev/null +++ b/patternBonus/src/com/premaseem/CookVisitorI.java @@ -0,0 +1,44 @@ +package com.premaseem; + +public interface CookVisitorI { + void cook (LoudParty loudParty); + void cook (CalmParty calmParty); +} + +class VegCookVisitor implements CookVisitorI{ + + @Override + public void cook(LoudParty loudParty) { + loudParty.meal = "Spicy Vegetables"; + loudParty.drink = "Fruit Beer"; + loudParty.music = "Loud music"; + loudParty.getPartyDetail(); + } + + @Override + public void cook(CalmParty calmParty) { + calmParty.meal = "Boiled Vegetables"; + calmParty.drink = "Fruit Juice"; + calmParty.music = "Meditation Music"; + calmParty.getPartyDetail(); + } +} + +class NonVegCookVisitor implements CookVisitorI{ + + @Override + public void cook(LoudParty loudParty) { + loudParty.meal = "Spicy chicken"; + loudParty.drink = "Beer"; + loudParty.music = "High Beat music"; + loudParty.getPartyDetail(); + } + + @Override + public void cook(CalmParty calmParty) { + calmParty.meal = "Non spicy chicken"; + calmParty.drink = "Fruit Beer"; + calmParty.music = "Meditation music"; + calmParty.getPartyDetail(); + } +} \ No newline at end of file diff --git a/patternBonus/src/com/premaseem/Party.java b/patternBonus/src/com/premaseem/Party.java new file mode 100644 index 0000000..698f8fa --- /dev/null +++ b/patternBonus/src/com/premaseem/Party.java @@ -0,0 +1,46 @@ +package com.premaseem; + +public abstract class Party { + + String music = " No Music"; + String meal = " empty"; + String drink = "plane water "; + CookVisitorI visitor = null; + + abstract void accept(CookVisitorI visitor); + + + String getPartyDetail() { + String detials = visitor!= null ?visitor.getClass().getSimpleName() : "in house cooking" + " organized " + this.getClass().getSimpleName() + " has Music : " + music + " with Drink :" + + drink + " & Meal : " + meal; + System.out.println(detials); + return detials; + } + + public void cookInHouse() { + meal = "Spicy Vegetables"; + drink = "in house drink"; + music = "DJ music"; + getPartyDetail(); + } + +} + +class LoudParty extends Party { + + @Override + void accept(CookVisitorI visitor) { + this.visitor = visitor; + visitor.cook(this); + } +} + +class CalmParty extends Party { + + @Override + void accept(CookVisitorI visitor) { + this.visitor = visitor; + visitor.cook(this); + } +} +