├── .gitignore ├── 01_scoreBoard_strategy ├── Diagram.jpg ├── figure.jpg └── src │ └── com │ └── kejeiri │ ├── Main.java │ ├── Model │ ├── Balloon.java │ ├── Clown.java │ └── SquareBalloon.java │ └── controller │ ├── ScoreBoard.java │ └── ScoreBoardBase.java ├── 02_Strategy_Payment └── Payment │ ├── Diagram.jpg │ └── src │ └── com │ └── kejeiri │ └── java │ └── course │ ├── Main.java │ ├── controller │ ├── CreditCardAlgorithm.java │ ├── Payment.java │ ├── PaypalAgorithm.java │ └── ShoppingCart.java │ └── model │ └── Product.java ├── 03_Observer_email └── Observer │ ├── Diagram.jpg │ ├── figure.jpg │ └── src │ └── com │ └── kejeiri │ └── java │ └── course │ ├── Main.java │ ├── interfaces │ ├── Observer.java │ └── Subject.java │ └── model │ ├── EmailTopic.java │ └── EmailTopicSubscriber.java ├── 04_observerBroadcast └── radioBroadcast │ ├── figure.jpg │ └── src │ └── com │ └── kejeiri │ └── java │ └── course │ ├── Main.java │ ├── interfaces │ ├── IObserver.java │ └── ITopic.java │ └── model │ ├── BreakingNews.java │ ├── CustomerSubscriber.java │ └── NewsBulletin.java ├── 05_icecreamdecoratorpattern └── decoratorpattern │ ├── Diagram1.jpg │ ├── Diagram2.jpg │ ├── Diagram3.jpg │ └── src │ └── com │ └── kejeiri │ └── java │ └── course │ ├── Main.java │ ├── imodel │ └── IceCream.java │ └── model │ ├── BasicIceCream.java │ ├── ChocolateIceCream.java │ ├── IceCreamDecorator.java │ ├── MintIceCream.java │ ├── PeanutIceCream.java │ └── VanillaIceCream.java ├── 06_HamburgerFactoryPattern └── HamburgerFactoryPattern │ ├── Diagram.jpg │ ├── Diagram2.jpg │ ├── Diagram3.jpg │ └── src │ └── com │ └── kejeiri │ ├── Core │ ├── HamburgerStore.java │ ├── JamaicanHambugerFactory.java │ └── SimpleHamburgerFactory.java │ ├── Main.java │ └── model │ ├── BunLessBurger.java │ ├── CheeseBurger.java │ ├── GreekBurger.java │ ├── Hamburger.java │ ├── MeatLover.java │ └── VeggieBurger.java ├── 07_HamburgerFactoryPattern_ENHANCED └── HamburgerFactoryPattern │ ├── Diagram1.jpg │ ├── Diagram2.jpg │ ├── figure.jpg │ └── src │ └── com │ └── kejeiri │ ├── Core │ ├── HamburgerStore.java │ ├── HamburgerTypes.java │ ├── JamHamburgerStore.java │ └── MozHamburgerStore.java │ ├── Main.java │ └── model │ ├── BunLessBurger.java │ ├── CheeseBurger.java │ ├── GreekBurger.java │ ├── Hamburger.java │ ├── JamBunLessBurger.java │ ├── JamCheeseBurger.java │ ├── JamGreekBurger.java │ ├── JamMeatLover.java │ ├── JamVeggieBurger.java │ ├── MeatLover.java │ ├── MozBunLessBurger.java │ ├── MozCheeseBurger.java │ ├── MozGreekBurger.java │ ├── MozMeatLover.java │ ├── MozVeggieBurger.java │ └── VeggieBurger.java ├── 08_Singleton_Lazily_Created └── SimpleDBConnector │ ├── figure1.jpg │ └── src │ └── com │ └── java │ └── course │ ├── DBConnector.java │ └── Main.java ├── 09_Singleton_Eagerly_Created └── SimpleDBConnector │ ├── figure1.jpg │ └── src │ └── com │ └── java │ └── course │ ├── DBConnector.java │ └── Main.java ├── 10_Singleton_Lazily_Created_Double-check-locking └── SimpleDBConnector │ ├── figure1.jpg │ └── src │ └── com │ └── java │ └── course │ ├── DBConnector.java │ └── Main.java ├── 11_CommandPattern └── CommandPattern │ ├── Diagram.jpg │ └── src │ └── com │ └── java │ └── course │ ├── Main.java │ ├── actions │ ├── KirbyDownCommand.java │ ├── KirbyLeftCommand.java │ ├── KirbyRightCommand.java │ ├── KirbyUpCommand.java │ ├── MarioDownCommand.java │ ├── MarioLeftCommand.java │ ├── MarioRightCommand.java │ └── MarioUpCommand.java │ ├── icommand │ └── ICommand.java │ └── model │ ├── GameBoy.java │ ├── KirbyCharacterReceiver.java │ └── MarioCharacterReceiver.java ├── 12_AdapterPattern └── AdapterPattern │ ├── diagram.jpg │ ├── figure.jpg │ └── src │ └── com │ └── java │ └── course │ ├── Main.java │ ├── iadapter │ └── ISocketAdapter.java │ └── model │ ├── Socket.java │ ├── SocketAdapterImplementation.java │ ├── SocketObjectAdapterImplmentation.java │ └── Volt.java ├── 13_FacadePattern └── FacadePattern │ ├── Diagram.jpg │ ├── README.md │ ├── figure.jpg │ └── src │ └── com │ └── java │ └── course │ ├── Main.java │ ├── facade │ └── ComputerFacade.java │ └── subsystem │ ├── CPU.java │ ├── HardDrive.java │ └── Memory.java ├── 14_TemplatePattern └── TemplatePattern │ ├── Diagram1.jpg │ ├── Diagram2.jpg │ ├── README.md │ └── src │ └── com │ └── java │ └── course │ ├── Game.java │ ├── Main.java │ └── model │ ├── EndlessRunnerGame.java │ └── FootBallGame.java ├── 15_IteratorPattern └── IteratorPattern │ ├── Diagram.jpg │ ├── README.md │ ├── figure.jpg │ ├── figure1.jpg │ └── src │ └── com │ └── java │ └── course │ ├── Catalog │ ├── DevStoreCatalog.java │ ├── GeekyStoreCatalog.java │ └── Seller.java │ ├── Main.java │ ├── iterator │ ├── DevStoreIterator.java │ ├── GeekyStoreIterator.java │ ├── ICatalog.java │ └── Iterator.java │ └── model │ └── Product.java ├── 16_StatePattern └── StatePattern │ ├── Diagram1.jpg │ ├── Diagram2.jpg │ ├── README.md │ ├── figure.jpg │ ├── figure2.jpg │ └── src │ └── com │ └── java │ └── course │ ├── Main.java │ └── model │ └── SodaMachine.java ├── 17_StatePatternSolution └── StatePatternSolution │ ├── Diagram1.jpg │ ├── Diagram2.jpg │ ├── README.md │ ├── figure.jpg │ ├── figure2.jpg │ └── src │ └── com │ └── java │ └── course │ ├── Main.java │ └── model │ ├── HasMoneyState.java │ ├── IState.java │ ├── NoMoneyState.java │ ├── SodaVendingMachine.java │ ├── SoldOutState.java │ └── SoldState.java ├── 18_ProxyPattern └── ProxyPattern │ ├── Diagram1.jpg │ ├── Diagram2.jpg │ ├── figure1.jpg │ ├── figure2.jpg │ ├── figure3.jpg │ └── src │ └── com │ └── java │ └── course │ ├── IBank.java │ ├── Main.java │ ├── ProxyBank.java │ └── RealBank.java ├── 19_MVCDesignPattern └── MVCDesignPattern │ ├── README.md │ ├── figure1.jpg │ ├── figure2.jpg │ ├── figure3.jpg │ └── src │ └── com │ └── kejeiri │ └── java │ └── course │ ├── Main.java │ ├── controller │ └── EmployeeController.java │ ├── model │ └── Employee.java │ └── view │ └── EmployeeDashboard.java ├── 20_BuilderDesignPattern └── BuilderDesignPattern │ └── src │ └── com │ └── kejeiri │ └── java │ └── course │ ├── Main.java │ └── User.java ├── 21_BuilderInterfaceDesignPattern └── BuilderInterfaceDesignPattern │ └── src │ └── com │ └── kejeiri │ └── java │ └── course │ ├── IPerson.java │ └── Main.java ├── 22_PrototypeDesignPattern └── PrototypeDesignPattern │ ├── README.md │ ├── figure1.jpg │ ├── figure2.jpg │ └── src │ └── com │ └── java │ └── course │ ├── Dolphin.java │ ├── IPrototype.java │ ├── Main.java │ ├── Person.java │ └── model │ ├── Animal.java │ └── IAnimal.java ├── 23_MediatorDesignPattern └── MediatorDesignPattern │ ├── Diagram.jpg │ ├── README.md │ ├── figure1.jpg │ ├── figure2.jpg │ ├── figure3.jpg │ └── src │ └── com │ └── java │ └── course │ ├── ATCMediator.java │ ├── ATCMediatorImpl.java │ ├── AirCraft.java │ ├── AirCraftImpl.java │ └── Main.java ├── 24_VisitorDesignPattern └── VisitorDesignPattern │ ├── Diagram.jpg │ ├── README.md │ ├── figure1.jpg │ └── src │ └── com │ └── kejeiri │ └── java │ └── course │ ├── Interfaces │ ├── Visitable.java │ └── Visitor.java │ ├── Main.java │ ├── business │ ├── DiscountVisitor.java │ └── TaxVisitor.java │ └── model │ ├── Jacket.java │ ├── Shirt.java │ └── TShirt.java ├── 25_MementoDesignPattern └── MementoDesignPattern │ ├── Diagram.jpg │ ├── README.md │ ├── figure1.jpg │ └── src │ └── com │ └── java │ └── course │ ├── CareTaker.java │ ├── Main.java │ ├── Memento.java │ └── Originator.java ├── 26_InterpreterDesignPattern └── InterpreterDesignPattern │ ├── Diagram.jpg │ ├── README.md │ ├── figure1.jpg │ └── src │ └── com │ └── java │ └── course │ ├── Expression.java │ ├── IntToBinaryExpression.java │ ├── IntToHexExpression.java │ ├── InterpreterClient.java │ └── InterpreterContext.java ├── 27_ChainOfResponsabilityDesignPattern └── ChainOfResponsabilityDesignPattern │ ├── Diagram.jpg │ ├── README.md │ ├── figure1.jpg │ └── src │ └── com │ └── java │ └── course │ ├── CEOPurchasePower.java │ ├── DirectorPurchasePower.java │ ├── Main.java │ ├── ManagerPurchasePower.java │ ├── PurchasePower.java │ └── PurchaseRequest.java ├── 28_BridgeDesignPattern └── BridgeDesignPattern │ ├── README.md │ ├── figure1.jpg │ ├── figure2.jpg │ └── src │ └── com │ └── java │ └── course │ ├── Assemble.java │ ├── Bike.java │ ├── Car.java │ ├── Main.java │ ├── Make.java │ ├── Vehicle.java │ └── Workshop.java ├── 29_FlyWeightDesignPattern └── FlyWeightDesignPattern │ ├── README.md │ ├── figure1.jpg │ └── src │ └── com │ └── java │ └── course │ ├── Circle.java │ ├── Main.java │ ├── Shape.java │ └── ShapeFactory.java ├── Design Patterns, Elements of Reusable Object-Oriented Software.pdf └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.jar 15 | *.war 16 | *.nar 17 | *.ear 18 | *.zip 19 | *.tar.gz 20 | *.rar 21 | 22 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 23 | hs_err_pid* 24 | 25 | ###################### 26 | # Project Specific 27 | ###################### 28 | /build/www/** 29 | /src/test/javascript/coverage/ 30 | /src/test/javascript/PhantomJS*/ 31 | 32 | ###################### 33 | # Node 34 | ###################### 35 | /node/ 36 | node_tmp/ 37 | node_modules/ 38 | npm-debug.log.* 39 | 40 | ###################### 41 | # SASS 42 | ###################### 43 | .sass-cache/ 44 | 45 | ###################### 46 | # Eclipse 47 | ###################### 48 | *.pydevproject 49 | .project 50 | .metadata 51 | tmp/ 52 | tmp/**/* 53 | *.tmp 54 | *.bak 55 | *.swp 56 | *~.nib 57 | local.properties 58 | .classpath 59 | .settings/ 60 | .loadpath 61 | .factorypath 62 | /src/main/resources/rebel.xml 63 | 64 | # External tool builders 65 | .externalToolBuilders/** 66 | 67 | # Locally stored "Eclipse launch configurations" 68 | *.launch 69 | 70 | # CDT-specific 71 | .cproject 72 | 73 | # PDT-specific 74 | .buildpath 75 | 76 | ###################### 77 | # Intellij 78 | ###################### 79 | .idea/ 80 | *.iml 81 | *.iws 82 | *.ipr 83 | *.ids 84 | *.orig 85 | 86 | ###################### 87 | # Visual Studio Code 88 | ###################### 89 | .vscode/ 90 | 91 | ###################### 92 | # Maven 93 | ###################### 94 | /log/ 95 | /target/ 96 | 97 | ###################### 98 | # Gradle 99 | ###################### 100 | .gradle/ 101 | /build/ 102 | 103 | ###################### 104 | # Package Files 105 | ###################### 106 | *.jar 107 | *.war 108 | *.ear 109 | *.db 110 | 111 | ###################### 112 | # Windows 113 | ###################### 114 | # Windows image file caches 115 | Thumbs.db 116 | 117 | # Folder config file 118 | Desktop.ini 119 | 120 | ###################### 121 | # Mac OSX 122 | ###################### 123 | .DS_Store 124 | .svn 125 | 126 | # Thumbnails 127 | ._* 128 | 129 | # Files that might appear on external disk 130 | .Spotlight-V100 131 | .Trashes 132 | 133 | ###################### 134 | # Directories 135 | ###################### 136 | /bin/ 137 | /deploy/ 138 | 139 | ###################### 140 | # Logs 141 | ###################### 142 | *.log 143 | 144 | ###################### 145 | # Others 146 | ###################### 147 | *.class 148 | *.*~ 149 | *~ 150 | .merge_file* 151 | 152 | ###################### 153 | # Gradle Wrapper 154 | ###################### 155 | !gradle/wrapper/gradle-wrapper.jar 156 | 157 | ###################### 158 | # Maven Wrapper 159 | ###################### 160 | !.mvn/wrapper/maven-wrapper.jar 161 | 162 | ###################### 163 | # ESLint 164 | ###################### 165 | .eslintcache 166 | 167 | *.iml 168 | .flattened-pom* 169 | target/ 170 | out 171 | .idea -------------------------------------------------------------------------------- /01_scoreBoard_strategy/Diagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/01_scoreBoard_strategy/Diagram.jpg -------------------------------------------------------------------------------- /01_scoreBoard_strategy/figure.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/01_scoreBoard_strategy/figure.jpg -------------------------------------------------------------------------------- /01_scoreBoard_strategy/src/com/kejeiri/Main.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri; 2 | 3 | import com.kejeiri.Model.Balloon; 4 | import com.kejeiri.Model.Clown; 5 | import com.kejeiri.Model.SquareBalloon; 6 | import com.kejeiri.controller.ScoreBoard; 7 | 8 | public class Main { 9 | 10 | public static void main(String[] args) { 11 | /* 12 | We chose composition over inheritance because : 13 | scoreBoard could evolve and required additiional implementations that aren't shared between 14 | Balloon, SquareBalloon & Clown classes 15 | */ 16 | ScoreBoard scoreBoard = new ScoreBoard(); 17 | System.out.print("Balloon taps score: "); 18 | scoreBoard.scoreBoardBase = new Balloon(); 19 | scoreBoard.show(10,78); 20 | 21 | 22 | System.out.print("Clown taps score: "); 23 | scoreBoard.scoreBoardBase = new Clown(); 24 | scoreBoard.show(10,78); 25 | 26 | 27 | System.out.print("SquareBalloon taps score: "); 28 | scoreBoard.scoreBoardBase = new SquareBalloon(); 29 | scoreBoard.show(10,78); 30 | 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /01_scoreBoard_strategy/src/com/kejeiri/Model/Balloon.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.Model; 2 | 3 | import com.kejeiri.controller.ScoreBoardBase; 4 | 5 | public class Balloon extends ScoreBoardBase { 6 | @Override 7 | public int calculateScore(int taps, int multiplier) { 8 | return (taps*multiplier)-20; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /01_scoreBoard_strategy/src/com/kejeiri/Model/Clown.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.Model; 2 | 3 | import com.kejeiri.controller.ScoreBoardBase; 4 | 5 | public class Clown extends ScoreBoardBase { 6 | @Override 7 | public int calculateScore(int taps, int multiplier) { 8 | return (taps*multiplier)-10; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /01_scoreBoard_strategy/src/com/kejeiri/Model/SquareBalloon.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.Model; 2 | 3 | import com.kejeiri.controller.ScoreBoardBase; 4 | 5 | public class SquareBalloon extends ScoreBoardBase { 6 | @Override 7 | public int calculateScore(int taps, int multiplier) { 8 | return (taps*multiplier)+40; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /01_scoreBoard_strategy/src/com/kejeiri/controller/ScoreBoard.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.controller; 2 | /* 3 | We chose composition over inheritance because : 4 | scoreBoard could evolve and required additiional implementations that aren't shared between 5 | Balloon, SquareBalloon & Clown classes 6 | */ 7 | public class ScoreBoard { 8 | //instance variable (composition instance of direct inheritance from this class 9 | public ScoreBoardBase scoreBoardBase; 10 | public void show(int taps, int mulitplier){ 11 | System.out.println(scoreBoardBase.calculateScore(taps, mulitplier)); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /01_scoreBoard_strategy/src/com/kejeiri/controller/ScoreBoardBase.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.controller; 2 | 3 | /* 4 | We could go also for an interface instead of an abstract class 5 | we should be implemented at Balloon, SquareBalloon & Clown classes 6 | ---------------------------- 7 | Interface VS Abstract class. 8 | ---------------------------- 9 | - Methods of a Java interface are implicitly abstract and cannot have implementations. 10 | - Java abstract class can have instance methods that implements a default behaviour. 11 | - Variables declared in a Java interface are by default final. An abstract class may contain non-final variables. 12 | - Members of a Java interface are public by default. A Java abstract class can have the usual flavours of class 13 | members like private, protected, etc. 14 | - A Java interface should be implemented using keyword “implements”; A Java abstract class should be extended using 15 | keyword “extends”. An interface can extend another Java interface only, an abstract class can extend another 16 | Java class and implement multiple Java interfaces.A Java class can implement multiple interfaces but it 17 | can extend only one abstract class. 18 | - abstract classes have constructors, even though you cannot instantiate an abstract class, the constructors is used by child classes. 19 | - Interfaces indicate "what" but not "how" because they define a contract (list of methods) while abstract class can also indicate 20 | "how" (implement a method). 21 | - Using Interface you can emulate multiple inheritance (a class can implement multiple Interfaces but only extend one class). 22 | - Using Interface you can have a base type for different families such as: 23 | Flyer f=new Plane();Flyer f2=new Bird(); Bird and Plane don't correspond to the same familiy but both can fly (are flyers). 24 | 25 | - Interfaces are rules (rules because you must give an implementation to them that you can't ignore or avoid, so that they are imposed 26 | like rules) which works as a common understanding document among various teams in software development. 27 | - Interfaces give the idea what is to be done but not how it will be done. So implementation completely depends 28 | on developer by following the given rules (means given signature of methods). 29 | - Abstract classes may contain abstract declarations, concrete implementations, or both. 30 | - Abstract declarations are like rules to be followed and concrete implementations are like guidelines 31 | (you can use it as it is or you can ignore it by overriding and giving your own implementation to it). 32 | - Moreover which methods with same signature may change the behaviour in different context are provided as 33 | interface declarations as rules to implement accordingly in different contexts. 34 | - Methods of a Java interface are implicitly abstract and cannot have implementations 35 | - An interface is a reference type, similar to a class, that can contain only constants, method signatures, 36 | default methods, static methods,and nested types Method bodies exist only for default methods and static methods. 37 | - Default methods enable you to add new functionality to the interfaces of your libraries and ensure binary 38 | compatibility with code written for older versions of those interfaces. 39 | - use Interface: 40 | To define a contract ( preferably stateless - I mean no variables ) 41 | To link unrelated classes with has a capabilities. 42 | To declare public constant variables (immutable state) 43 | 44 | - use Abstract class: 45 | Share code among several closely related classes. It establishes a relation. 46 | Share common state among related classes (state can be modified in concrete classes) 47 | - Unrelated classes can have capabilities through interface but related classes change the behaviour through extension of base classes. 48 | - Consider using abstract classes if : 49 | - You want to share code among several closely related classes. 50 | - You expect that classes that extend your abstract class have many common methods or fields, or require access modifiers other than public (such as protected and private). 51 | - You want to declare non-static or non-final fields. 52 | 53 | - Consider using interfaces if : 54 | - You expect that unrelated classes would implement your interface. For example,many unrelated objects can implement Serializable interface. 55 | - You want to specify the behaviour of a particular data type, but not concerned about who implements its behaviour. 56 | - You want to take advantage of multiple inheritance of type. 57 | 58 | - In simple terms, I would like to use : 59 | interface: To implement a contract by multiple unrelated objects 60 | abstract class: To implement the same or different behaviour among multiple related objects 61 | */ 62 | public abstract class ScoreBoardBase { 63 | public abstract int calculateScore(int taps, int multiplier); 64 | } 65 | -------------------------------------------------------------------------------- /02_Strategy_Payment/Payment/Diagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/02_Strategy_Payment/Payment/Diagram.jpg -------------------------------------------------------------------------------- /02_Strategy_Payment/Payment/src/com/kejeiri/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course; 2 | 3 | import com.kejeiri.java.course.controller.CreditCardAlgorithm; 4 | import com.kejeiri.java.course.controller.PaypalAgorithm; 5 | import com.kejeiri.java.course.controller.ShoppingCart; 6 | import com.kejeiri.java.course.model.Product; 7 | 8 | public class Main { 9 | 10 | public static void main(String[] args) { 11 | ShoppingCart cart = new ShoppingCart(); 12 | Product pants= new Product("234",25); 13 | Product shirt = new Product("987",15); 14 | cart.addProduct(pants); 15 | cart.addProduct(shirt); 16 | //payment decision 17 | cart.pay(new CreditCardAlgorithm("Nocard","1245454")); 18 | cart.pay(new PaypalAgorithm("mypaypal@paypal.com","paypalsucks")); 19 | 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /02_Strategy_Payment/Payment/src/com/kejeiri/java/course/controller/CreditCardAlgorithm.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.controller; 2 | 3 | public class CreditCardAlgorithm implements Payment{ 4 | private String name; 5 | private String cardNumber; 6 | 7 | public CreditCardAlgorithm(String name, String cardNumber) { 8 | this.name = name; 9 | this.cardNumber = cardNumber; 10 | } 11 | 12 | public String getName() { 13 | return name; 14 | } 15 | 16 | public void setName(String name) { 17 | this.name = name; 18 | } 19 | 20 | public String getCardNumber() { 21 | return cardNumber; 22 | } 23 | 24 | public void setCardNumber(String cardNumber) { 25 | this.cardNumber = cardNumber; 26 | } 27 | @Override 28 | public void pay(int amount) { 29 | System.out.println(amount+" paid with credit card!"); 30 | 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /02_Strategy_Payment/Payment/src/com/kejeiri/java/course/controller/Payment.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.controller; 2 | 3 | public interface Payment { 4 | public void pay(int amount); 5 | } 6 | -------------------------------------------------------------------------------- /02_Strategy_Payment/Payment/src/com/kejeiri/java/course/controller/PaypalAgorithm.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.controller; 2 | 3 | public class PaypalAgorithm implements Payment{ 4 | private String email; 5 | 6 | public PaypalAgorithm(String email, String password) { 7 | this.email = email; 8 | this.password = password; 9 | } 10 | 11 | private String password; 12 | @Override 13 | public void pay(int amount) { 14 | System.out.println(amount+" paid with paypal!"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /02_Strategy_Payment/Payment/src/com/kejeiri/java/course/controller/ShoppingCart.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.controller; 2 | 3 | import com.kejeiri.java.course.model.Product; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | public class ShoppingCart { 9 | List productsList; 10 | 11 | public ShoppingCart() { 12 | this.productsList = new ArrayList<>(); 13 | } 14 | public void addProduct(Product product){ 15 | productsList.add(product); 16 | } 17 | public void removeProduct(Product product){ 18 | productsList.remove(product); 19 | } 20 | public int calculateTotal(){ 21 | int sum=0; 22 | for (Product product: productsList) { 23 | sum+=product.getPrice(); 24 | } 25 | return sum; 26 | } 27 | public void pay(Payment payment){ 28 | int amount= calculateTotal(); 29 | payment.pay(amount); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /02_Strategy_Payment/Payment/src/com/kejeiri/java/course/model/Product.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.model; 2 | 3 | public class Product { 4 | private String upcCode; 5 | private int price; 6 | 7 | public String getUpcCode() { 8 | return upcCode; 9 | } 10 | 11 | public void setUpcCode(String upcCode) { 12 | this.upcCode = upcCode; 13 | } 14 | 15 | public int getPrice() { 16 | return price; 17 | } 18 | 19 | public Product() { 20 | } 21 | 22 | public Product(String upcCode, int price) { 23 | this.upcCode = upcCode; 24 | this.price = price; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /03_Observer_email/Observer/Diagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/03_Observer_email/Observer/Diagram.jpg -------------------------------------------------------------------------------- /03_Observer_email/Observer/figure.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/03_Observer_email/Observer/figure.jpg -------------------------------------------------------------------------------- /03_Observer_email/Observer/src/com/kejeiri/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course; 2 | 3 | import com.kejeiri.java.course.interfaces.Observer; 4 | import com.kejeiri.java.course.model.EmailTopic; 5 | import com.kejeiri.java.course.model.EmailTopicSubscriber; 6 | 7 | public class Main { 8 | 9 | public static void main(String[] args) { 10 | EmailTopic topic = new EmailTopic(); 11 | 12 | //Create observer 13 | Observer firstObserver = new EmailTopicSubscriber("First observer"); 14 | Observer secondObserver = new EmailTopicSubscriber("Second observer"); 15 | Observer thirdObserver = new EmailTopicSubscriber("Third observer"); 16 | topic.register(firstObserver); 17 | topic.register(secondObserver); 18 | topic.register(thirdObserver); 19 | 20 | //attaching observer to subject 21 | //we could include this inside the register to 22 | //avoid an update in two places 23 | firstObserver.setSubject(topic); 24 | secondObserver.setSubject(topic); 25 | thirdObserver.setSubject(topic); 26 | 27 | //check for update 28 | firstObserver.update(); 29 | secondObserver.update(); 30 | thirdObserver.update(); 31 | 32 | //provider/subject (broadcaster) 33 | topic.unregister(firstObserver); 34 | topic.postMessage("hello Subscribers"); 35 | 36 | 37 | 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /03_Observer_email/Observer/src/com/kejeiri/java/course/interfaces/Observer.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.interfaces; 2 | 3 | public interface Observer { 4 | public void update(); 5 | public void setSubject(Subject subject); 6 | } 7 | -------------------------------------------------------------------------------- /03_Observer_email/Observer/src/com/kejeiri/java/course/interfaces/Subject.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.interfaces; 2 | /* 3 | * Satellite 4 | * */ 5 | public interface Subject { 6 | public void register(Observer observer); 7 | public void unregister(Observer observer); 8 | public void notifyObservers(); 9 | public Object getUpdate(Observer observer); 10 | } 11 | -------------------------------------------------------------------------------- /03_Observer_email/Observer/src/com/kejeiri/java/course/model/EmailTopic.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.model; 2 | import com.kejeiri.java.course.interfaces.Observer; 3 | import com.kejeiri.java.course.interfaces.Subject; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | /* 8 | * Satellite : broadcaster 9 | * */ 10 | public class EmailTopic implements Subject{ 11 | private List observers; 12 | private String message; 13 | 14 | public EmailTopic() { 15 | this.observers = new ArrayList<>(); 16 | } 17 | public List getObservers() { 18 | return observers; 19 | } 20 | public void setObservers(List observers) { 21 | this.observers = observers; 22 | } 23 | public String getMessage() { 24 | return message; 25 | } 26 | public void setMessage(String message) { 27 | this.message = message; 28 | } 29 | @Override 30 | public void register(Observer observer) { 31 | if (observer == null) throw new NullPointerException("Null object/Observer"); 32 | if(!observers.contains(observer)) observers.add(observer); 33 | } 34 | 35 | @Override 36 | public void unregister(Observer observer) { 37 | observers.remove(observer); 38 | } 39 | 40 | @Override 41 | public void notifyObservers() { 42 | for (Observer observer: observers) { 43 | observer.update(); 44 | } 45 | } 46 | 47 | @Override 48 | public Object getUpdate(Observer observer) { 49 | return this.message; 50 | } 51 | 52 | public void postMessage(String msg){ 53 | System.out.println("Message posted to my Topic " + msg); 54 | this.message = msg; 55 | notifyObservers(); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /03_Observer_email/Observer/src/com/kejeiri/java/course/model/EmailTopicSubscriber.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.model; 2 | 3 | import com.kejeiri.java.course.interfaces.Observer; 4 | import com.kejeiri.java.course.interfaces.Subject; 5 | /* 6 | * a listener or observer 7 | * */ 8 | public class EmailTopicSubscriber implements Observer { 9 | private String name; 10 | //ref to the Subject class 11 | private Subject topic; 12 | 13 | public EmailTopicSubscriber(String name) { 14 | this.name = name; 15 | } 16 | 17 | public String getName() { 18 | return name; 19 | } 20 | 21 | public void setName(String name) { 22 | this.name = name; 23 | } 24 | 25 | 26 | 27 | @Override 28 | public void update() { 29 | String msg =(String)topic.getUpdate(this); 30 | if (msg == null) System.out.println(name + " No new message on this topic" ); 31 | else System.out.println(name + " Retrieving message: "+msg); 32 | } 33 | 34 | @Override 35 | public void setSubject(Subject subject) { 36 | this.topic = subject; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /04_observerBroadcast/radioBroadcast/figure.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/04_observerBroadcast/radioBroadcast/figure.jpg -------------------------------------------------------------------------------- /04_observerBroadcast/radioBroadcast/src/com/kejeiri/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course; 2 | 3 | import com.kejeiri.java.course.interfaces.IObserver; 4 | import com.kejeiri.java.course.interfaces.ITopic; 5 | import com.kejeiri.java.course.model.BreakingNews; 6 | import com.kejeiri.java.course.model.CustomerSubscriber; 7 | import com.kejeiri.java.course.model.NewsBulletin; 8 | import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils; 9 | 10 | public class Main { 11 | 12 | public static void main(String[] args) { 13 | NewsBulletin(); 14 | System.out.println("\n\t-----------------------------------------------------\n\n"); 15 | breakingNews(); 16 | 17 | } 18 | 19 | private static void breakingNews() { 20 | BreakingNews breakingNews = new BreakingNews(); 21 | IObserver observer1 = new CustomerSubscriber("Customer observer 1"); 22 | IObserver observer2 = new CustomerSubscriber("Customer observer 2"); 23 | IObserver observer3 = new CustomerSubscriber("Customer observer 3"); 24 | IObserver observer4 = new CustomerSubscriber("Customer observer 4"); 25 | 26 | breakingNews.register(observer1); 27 | breakingNews.register(observer2); 28 | breakingNews.register(observer3); 29 | breakingNews.register(observer4); 30 | 31 | breakingNews.broadcastBreakingNews("Breaking news 1"); 32 | breakingNews.unregister(observer2); 33 | System.out.println("----------one Customer observer's been cancelled----------"); 34 | breakingNews.broadcastBreakingNews("Breaking news 2"); 35 | } 36 | 37 | private static void NewsBulletin() { 38 | IObserver iObserver1 = new CustomerSubscriber("Subscription Customer 1"); 39 | IObserver iObserver2 = new CustomerSubscriber("Subscription Customer 2"); 40 | IObserver iObserver3 = new CustomerSubscriber("Subscription Customer 3"); 41 | IObserver iObserver4 = new CustomerSubscriber("Subscription Customer 4"); 42 | 43 | NewsBulletin news = new NewsBulletin(); 44 | news.register(iObserver1); 45 | news.register(iObserver2); 46 | news.register(iObserver3); 47 | news.register(iObserver4); 48 | 49 | news.postNews("All subscriptions included"); 50 | news.unregister(iObserver3); 51 | System.out.println("----------one Customer subscription's been cancelled----------"); 52 | news.postNews("one Customer subscription's been cancelled"); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /04_observerBroadcast/radioBroadcast/src/com/kejeiri/java/course/interfaces/IObserver.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.interfaces; 2 | 3 | import com.kejeiri.java.course.model.NewsBulletin; 4 | 5 | public interface IObserver { 6 | void attachTo(ITopic topic); 7 | void deattach(); 8 | void newTopic(String message); 9 | } 10 | -------------------------------------------------------------------------------- /04_observerBroadcast/radioBroadcast/src/com/kejeiri/java/course/interfaces/ITopic.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.interfaces; 2 | 3 | public interface ITopic { 4 | public void register(IObserver observer); 5 | public void unregister(IObserver observer); 6 | public void dispatchTo(IObserver observer); 7 | public void notifyAllObservers(); 8 | } 9 | -------------------------------------------------------------------------------- /04_observerBroadcast/radioBroadcast/src/com/kejeiri/java/course/model/BreakingNews.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.model; 2 | 3 | import com.kejeiri.java.course.interfaces.IObserver; 4 | import com.kejeiri.java.course.interfaces.ITopic; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | public class BreakingNews implements ITopic { 10 | private String message; 11 | List subscribers; 12 | 13 | public BreakingNews() { 14 | this.subscribers = new ArrayList<>(); 15 | } 16 | 17 | @Override 18 | public void register(IObserver observer) { 19 | if (observer == null) throw new NullPointerException("Subscriber is null"); 20 | if(!subscribers.contains(observer)) { 21 | observer.attachTo(this); 22 | subscribers.add(observer); 23 | } 24 | } 25 | 26 | @Override 27 | public void unregister(IObserver observer) { 28 | observer.deattach(); 29 | subscribers.remove(observer); 30 | } 31 | 32 | @Override 33 | public void dispatchTo(IObserver observer) { 34 | observer.newTopic(message); 35 | } 36 | 37 | @Override 38 | public void notifyAllObservers() { 39 | for (IObserver observer : this.subscribers) { 40 | dispatchTo(observer); 41 | } 42 | } 43 | 44 | public void broadcastBreakingNews(String message){ 45 | this.message = message; 46 | notifyAllObservers(); 47 | } 48 | 49 | 50 | } 51 | -------------------------------------------------------------------------------- /04_observerBroadcast/radioBroadcast/src/com/kejeiri/java/course/model/CustomerSubscriber.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.model; 2 | 3 | import com.kejeiri.java.course.interfaces.IObserver; 4 | import com.kejeiri.java.course.interfaces.ITopic; 5 | 6 | public class CustomerSubscriber implements IObserver { 7 | private String name; 8 | private ITopic topic; 9 | 10 | public CustomerSubscriber(String name) { 11 | this.name = name; 12 | } 13 | @Override 14 | public void attachTo(ITopic topic) { 15 | this.topic = topic; 16 | } 17 | 18 | 19 | @Override 20 | public void deattach() { 21 | this.topic=null; 22 | } 23 | 24 | @Override 25 | public void newTopic(String message) { 26 | System.out.println("the topic: "+message+ " for " + name + " has been broadcast!"); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /04_observerBroadcast/radioBroadcast/src/com/kejeiri/java/course/model/NewsBulletin.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.model; 2 | 3 | import com.kejeiri.java.course.interfaces.IObserver; 4 | import com.kejeiri.java.course.interfaces.ITopic; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | public class NewsBulletin implements ITopic { 10 | List listeners; 11 | private String message; 12 | 13 | public NewsBulletin() { 14 | this.listeners= new ArrayList<>(); 15 | } 16 | 17 | @Override 18 | public void register(IObserver observer) { 19 | if (observer == null) throw new NullPointerException("Observer is null!"); 20 | else if (!listeners.contains(observer)) { 21 | observer.attachTo(this); 22 | listeners.add(observer); 23 | } 24 | } 25 | @Override 26 | public void unregister(IObserver observer) { 27 | observer.deattach(); 28 | listeners.remove(observer); 29 | } 30 | @Override 31 | public void dispatchTo(IObserver observer) { 32 | observer.newTopic(message); 33 | } 34 | 35 | @Override 36 | public void notifyAllObservers() { 37 | for (IObserver observer : this.listeners) { 38 | dispatchTo(observer); 39 | } 40 | } 41 | 42 | public void postNews(String message){ 43 | this.message = message; 44 | notifyAllObservers(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /05_icecreamdecoratorpattern/decoratorpattern/Diagram1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/05_icecreamdecoratorpattern/decoratorpattern/Diagram1.jpg -------------------------------------------------------------------------------- /05_icecreamdecoratorpattern/decoratorpattern/Diagram2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/05_icecreamdecoratorpattern/decoratorpattern/Diagram2.jpg -------------------------------------------------------------------------------- /05_icecreamdecoratorpattern/decoratorpattern/Diagram3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/05_icecreamdecoratorpattern/decoratorpattern/Diagram3.jpg -------------------------------------------------------------------------------- /05_icecreamdecoratorpattern/decoratorpattern/src/com/kejeiri/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course; 2 | 3 | import com.kejeiri.java.course.imodel.IceCream; 4 | import com.kejeiri.java.course.model.*; 5 | 6 | public class Main { 7 | 8 | public static void main(String[] args) { 9 | IceCream basicIceCream = new BasicIceCream(); 10 | System.out.println("Basic icecream cost: $"+basicIceCream.cost()); 11 | //ADD vanilla to the order 12 | 13 | IceCream vanilla = new VanillaIceCream(basicIceCream);//wrapping vanilla 14 | System.out.println("vanilla icecream cost: $"+vanilla.cost()); 15 | 16 | //add mint to the order 17 | IceCream mint = new MintIceCream(vanilla); 18 | System.out.println("adding mint icecream cost: $"+mint.cost()); 19 | 20 | 21 | //add peanut to the order 22 | IceCream peanut = new PeanutIceCream(mint); 23 | System.out.println("adding peanut icecream cost: $"+peanut.cost()); 24 | 25 | 26 | 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /05_icecreamdecoratorpattern/decoratorpattern/src/com/kejeiri/java/course/imodel/IceCream.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.imodel; 2 | 3 | public interface IceCream { 4 | double cost(); 5 | } 6 | -------------------------------------------------------------------------------- /05_icecreamdecoratorpattern/decoratorpattern/src/com/kejeiri/java/course/model/BasicIceCream.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.model; 2 | 3 | import com.kejeiri.java.course.imodel.IceCream; 4 | 5 | public class BasicIceCream implements IceCream { 6 | public BasicIceCream() { 7 | System.out.println("basic Icecream is created"); 8 | } 9 | 10 | @Override 11 | public double cost() { 12 | return 0.5; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /05_icecreamdecoratorpattern/decoratorpattern/src/com/kejeiri/java/course/model/ChocolateIceCream.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.model; 2 | 3 | import com.kejeiri.java.course.imodel.IceCream; 4 | 5 | public class ChocolateIceCream extends IceCreamDecorator{ 6 | public ChocolateIceCream(IceCream iceCream) { 7 | super(iceCream); 8 | } 9 | 10 | @Override 11 | public double cost() { 12 | System.out.println("Adding chocolate ice-cream!"); 13 | return 1.0+super.cost(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /05_icecreamdecoratorpattern/decoratorpattern/src/com/kejeiri/java/course/model/IceCreamDecorator.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.model; 2 | 3 | import com.kejeiri.java.course.imodel.IceCream; 4 | /* 5 | * alternative to decorator: having inheritance from a base class, i.e creating a lot of object 6 | * in memory not created at runtime = lagging = not cost effective 7 | * with decorator we create on demand at runtime. 8 | * the downsize of decorator is: 9 | * - we most likely end up with a lot of different small class 10 | * - BUT: at least those classes are compartmentalized and they work on their own, which 11 | * allow more flexibility and maintainability of code. 12 | * the decorator allow us to wrap all the kind of ice-cream! 13 | * 14 | * */ 15 | public abstract class IceCreamDecorator implements IceCream { 16 | private IceCream iceCream; 17 | 18 | public IceCreamDecorator(IceCream iceCream) { 19 | this.iceCream = iceCream; 20 | } 21 | 22 | @Override 23 | public double cost() { 24 | return this.iceCream.cost(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /05_icecreamdecoratorpattern/decoratorpattern/src/com/kejeiri/java/course/model/MintIceCream.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.model; 2 | 3 | import com.kejeiri.java.course.imodel.IceCream; 4 | 5 | public class MintIceCream extends IceCreamDecorator{ 6 | public MintIceCream(IceCream iceCream) { 7 | super(iceCream); 8 | } 9 | 10 | @Override 11 | public double cost() { 12 | System.out.println("Adding mint Ice-cream!"); 13 | return 1.50+super.cost(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /05_icecreamdecoratorpattern/decoratorpattern/src/com/kejeiri/java/course/model/PeanutIceCream.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.model; 2 | 3 | import com.kejeiri.java.course.imodel.IceCream; 4 | 5 | public class PeanutIceCream extends IceCreamDecorator { 6 | public PeanutIceCream(IceCream iceCream) { 7 | super(iceCream); 8 | } 9 | 10 | @Override 11 | public double cost() { 12 | System.out.println("adding peanut ice-cream!"); 13 | return 1.75+super.cost(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /05_icecreamdecoratorpattern/decoratorpattern/src/com/kejeiri/java/course/model/VanillaIceCream.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.model; 2 | 3 | import com.kejeiri.java.course.imodel.IceCream; 4 | 5 | public class VanillaIceCream extends IceCreamDecorator{ 6 | public VanillaIceCream(IceCream iceCream) { 7 | super(iceCream); 8 | } 9 | 10 | @Override 11 | public double cost() { 12 | System.out.println("Adding vanilla Ice-cream!"); 13 | return 1.0+super.cost(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /06_HamburgerFactoryPattern/HamburgerFactoryPattern/Diagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/06_HamburgerFactoryPattern/HamburgerFactoryPattern/Diagram.jpg -------------------------------------------------------------------------------- /06_HamburgerFactoryPattern/HamburgerFactoryPattern/Diagram2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/06_HamburgerFactoryPattern/HamburgerFactoryPattern/Diagram2.jpg -------------------------------------------------------------------------------- /06_HamburgerFactoryPattern/HamburgerFactoryPattern/Diagram3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/06_HamburgerFactoryPattern/HamburgerFactoryPattern/Diagram3.jpg -------------------------------------------------------------------------------- /06_HamburgerFactoryPattern/HamburgerFactoryPattern/src/com/kejeiri/Core/HamburgerStore.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.Core; 2 | 3 | import com.kejeiri.model.Hamburger; 4 | 5 | public class HamburgerStore { 6 | private SimpleHamburgerFactory simpleHamburgerFactory; 7 | 8 | public HamburgerStore(SimpleHamburgerFactory simpleHamburgerFactory) { 9 | this.simpleHamburgerFactory = simpleHamburgerFactory; 10 | } 11 | 12 | public Hamburger orderHamburger(String type){ 13 | System.out.println("Ordering "+ type + " burger"); 14 | Hamburger burger = simpleHamburgerFactory.createHamburger(type); 15 | burger.prepare(); 16 | burger.cook(); 17 | burger.box(); 18 | System.out.println("picking up order"); 19 | return burger; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /06_HamburgerFactoryPattern/HamburgerFactoryPattern/src/com/kejeiri/Core/JamaicanHambugerFactory.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.Core; 2 | 3 | import com.kejeiri.model.Hamburger; 4 | 5 | public class JamaicanHambugerFactory extends SimpleHamburgerFactory { 6 | @Override 7 | public Hamburger createHamburger(String type) { 8 | return super.createHamburger(type); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /06_HamburgerFactoryPattern/HamburgerFactoryPattern/src/com/kejeiri/Core/SimpleHamburgerFactory.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.Core; 2 | 3 | import com.kejeiri.model.*; 4 | import sun.reflect.generics.reflectiveObjects.NotImplementedException; 5 | 6 | public class SimpleHamburgerFactory { 7 | public static final String CHEESE="cheese"; 8 | public static final String GREEK="greek"; 9 | public static final String MEAT="meatlover"; 10 | public static final String VEGGIE="veggie"; 11 | public static final String BUNLESS="bunless"; 12 | 13 | public Hamburger createHamburger(String type){ 14 | Hamburger burger = null; 15 | switch (type) { 16 | case CHEESE: 17 | burger = new CheeseBurger(); 18 | break; 19 | case GREEK: 20 | burger = new GreekBurger(); 21 | break; 22 | case MEAT: 23 | burger = new MeatLover(); 24 | break; 25 | case VEGGIE: 26 | burger = new VeggieBurger(); 27 | break; 28 | case BUNLESS: 29 | burger = new BunLessBurger(); 30 | break; 31 | default: 32 | throw new NotImplementedException(); 33 | } 34 | return burger; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /06_HamburgerFactoryPattern/HamburgerFactoryPattern/src/com/kejeiri/Main.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri; 2 | 3 | import com.kejeiri.Core.HamburgerStore; 4 | import com.kejeiri.Core.JamaicanHambugerFactory; 5 | 6 | public class Main { 7 | public static void main(String[] args) { 8 | JamaicanHambugerFactory jamaicanHambugerFactory = new JamaicanHambugerFactory(); 9 | HamburgerStore hs = new HamburgerStore(jamaicanHambugerFactory); 10 | hs.orderHamburger("cheese"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /06_HamburgerFactoryPattern/HamburgerFactoryPattern/src/com/kejeiri/model/BunLessBurger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class BunLessBurger extends Hamburger { 4 | } 5 | -------------------------------------------------------------------------------- /06_HamburgerFactoryPattern/HamburgerFactoryPattern/src/com/kejeiri/model/CheeseBurger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class CheeseBurger extends Hamburger { 4 | } 5 | -------------------------------------------------------------------------------- /06_HamburgerFactoryPattern/HamburgerFactoryPattern/src/com/kejeiri/model/GreekBurger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class GreekBurger extends Hamburger { 4 | } 5 | -------------------------------------------------------------------------------- /06_HamburgerFactoryPattern/HamburgerFactoryPattern/src/com/kejeiri/model/Hamburger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public abstract class Hamburger { 4 | public void prepare(){} 5 | public void cook(){} 6 | public void box(){} 7 | } 8 | -------------------------------------------------------------------------------- /06_HamburgerFactoryPattern/HamburgerFactoryPattern/src/com/kejeiri/model/MeatLover.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class MeatLover extends Hamburger{ 4 | } 5 | -------------------------------------------------------------------------------- /06_HamburgerFactoryPattern/HamburgerFactoryPattern/src/com/kejeiri/model/VeggieBurger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class VeggieBurger extends Hamburger { 4 | } 5 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/Diagram1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/Diagram1.jpg -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/Diagram2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/Diagram2.jpg -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/figure.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/figure.jpg -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/Core/HamburgerStore.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.Core; 2 | 3 | import com.kejeiri.model.Hamburger; 4 | 5 | public abstract class HamburgerStore { 6 | public Hamburger orderHamburger(String type){ 7 | Hamburger burger = createHamburger(type); 8 | burger.prepare(); 9 | burger.cook(); 10 | burger.box(); 11 | return burger; 12 | } 13 | public abstract Hamburger createHamburger(String type); 14 | } 15 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/Core/HamburgerTypes.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.Core; 2 | public enum HamburgerTypes { 3 | CHEESE("cheese"), 4 | GREEK("greek"), 5 | MEAT ("meatlover"), 6 | VEGGIE ("veggie"), 7 | BUNLESS("bunless"); 8 | 9 | private final String name; 10 | 11 | HamburgerTypes(String name) { 12 | this.name = name; 13 | } 14 | 15 | /* public boolean equalsName(String otherName) { 16 | return this.name.equals(otherName); 17 | }*/ 18 | 19 | public String toString() { 20 | return this.name; 21 | } 22 | } -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/Core/JamHamburgerStore.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.Core; 2 | import com.kejeiri.model.*; 3 | 4 | public class JamHamburgerStore extends HamburgerStore { 5 | @Override 6 | public Hamburger createHamburger(String type) { 7 | Hamburger burger = null; 8 | if (HamburgerTypes.CHEESE.name().equals(type)){ 9 | burger = new JamCheeseBurger(); 10 | return burger; 11 | } 12 | if (HamburgerTypes.GREEK.name().equals(type)){ 13 | burger = new JamGreekBurger(); 14 | return burger; 15 | } 16 | if (HamburgerTypes.MEAT.name().equals(type)){ 17 | burger = new JamMeatLover(); 18 | return burger; 19 | } 20 | 21 | if (HamburgerTypes.VEGGIE.name().equals(type)){ 22 | burger = new JamVeggieBurger(); 23 | return burger; 24 | } 25 | 26 | if (HamburgerTypes.BUNLESS.name().equals(type)){ 27 | burger = new JamBunLessBurger(); 28 | return burger; 29 | } 30 | System.out.println("burger : "+type+" not available!"); 31 | return burger; 32 | } 33 | 34 | @Override 35 | public Hamburger orderHamburger(String type) { 36 | return super.orderHamburger(type); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/Core/MozHamburgerStore.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.Core; 2 | import com.kejeiri.model.*; 3 | 4 | public class MozHamburgerStore extends HamburgerStore{ 5 | 6 | @Override 7 | public Hamburger orderHamburger(String type) { 8 | return super.orderHamburger(type); 9 | } 10 | 11 | @Override 12 | public Hamburger createHamburger(String type) { 13 | Hamburger burger = null; 14 | if (HamburgerTypes.CHEESE.name().equals(type)){ 15 | burger = new MozCheeseBurger(); 16 | return burger; 17 | } 18 | if (HamburgerTypes.GREEK.name().equals(type)){ 19 | burger = new MozGreekBurger(); 20 | return burger; 21 | } 22 | if (HamburgerTypes.MEAT.name().equals(type)){ 23 | burger = new MozMeatLover(); 24 | return burger; 25 | } 26 | 27 | if (HamburgerTypes.VEGGIE.name().equals(type)){ 28 | burger = new MozVeggieBurger(); 29 | return burger; 30 | } 31 | 32 | 33 | if (HamburgerTypes.BUNLESS.name().equals(type)){ 34 | burger = new MozBunLessBurger(); 35 | return burger; 36 | } 37 | System.out.println("burger not available!"); 38 | return burger; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/Main.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri; 2 | 3 | import com.kejeiri.Core.HamburgerTypes; 4 | import com.kejeiri.Core.JamHamburgerStore; 5 | import com.kejeiri.Core.HamburgerStore; 6 | import com.kejeiri.Core.MozHamburgerStore; 7 | import com.kejeiri.model.Hamburger; 8 | 9 | public class Main { 10 | public static void main(String[] args) { 11 | HamburgerStore hs = new JamHamburgerStore(); 12 | Hamburger hamburger = hs.orderHamburger(HamburgerTypes.CHEESE.name()); 13 | System.out.println("I ordered " + hamburger.getName()); 14 | 15 | 16 | hs = new MozHamburgerStore(); 17 | hamburger= hs.orderHamburger(HamburgerTypes.VEGGIE.name()); 18 | System.out.println("I ordered " + hamburger.getName()); 19 | 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/model/BunLessBurger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class BunLessBurger extends Hamburger { 4 | } 5 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/model/CheeseBurger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class CheeseBurger extends Hamburger { 4 | } 5 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/model/GreekBurger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class GreekBurger extends Hamburger { 4 | } 5 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/model/Hamburger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public abstract class Hamburger { 4 | private String name; 5 | private String sauce; 6 | private String buns; 7 | 8 | public String getName() { 9 | return name; 10 | } 11 | 12 | public void setName(String name) { 13 | this.name = name; 14 | } 15 | 16 | public String getSauce() { 17 | return sauce; 18 | } 19 | 20 | public void setSauce(String sauce) { 21 | this.sauce = sauce; 22 | } 23 | 24 | public String getBuns() { 25 | return buns; 26 | } 27 | 28 | public void setBuns(String buns) { 29 | this.buns = buns; 30 | } 31 | 32 | public void prepare(){ 33 | System.out.println("Preparing "+name); 34 | System.out.println("Adding sauce "+sauce); 35 | System.out.println("Adding burns "+buns); 36 | } 37 | 38 | public void cook(){ 39 | System.out.println("Cooking..."); 40 | } 41 | public void box(){ 42 | System.out.println("Boxing..."); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/model/JamBunLessBurger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class JamBunLessBurger extends Hamburger { 4 | } 5 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/model/JamCheeseBurger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class JamCheeseBurger extends Hamburger { 4 | public JamCheeseBurger() { 5 | this.setName("Jamaican cheese burger"); 6 | this.setSauce("Jamaican sauce style"); 7 | this.setBuns("Cookie dough buns!"); 8 | } 9 | 10 | @Override 11 | public void prepare() { 12 | System.out.println("Preparing Jamaican "+this.getName()); 13 | System.out.println("Adding sauce Jamaican "+this.getSauce()); 14 | System.out.println("Adding burns Jamaican "+this.getBuns()); 15 | } 16 | 17 | @Override 18 | public void cook() { 19 | System.out.println("Cooking jamaican style burger"); 20 | } 21 | 22 | @Override 23 | public void box() { 24 | System.out.println("Boxing jamaican style burger"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/model/JamGreekBurger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class JamGreekBurger extends Hamburger { 4 | } 5 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/model/JamMeatLover.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class JamMeatLover extends Hamburger { 4 | } 5 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/model/JamVeggieBurger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class JamVeggieBurger extends Hamburger { 4 | } 5 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/model/MeatLover.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class MeatLover extends Hamburger{ 4 | } 5 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/model/MozBunLessBurger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class MozBunLessBurger extends Hamburger { 4 | } 5 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/model/MozCheeseBurger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class MozCheeseBurger extends Hamburger { 4 | } 5 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/model/MozGreekBurger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class MozGreekBurger extends Hamburger { 4 | } 5 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/model/MozMeatLover.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class MozMeatLover extends Hamburger { 4 | } 5 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/model/MozVeggieBurger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class MozVeggieBurger extends Hamburger { 4 | public MozVeggieBurger() { 5 | this.setName("Mozambican veggie burger"); 6 | this.setSauce("Mozambican sauce style"); 7 | this.setBuns("Mozambican Cookie dough buns!"); 8 | } 9 | 10 | @Override 11 | public void prepare() { 12 | System.out.println("Preparing "+this.getName()); 13 | System.out.println("Adding sauce "+this.getSauce()); 14 | System.out.println("Adding burns "+this.getBuns()); 15 | } 16 | 17 | @Override 18 | public void cook() { 19 | System.out.println("Cooking Mozambican style burger"); 20 | } 21 | 22 | @Override 23 | public void box() { 24 | System.out.println("Boxing Mozambican style burger"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /07_HamburgerFactoryPattern_ENHANCED/HamburgerFactoryPattern/src/com/kejeiri/model/VeggieBurger.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.model; 2 | 3 | public class VeggieBurger extends Hamburger { 4 | } 5 | -------------------------------------------------------------------------------- /08_Singleton_Lazily_Created/SimpleDBConnector/figure1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/08_Singleton_Lazily_Created/SimpleDBConnector/figure1.jpg -------------------------------------------------------------------------------- /08_Singleton_Lazily_Created/SimpleDBConnector/src/com/java/course/DBConnector.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | public class DBConnector { 3 | private static DBConnector uniquedbcon; 4 | private DBConnector() { 5 | } 6 | //synchronized keyword: make this method thread safe but it goes with an overhead, beware also of deadlock problem 7 | //here we lazily create our singleton 8 | public static synchronized DBConnector getInstance(){ 9 | if (uniquedbcon == null){ 10 | uniquedbcon = new DBConnector(); 11 | } 12 | return uniquedbcon; 13 | } 14 | 15 | 16 | public void userConnect(){ 17 | System.out.println("user is connected to db! : Object @ = " + uniquedbcon); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /08_Singleton_Lazily_Created/SimpleDBConnector/src/com/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | public class Main { 3 | public static void main(String[] args) { 4 | System.out.println("Creating a singleton connection to DB"); 5 | DBConnector dbConnector = DBConnector.getInstance(); 6 | dbConnector.userConnect(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /09_Singleton_Eagerly_Created/SimpleDBConnector/figure1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/09_Singleton_Eagerly_Created/SimpleDBConnector/figure1.jpg -------------------------------------------------------------------------------- /09_Singleton_Eagerly_Created/SimpleDBConnector/src/com/java/course/DBConnector.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | public class DBConnector { 3 | //Eagerly creating a DBConnector instance 4 | //synchronisation is a way expensive, we need to minimize it overhead! 5 | //the idea is to check if an instance is created and then synchronized 6 | private static DBConnector uniquedbcon = new DBConnector(); 7 | private DBConnector() { 8 | } 9 | 10 | public static DBConnector getInstance(){ 11 | return uniquedbcon; 12 | } 13 | public void userConnect(){ 14 | System.out.println("user is connected to db! : Object @ = " + uniquedbcon); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /09_Singleton_Eagerly_Created/SimpleDBConnector/src/com/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | public class Main { 3 | public static void main(String[] args) { 4 | System.out.println("Creating a singleton connection to DB"); 5 | DBConnector dbConnector = DBConnector.getInstance(); 6 | dbConnector.userConnect(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /10_Singleton_Lazily_Created_Double-check-locking/SimpleDBConnector/figure1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/10_Singleton_Lazily_Created_Double-check-locking/SimpleDBConnector/figure1.jpg -------------------------------------------------------------------------------- /10_Singleton_Lazily_Created_Double-check-locking/SimpleDBConnector/src/com/java/course/DBConnector.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | public class DBConnector { 3 | //Eagerly creating a DBConnector instance 4 | //synchronisation is a way expensive, we need to minimize it overhead! 5 | //the idea is to check if an instance is created and then synchronized 6 | //private static DBConnector uniquedbcon = new DBConnector(); 7 | private DBConnector() { 8 | } 9 | //volatile ensure that multiple thread handle the unique instance variable when it 10 | //initialize correctly to the singleton instance 11 | 12 | /* 13 | * double-check locking make sure that an instance is safe thread created without overhead. 14 | * double-check locking allow us to synchronized/lock the class until the instance is created! 15 | * */ 16 | private volatile static DBConnector uniquedbcon ; 17 | public static DBConnector getInstance(){ 18 | if (uniquedbcon == null) { 19 | synchronized ((DBConnector.class)) { 20 | if (uniquedbcon == null){ 21 | uniquedbcon = new DBConnector(); 22 | } 23 | } 24 | } 25 | return uniquedbcon; 26 | } 27 | public void userConnect(){ 28 | System.out.println("user is connected to db! : Object @ = " + uniquedbcon); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /10_Singleton_Lazily_Created_Double-check-locking/SimpleDBConnector/src/com/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | public class Main { 3 | public static void main(String[] args) { 4 | System.out.println("Creating a singleton connection to DB"); 5 | DBConnector dbConnector = DBConnector.getInstance(); 6 | dbConnector.userConnect(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /11_CommandPattern/CommandPattern/Diagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/11_CommandPattern/CommandPattern/Diagram.jpg -------------------------------------------------------------------------------- /11_CommandPattern/CommandPattern/src/com/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | import com.java.course.actions.*; 4 | import com.java.course.icommand.ICommand; 5 | import com.java.course.model.GameBoy; 6 | import com.java.course.model.KirbyCharacterReceiver; 7 | import com.java.course.model.MarioCharacterReceiver; 8 | 9 | 10 | /* 11 | COMMAND DESIGN PATTERN 12 | it's kind of one size fits all situations; same command will execute the appropriate actions depending on the request. 13 | It encapsulates a request as an object (Character = the game card), thereby enables us 14 | to parametrize other OBJECTS wjth different requests, queues or logs... 15 | 16 | EXAMPLE 17 | ------- 18 | * The game is no longer character dependent!, we could inject any card (character Kirby/mario) into the console (Gameboy) 19 | * ;i.e inject (DI) of any type of character command (MarioUpCommand,KirbyUpCommand, ....) into the console which 20 | * means insert any card!. 21 | * */ 22 | 23 | public class Main { 24 | 25 | public static void main(String[] args) { 26 | //Create Mario character 27 | MarioCharacterReceiver mario = new MarioCharacterReceiver("MarioXXL"); 28 | 29 | //Create commands 30 | ICommand upCommand = new MarioUpCommand(mario); 31 | ICommand leftCommand = new MarioLeftCommand(mario); 32 | ICommand rightCommand = new MarioRightCommand(mario); 33 | ICommand downCommand = new MarioDownCommand(mario); 34 | 35 | //Create the Invoker (console) for Mario 36 | GameBoy console; 37 | console = new GameBoy(upCommand, leftCommand, rightCommand,downCommand); 38 | console.arrowUp(); 39 | console.arrowDown(); 40 | console.arrowLeft(); 41 | console.arrowRight(); 42 | 43 | //Create Kirby Character 44 | KirbyCharacterReceiver kirby = new KirbyCharacterReceiver("Kirby---"); 45 | 46 | //Create commands 47 | ICommand KirbyUpCommand = new KirbyUpCommand(kirby); 48 | ICommand KirbyLeftCommand = new KirbyLeftCommand(kirby); 49 | ICommand KirbyRightCommand = new KirbyRightCommand(kirby); 50 | ICommand KirbyDownCommand = new KirbyDownCommand(kirby); 51 | 52 | //create the Invoker for Kirby 53 | console = new GameBoy(KirbyUpCommand,KirbyLeftCommand,KirbyRightCommand,KirbyDownCommand); 54 | console.arrowUp(); 55 | console.arrowRight(); 56 | console.arrowLeft(); 57 | console.arrowDown(); 58 | 59 | 60 | 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /11_CommandPattern/CommandPattern/src/com/java/course/actions/KirbyDownCommand.java: -------------------------------------------------------------------------------- 1 | package com.java.course.actions; 2 | 3 | import com.java.course.icommand.ICommand; 4 | import com.java.course.model.KirbyCharacterReceiver; 5 | 6 | public class KirbyDownCommand implements ICommand { 7 | private KirbyCharacterReceiver kirbyCharacter; 8 | 9 | public KirbyDownCommand(KirbyCharacterReceiver kirbyCharacter) { 10 | this.kirbyCharacter = kirbyCharacter; 11 | } 12 | 13 | @Override 14 | public void execute() { 15 | kirbyCharacter.moveDown(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /11_CommandPattern/CommandPattern/src/com/java/course/actions/KirbyLeftCommand.java: -------------------------------------------------------------------------------- 1 | package com.java.course.actions; 2 | 3 | import com.java.course.icommand.ICommand; 4 | import com.java.course.model.KirbyCharacterReceiver; 5 | 6 | public class KirbyLeftCommand implements ICommand { 7 | private KirbyCharacterReceiver kirbyCharacter; 8 | 9 | public KirbyLeftCommand(KirbyCharacterReceiver kirbyCharacter) { 10 | this.kirbyCharacter = kirbyCharacter; 11 | } 12 | 13 | @Override 14 | public void execute() { 15 | kirbyCharacter.moveLeft(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /11_CommandPattern/CommandPattern/src/com/java/course/actions/KirbyRightCommand.java: -------------------------------------------------------------------------------- 1 | package com.java.course.actions; 2 | 3 | import com.java.course.icommand.ICommand; 4 | import com.java.course.model.KirbyCharacterReceiver; 5 | 6 | public class KirbyRightCommand implements ICommand { 7 | private KirbyCharacterReceiver kirbyCharacter; 8 | 9 | public KirbyRightCommand(KirbyCharacterReceiver kirbyCharacter) { 10 | this.kirbyCharacter = kirbyCharacter; 11 | } 12 | 13 | @Override 14 | 15 | public void execute() { 16 | kirbyCharacter.moveRight(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /11_CommandPattern/CommandPattern/src/com/java/course/actions/KirbyUpCommand.java: -------------------------------------------------------------------------------- 1 | package com.java.course.actions; 2 | 3 | import com.java.course.icommand.ICommand; 4 | import com.java.course.model.KirbyCharacterReceiver; 5 | 6 | public class KirbyUpCommand implements ICommand { 7 | private KirbyCharacterReceiver kirbyCharacter; 8 | 9 | public KirbyUpCommand(KirbyCharacterReceiver kirbyCharacter) { 10 | this.kirbyCharacter = kirbyCharacter; 11 | } 12 | 13 | @Override 14 | public void execute() { 15 | kirbyCharacter.moveUp(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /11_CommandPattern/CommandPattern/src/com/java/course/actions/MarioDownCommand.java: -------------------------------------------------------------------------------- 1 | package com.java.course.actions; 2 | 3 | import com.java.course.icommand.ICommand; 4 | import com.java.course.model.MarioCharacterReceiver; 5 | 6 | public class MarioDownCommand implements ICommand { 7 | private MarioCharacterReceiver marioCharacter; 8 | 9 | public MarioDownCommand(MarioCharacterReceiver marioCharacter) { 10 | this.marioCharacter = marioCharacter; 11 | } 12 | 13 | @Override 14 | public void execute() { 15 | marioCharacter.moveDown(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /11_CommandPattern/CommandPattern/src/com/java/course/actions/MarioLeftCommand.java: -------------------------------------------------------------------------------- 1 | package com.java.course.actions; 2 | 3 | import com.java.course.icommand.ICommand; 4 | import com.java.course.model.MarioCharacterReceiver; 5 | 6 | public class MarioLeftCommand implements ICommand { 7 | private MarioCharacterReceiver marioCharacter; 8 | 9 | public MarioLeftCommand(MarioCharacterReceiver marioCharacter) { 10 | this.marioCharacter = marioCharacter; 11 | } 12 | 13 | @Override 14 | public void execute() { 15 | marioCharacter.moveLeft(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /11_CommandPattern/CommandPattern/src/com/java/course/actions/MarioRightCommand.java: -------------------------------------------------------------------------------- 1 | package com.java.course.actions; 2 | 3 | import com.java.course.icommand.ICommand; 4 | import com.java.course.model.MarioCharacterReceiver; 5 | 6 | public class MarioRightCommand implements ICommand { 7 | private MarioCharacterReceiver marioCharacter; 8 | 9 | public MarioRightCommand(MarioCharacterReceiver marioCharacter) { 10 | this.marioCharacter = marioCharacter; 11 | } 12 | 13 | @Override 14 | public void execute() { 15 | marioCharacter.moveRight(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /11_CommandPattern/CommandPattern/src/com/java/course/actions/MarioUpCommand.java: -------------------------------------------------------------------------------- 1 | package com.java.course.actions; 2 | 3 | import com.java.course.icommand.ICommand; 4 | import com.java.course.model.MarioCharacterReceiver; 5 | 6 | public class MarioUpCommand implements ICommand { 7 | private MarioCharacterReceiver marioCharacter; 8 | 9 | public MarioUpCommand(MarioCharacterReceiver marioCharacter) { 10 | this.marioCharacter = marioCharacter; 11 | } 12 | 13 | @Override 14 | public void execute() { 15 | marioCharacter.moveUp(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /11_CommandPattern/CommandPattern/src/com/java/course/icommand/ICommand.java: -------------------------------------------------------------------------------- 1 | package com.java.course.icommand; 2 | 3 | public interface ICommand { 4 | void execute(); 5 | } 6 | -------------------------------------------------------------------------------- /11_CommandPattern/CommandPattern/src/com/java/course/model/GameBoy.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | import com.java.course.icommand.ICommand; 4 | 5 | public class GameBoy { 6 | private ICommand upCommand,leftCommand,rightCommand,downCommand; //implementation 7 | 8 | public GameBoy(ICommand upCommand, ICommand leftCommand, ICommand rightCommand, ICommand downCommand) { 9 | this.upCommand = upCommand; 10 | this.leftCommand = leftCommand; 11 | this.rightCommand = rightCommand; 12 | this.downCommand = downCommand; 13 | } 14 | 15 | public void arrowUp(){ 16 | upCommand.execute(); 17 | } 18 | public void arrowDown(){ 19 | downCommand.execute(); 20 | } 21 | 22 | public void arrowLeft(){ 23 | leftCommand.execute(); 24 | } 25 | public void arrowRight(){ 26 | rightCommand.execute(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /11_CommandPattern/CommandPattern/src/com/java/course/model/KirbyCharacterReceiver.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | public class KirbyCharacterReceiver { 4 | private String name; 5 | 6 | public KirbyCharacterReceiver(String name) { 7 | this.name = name; 8 | } 9 | 10 | public String getName() { 11 | return name; 12 | } 13 | 14 | public void setName(String name) { 15 | this.name = name; 16 | } 17 | 18 | public void moveUp(){ 19 | System.out.println(getName()+" is jumping up"); 20 | } 21 | public void moveLeft(){ 22 | System.out.println(getName()+" is moving left"); 23 | } 24 | public void moveRight(){ 25 | System.out.println(getName()+" is moving right"); 26 | } 27 | public void moveDown(){ 28 | System.out.println(getName()+" is moving down"); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /11_CommandPattern/CommandPattern/src/com/java/course/model/MarioCharacterReceiver.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | public class MarioCharacterReceiver { 4 | private String name; 5 | 6 | public String getName() { 7 | return name; 8 | } 9 | 10 | public MarioCharacterReceiver(String name) { 11 | this.name = name; 12 | } 13 | 14 | public void setName(String name) { 15 | this.name = name; 16 | } 17 | 18 | 19 | public void moveUp(){ 20 | System.out.println(getName()+" is jumping up"); 21 | } 22 | public void moveLeft(){ 23 | System.out.println(getName()+" is moving left"); 24 | } 25 | public void moveRight(){ 26 | System.out.println(getName()+" is moving right"); 27 | } 28 | public void moveDown(){ 29 | System.out.println(getName()+" is moving down"); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /12_AdapterPattern/AdapterPattern/diagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/12_AdapterPattern/AdapterPattern/diagram.jpg -------------------------------------------------------------------------------- /12_AdapterPattern/AdapterPattern/figure.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/12_AdapterPattern/AdapterPattern/figure.jpg -------------------------------------------------------------------------------- /12_AdapterPattern/AdapterPattern/src/com/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | /* 3 | Adapter Pattern 4 | Converts the interface of a class into another interface the client expect. 5 | Adapter lets classes work together that couldn't otherwise because of incompatible interfaces. 6 | * */ 7 | 8 | import com.java.course.iadapter.ISocketAdapter; 9 | import com.java.course.model.SocketAdapterImplementation; 10 | import com.java.course.model.SocketObjectAdapterImplmentation; 11 | import com.java.course.model.Volt; 12 | 13 | //Client 14 | public class Main { 15 | 16 | public static void main(String[] args) { 17 | testingSocketObject(); 18 | testingClassAdapter(); 19 | } 20 | 21 | private static void testingClassAdapter() { 22 | ISocketAdapter adapter = new SocketAdapterImplementation(); 23 | Volt v1 = getVolt(adapter,1); 24 | Volt v3 = getVolt(adapter,3); 25 | Volt v12 = getVolt(adapter,12); 26 | Volt v120 = getVolt(adapter,120); 27 | System.out.println("V1 is using class adapter (volt) "+v1.getVolts()); 28 | System.out.println("V3 is using class adapter (volt) "+v3.getVolts()); 29 | System.out.println("V12 is using class adapter (volt) "+v12.getVolts()); 30 | System.out.println("V120 is using class adapter (volt) "+v120.getVolts()); 31 | 32 | 33 | 34 | 35 | } 36 | 37 | public static void testingSocketObject(){ 38 | ISocketAdapter objectAdapterImp = new SocketObjectAdapterImplmentation(); 39 | Volt v1 = getVolt(objectAdapterImp,1); 40 | Volt v3 = getVolt(objectAdapterImp,3); 41 | Volt v12 = getVolt(objectAdapterImp,12); 42 | Volt v120 = getVolt(objectAdapterImp,120); 43 | System.out.println("V1 is using object adapter (volt) "+v1.getVolts()); 44 | System.out.println("V3 is using object adapter (volt) "+v3.getVolts()); 45 | System.out.println("V12 is using object adapter (volt) "+v12.getVolts()); 46 | System.out.println("V120 is using object adapter (volt) "+v120.getVolts()); 47 | } 48 | 49 | private static Volt getVolt(ISocketAdapter objectAdapterImp, int i) { 50 | switch (i) { 51 | case 1 : return objectAdapterImp.get1Volts(); 52 | case 3 : return objectAdapterImp.get3Volts(); 53 | case 12 : return objectAdapterImp.get12Volts(); 54 | default:return objectAdapterImp.get120Volts(); 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /12_AdapterPattern/AdapterPattern/src/com/java/course/iadapter/ISocketAdapter.java: -------------------------------------------------------------------------------- 1 | package com.java.course.iadapter; 2 | import com.java.course.model.Volt; 3 | 4 | //Target 5 | public interface ISocketAdapter { 6 | Volt get120Volts(); 7 | Volt get12Volts(); 8 | Volt get3Volts(); 9 | Volt get1Volts(); 10 | } 11 | -------------------------------------------------------------------------------- /12_AdapterPattern/AdapterPattern/src/com/java/course/model/Socket.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | //Adaptee 4 | public class Socket { 5 | public Volt getVolt(){ 6 | return new Volt(120); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /12_AdapterPattern/AdapterPattern/src/com/java/course/model/SocketAdapterImplementation.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | import com.java.course.iadapter.ISocketAdapter; 4 | /* 5 | Adapter Pattern 6 | Converts the interface of a class into another interface the client expect. 7 | Adapter lets classes work together that couldn't otherwise because of incompatible interfaces. 8 | * */ 9 | 10 | 11 | //Class Adapter using inheritance 12 | public class SocketAdapterImplementation extends Socket implements ISocketAdapter { 13 | @Override 14 | public Volt get120Volts() { 15 | return getVolt(); 16 | } 17 | 18 | @Override 19 | public Volt get12Volts() { 20 | Volt v = getVolt(); 21 | return ConvertVolt(v,10); 22 | } 23 | 24 | @Override 25 | public Volt get3Volts() { 26 | Volt v = getVolt(); 27 | return ConvertVolt(v, 40); 28 | } 29 | 30 | @Override 31 | public Volt get1Volts() { 32 | Volt v = getVolt(); 33 | return ConvertVolt(v,120); 34 | } 35 | private Volt ConvertVolt(Volt v, int i) { 36 | return new Volt(v.getVolts()/i); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /12_AdapterPattern/AdapterPattern/src/com/java/course/model/SocketObjectAdapterImplmentation.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | import com.java.course.iadapter.ISocketAdapter; 4 | 5 | //Class adapter using composition for adapter pattern 6 | public class SocketObjectAdapterImplmentation implements ISocketAdapter { 7 | //using composition over inheritance! 8 | private Socket socket = new Socket(); 9 | 10 | @Override 11 | public Volt get120Volts() { 12 | return socket.getVolt(); 13 | } 14 | 15 | @Override 16 | public Volt get12Volts() { 17 | Volt v= socket.getVolt(); 18 | return ConvertVolt(v,10); 19 | } 20 | 21 | @Override 22 | public Volt get3Volts() { 23 | Volt v= socket.getVolt(); 24 | return ConvertVolt(v,40); 25 | } 26 | 27 | @Override 28 | public Volt get1Volts() { 29 | Volt v= socket.getVolt(); 30 | return ConvertVolt(v,120); 31 | } 32 | private Volt ConvertVolt(Volt v, int i) { 33 | return new Volt(v.getVolts()/i); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /12_AdapterPattern/AdapterPattern/src/com/java/course/model/Volt.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | public class Volt { 4 | private int volts; 5 | 6 | public Volt(int volts) { 7 | this.volts = volts; 8 | } 9 | 10 | public int getVolts() { 11 | return volts; 12 | } 13 | 14 | public void setVolts(int volts) { 15 | this.volts = volts; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /13_FacadePattern/FacadePattern/Diagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/13_FacadePattern/FacadePattern/Diagram.jpg -------------------------------------------------------------------------------- /13_FacadePattern/FacadePattern/README.md: -------------------------------------------------------------------------------- 1 | # The facade pattern: 2 | It provides a unified interface (i.e. interaction/connexion) to a set of interfaces in a subsystem. 3 | Facade defines a higher-level interface that makes the subsystem easier to use. 4 | 5 | > client use the facade of the subsystem(computer = set of classes) to communicate with the subsystem, otherwise it would be too complex for the client to go directly and communicate with the classes of the subsystem (like hard drive which the client should know everything about), facade provides a simplified interface to a larger body of code, so we put under an umbrella all the system that needs to be abstracted out and we use the facade to communicate with that subsystem (e.g. facade.harddrive.setOn/setOff ...) as opposed to the client that has to know everything about all subsystem. Hence, the classes are decoupled from the client and used through the facade interface. 6 | -------------------------------------------------------------------------------- /13_FacadePattern/FacadePattern/figure.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/13_FacadePattern/FacadePattern/figure.jpg -------------------------------------------------------------------------------- /13_FacadePattern/FacadePattern/src/com/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | import com.java.course.facade.ComputerFacade; 4 | import com.java.course.subsystem.CPU; 5 | import com.java.course.subsystem.HardDrive; 6 | import com.java.course.subsystem.Memory; 7 | 8 | /* 9 | * The facade pattern provides a unified interface (i.e. interaction/connexion) to a set of interfaces in a subsystem. 10 | facade defines a higher-level interface that makes the subsystem easier to use. 11 | client use the facade of the subsystem(computer = set of classes) to communicate with the subsystem, 12 | otherwise it would be too complex for the client to go directly and communicate with the 13 | classes of the subsystem (like hard drive which the client should know everything about), 14 | facade provides a simplified interface to a larger body of code, so we put under an umbrella 15 | all the system that needs to be abstracted out and we use the facade to communicate with that 16 | subsystem (eg. facade.hard drive.setOn/setOff ...) as opposed to the client that has to know 17 | everything about all subsystem. Hence, the classes are decoupled from the client and used through 18 | the facade interface. 19 | * */ 20 | public class Main { 21 | 22 | public static void main(String[] args) { 23 | /* 24 | * Goal: Less dependencies (or no dependency) between the client(this) and the subsystem!, all is managed and done 25 | * at the facade level. 26 | * */ 27 | CPU cpu = new CPU(); 28 | Memory ram = new Memory(); 29 | HardDrive hd= new HardDrive(); 30 | ComputerFacade computerFacade = new ComputerFacade(cpu,ram,hd); 31 | computerFacade.start(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /13_FacadePattern/FacadePattern/src/com/java/course/facade/ComputerFacade.java: -------------------------------------------------------------------------------- 1 | package com.java.course.facade; 2 | 3 | import com.java.course.subsystem.CPU; 4 | import com.java.course.subsystem.HardDrive; 5 | import com.java.course.subsystem.Memory; 6 | 7 | public class ComputerFacade { 8 | private CPU processor; 9 | private Memory ram; 10 | private HardDrive hd; 11 | 12 | public ComputerFacade(CPU processor, Memory ram, HardDrive hd) { 13 | this.processor = processor; 14 | this.ram = ram; 15 | this.hd = hd; 16 | } 17 | public void start(){ 18 | processor.freeze(); 19 | ram.load(132,hd.read(35865,80)); 20 | processor.jump(132); 21 | processor.execute(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /13_FacadePattern/FacadePattern/src/com/java/course/subsystem/CPU.java: -------------------------------------------------------------------------------- 1 | package com.java.course.subsystem; 2 | 3 | public class CPU { 4 | public void freeze(){ 5 | System.out.println("Computer freezing..."); 6 | } 7 | public void jump(long position){ 8 | System.out.println("Jumping to..." + position); 9 | } 10 | public void execute(){ 11 | System.out.println("Computer executing commands"); 12 | } 13 | 14 | 15 | } 16 | -------------------------------------------------------------------------------- /13_FacadePattern/FacadePattern/src/com/java/course/subsystem/HardDrive.java: -------------------------------------------------------------------------------- 1 | package com.java.course.subsystem; 2 | 3 | public class HardDrive { 4 | public byte[] read(long iba, int size){ 5 | return new byte[]{'f','z'}; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /13_FacadePattern/FacadePattern/src/com/java/course/subsystem/Memory.java: -------------------------------------------------------------------------------- 1 | package com.java.course.subsystem; 2 | 3 | public class Memory { 4 | public void load(long position, byte[] data){ 5 | System.out.println("Added item to memory... "+ position); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /14_TemplatePattern/TemplatePattern/Diagram1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/14_TemplatePattern/TemplatePattern/Diagram1.jpg -------------------------------------------------------------------------------- /14_TemplatePattern/TemplatePattern/Diagram2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/14_TemplatePattern/TemplatePattern/Diagram2.jpg -------------------------------------------------------------------------------- /14_TemplatePattern/TemplatePattern/README.md: -------------------------------------------------------------------------------- 1 | # The Template design pattern: 2 | It defines the skeleton of an algorithm in a method, deferring some steps to subclasses; it lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure. 3 | 4 | > We define the core functionalities in superclass(or abstract class) and them all method/behaviours could be redefined in subclasses otherwise the code get quickly redundant and tedious when it comes to maintainability, so the template method pattern encapsulates algorithm so each subclass is able to tweak certain properties or functionalities if needed. -------------------------------------------------------------------------------- /14_TemplatePattern/TemplatePattern/src/com/java/course/Game.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public abstract class Game { 4 | public abstract void initialize(); 5 | public abstract void startPlay(); 6 | public abstract void endPlay(); 7 | 8 | public final void play(){ 9 | do { 10 | initialize(); 11 | startPlay(); 12 | if (addNewGameCharacter()){ 13 | addNewGameCharacterToTheGame(); 14 | } 15 | endPlay(); 16 | }while(!endTheGame()); 17 | } 18 | //Template method 19 | //we give the options to implement or not to the subclasses 20 | //Hooked-on template method: declare in an abstract class and given abstract or a default implementation 21 | 22 | //declare as an abstract 23 | public abstract boolean addNewGameCharacter(); 24 | 25 | //declare as a default 26 | public boolean endTheGame(){ 27 | return true; 28 | } 29 | 30 | private void addNewGameCharacterToTheGame(){ 31 | System.out.println("adding a new character to the game!"); 32 | } 33 | //regardless on type of Game we need to load assets into computer memory. 34 | void loadAssets(){ 35 | System.out.println("Loading Game Assets"); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /14_TemplatePattern/TemplatePattern/src/com/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | import com.java.course.model.EndlessRunnerGame; 4 | import com.java.course.model.FootBallGame; 5 | 6 | /* 7 | *The Template design pattern: 8 | It defines the skeleton of an algorithm in a method, deferring some steps to 9 | subclasses; it lets subclasses redefine certain steps of an algorithm without 10 | changing the algorithm's structure. 11 | We define the core functionalities in superclass(or abstract class) and them 12 | all method/behaviours could be redefined in subclasses otherwise the code get 13 | quickly redundant and tedious when it comes to maintainability, so the 14 | template method pattern encapsulates algorithm so each subclass is able 15 | to tweak certain properties or functionalities if needed. 16 | * */ 17 | public class Main { 18 | public static void main(String[] args) { 19 | Game game = new FootBallGame(); 20 | game.play(); 21 | 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /14_TemplatePattern/TemplatePattern/src/com/java/course/model/EndlessRunnerGame.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | import com.java.course.Game; 4 | 5 | public class EndlessRunnerGame extends Game { 6 | 7 | @Override 8 | public void initialize() { 9 | System.out.println("Endless runner initializing ..."); 10 | } 11 | 12 | @Override 13 | public void startPlay() { 14 | System.out.println("Endless runner starting..."); 15 | } 16 | 17 | @Override 18 | public void endPlay() { 19 | System.out.println("Endless runner ending..."); 20 | } 21 | 22 | @Override 23 | public boolean addNewGameCharacter() { 24 | return false; 25 | } 26 | 27 | @Override 28 | public boolean endTheGame() { 29 | return super.endTheGame(); 30 | } 31 | 32 | //..more methods 33 | } 34 | -------------------------------------------------------------------------------- /14_TemplatePattern/TemplatePattern/src/com/java/course/model/FootBallGame.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | import com.java.course.Game; 4 | 5 | import java.io.BufferedReader; 6 | import java.io.IOException; 7 | import java.io.InputStreamReader; 8 | 9 | public class FootBallGame extends Game { 10 | @Override 11 | public void initialize() { 12 | System.out.println("Football initializing ..."); 13 | } 14 | 15 | @Override 16 | public void startPlay() { 17 | System.out.println("Football starting ..."); 18 | } 19 | 20 | @Override 21 | public void endPlay() { 22 | System.out.println("Football ending ..."); 23 | } 24 | 25 | @Override 26 | public boolean addNewGameCharacter() { 27 | String question = "Would you like to add a new character to the game? (y/n)"; 28 | return (getUserInput(question).toLowerCase().startsWith("y")); 29 | } 30 | 31 | @Override 32 | public boolean endTheGame() { 33 | String question = "Would you like to end the game? (y/n)"; 34 | return (getUserInput(question).toLowerCase().startsWith("y")); 35 | } 36 | 37 | private String getUserInput(String question) { 38 | String answer = null; 39 | System.out.println(question); 40 | BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 41 | try { 42 | answer = in.readLine(); 43 | } catch (IOException e) { 44 | System.out.println("IO error!"); 45 | } 46 | if (answer==null){ 47 | return "no"; 48 | } 49 | return answer; 50 | } 51 | //..more methods 52 | } 53 | -------------------------------------------------------------------------------- /15_IteratorPattern/IteratorPattern/Diagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/15_IteratorPattern/IteratorPattern/Diagram.jpg -------------------------------------------------------------------------------- /15_IteratorPattern/IteratorPattern/README.md: -------------------------------------------------------------------------------- 1 | # The Iterator design pattern: 2 | It enables us to encapsulate all different loops which are decoupled from the nature of our collection (inventories using Array, ArrayList, HashMap , ...) 3 | 4 | > Merging two Inventories DevStoreCatalog & GeekyStoreCatalog which use Array & ArrayList 5 | > How to iterate on two different structures and scale that up and not repeating ourselves 6 | -------------------------------------------------------------------------------- /15_IteratorPattern/IteratorPattern/figure.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/15_IteratorPattern/IteratorPattern/figure.jpg -------------------------------------------------------------------------------- /15_IteratorPattern/IteratorPattern/figure1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/15_IteratorPattern/IteratorPattern/figure1.jpg -------------------------------------------------------------------------------- /15_IteratorPattern/IteratorPattern/src/com/java/course/Catalog/DevStoreCatalog.java: -------------------------------------------------------------------------------- 1 | package com.java.course.Catalog; 2 | 3 | import com.java.course.iterator.DevStoreIterator; 4 | import com.java.course.iterator.ICatalog; 5 | import com.java.course.iterator.Iterator; 6 | import com.java.course.model.Product; 7 | 8 | public class DevStoreCatalog implements ICatalog { 9 | private static final int MAX_ITEMS=4; 10 | private int numberOfProducts=0; 11 | private Product[] catalog; 12 | 13 | 14 | //Helper method 15 | public void addItem(String name, String description, double price){ 16 | Product product = new Product(name, description, price); 17 | if (numberOfProducts>= MAX_ITEMS){ 18 | System.out.println("Catalog list is full - can't add products."); 19 | }else { 20 | catalog[numberOfProducts] = product; 21 | numberOfProducts++; 22 | } 23 | } 24 | 25 | public DevStoreCatalog() { 26 | catalog = new Product[MAX_ITEMS]; 27 | addItem("C++ is not DEAD yet!","T-shirt",39.99); 28 | addItem("Java rocks, yes","Silky mouse-pad",19.99); 29 | addItem("Java Design pattern","Book - A must",39.99); 30 | addItem("Web development cookbook","The best development dev cookbook - 2018",58.99); 31 | } 32 | //NO NEED FOR getCatalog() since we return an iterator (getDevStoreIterator)! 33 | /*public Product[] getCatalog() {return catalog;}*/ 34 | private Iterator getDevStoreIterator(){ 35 | return new DevStoreIterator(catalog); 36 | } 37 | 38 | @Override 39 | public Iterator getIterator() { 40 | return this.getDevStoreIterator(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /15_IteratorPattern/IteratorPattern/src/com/java/course/Catalog/GeekyStoreCatalog.java: -------------------------------------------------------------------------------- 1 | package com.java.course.Catalog; 2 | 3 | import com.java.course.iterator.GeekyStoreIterator; 4 | import com.java.course.iterator.ICatalog; 5 | import com.java.course.iterator.Iterator; 6 | import com.java.course.model.Product; 7 | import java.util.ArrayList; 8 | 9 | public class GeekyStoreCatalog implements ICatalog { 10 | private ArrayList catalog; 11 | 12 | 13 | 14 | public GeekyStoreCatalog() { 15 | catalog = new ArrayList(); 16 | addItem("Superman Comic","The best in town",12.99); 17 | addItem("Batman Comic","Okay, but still good ",9.99); 18 | addItem("Star wars","Can't live without it",14.67); 19 | addItem("Jedi T-shirt","Gotta Have it",13.79); 20 | } 21 | public void addItem(String name, String description, double price){ 22 | Product product = new Product(name, description, price); 23 | catalog.add(product); 24 | } 25 | //NO NEED FOR getCatalog() since we return an iterator (GetGeekyStoreIterator)! 26 | /*public ArrayList getCatalog() {return catalog;}*/ 27 | private Iterator GetGeekyStoreIterator(){ 28 | return new GeekyStoreIterator(catalog); 29 | } 30 | 31 | @Override 32 | public Iterator getIterator() { 33 | return this.GetGeekyStoreIterator(); 34 | } 35 | } 36 | 37 | 38 | -------------------------------------------------------------------------------- /15_IteratorPattern/IteratorPattern/src/com/java/course/Catalog/Seller.java: -------------------------------------------------------------------------------- 1 | package com.java.course.Catalog; 2 | 3 | import com.java.course.iterator.ICatalog; 4 | import com.java.course.iterator.Iterator; 5 | import com.java.course.model.Product; 6 | 7 | /* 8 | * Client = seller doesn't need to know how the data is been saved or where it comes from 9 | * the seller knows only which catalog to display but not how to display it! 10 | * */ 11 | public class Seller implements ICatalog { 12 | private ICatalog geekyStoreCatalog; 13 | private ICatalog devStoreCatalog; 14 | 15 | public Seller(GeekyStoreCatalog geekyStoreCatalog, DevStoreCatalog devStoreCatalog) { 16 | this.geekyStoreCatalog = geekyStoreCatalog; 17 | this.devStoreCatalog = devStoreCatalog; 18 | } 19 | 20 | public void printCatalog(){ 21 | System.out.println("printing catalog: "); 22 | printCatalog(devStoreCatalog.getIterator()); 23 | printCatalog( geekyStoreCatalog.getIterator()); 24 | } 25 | private void printCatalog(Iterator iterator){ 26 | System.out.println("==================================================="); 27 | while ( iterator.hasNext()){ 28 | Product product = iterator.next(); 29 | System.out.print(product.getName() +" "); 30 | System.out.print(product.getDescription() + " "); 31 | System.out.print(product.getPrice() + " \n"); 32 | } 33 | } 34 | 35 | @Override 36 | public Iterator getIterator() { 37 | return null; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /15_IteratorPattern/IteratorPattern/src/com/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | import com.java.course.Catalog.DevStoreCatalog; 4 | import com.java.course.Catalog.GeekyStoreCatalog; 5 | import com.java.course.Catalog.Seller; 6 | import com.java.course.model.Product; 7 | 8 | public class Main { 9 | 10 | public static void main(String[] args) { 11 | //Merging two Inventories DevStoreCatalog & GeekyStoreCatalog 12 | //solution one: not optimal if adding add type of collection say 'HashMap' than we have to handle again 13 | //the iteration over the inventory -> hence the use of the iterator 14 | 15 | DevStoreCatalog devStoreCatalog = new DevStoreCatalog(); 16 | //Product[] devCatalog= devStoreCatalog.getCatalog(); 17 | 18 | 19 | GeekyStoreCatalog geekyStoreCatalog = new GeekyStoreCatalog(); 20 | //ArrayList geekyCatalog = geekyStoreCatalog.getCatalog(); 21 | 22 | 23 | /* for (int i = 0; i iterator) { 54 | System.out.println("==================================================="); 55 | while ( iterator.hasNext()){ 56 | Product product = iterator.next(); 57 | System.out.print(product.getName() +" "); 58 | System.out.print(product.getDescription() + " "); 59 | System.out.print(product.getPrice() + " \n"); 60 | } 61 | }*/ 62 | 63 | //Solution two: using iterator 64 | //iterator enables us to encapsulate all different loops which are coupled with the nature of our inventory list. 65 | /*private static void printInventory(Iterator iterator) { 66 | System.out.println("==================================================="); 67 | while ( iterator.hasNext()){ 68 | Product product = iterator.next(); 69 | System.out.print(product.getName() +" "); 70 | System.out.print(product.getDescription() + " "); 71 | System.out.print(product.getPrice() + " \n"); 72 | } 73 | }*/ 74 | } 75 | -------------------------------------------------------------------------------- /15_IteratorPattern/IteratorPattern/src/com/java/course/iterator/DevStoreIterator.java: -------------------------------------------------------------------------------- 1 | package com.java.course.iterator; 2 | import com.java.course.model.Product; 3 | 4 | public class DevStoreIterator implements Iterator { 5 | private Product[] catalog; 6 | private int position = 0; 7 | 8 | public DevStoreIterator(Product[] catalog) { 9 | this.catalog = catalog; 10 | } 11 | 12 | @Override 13 | public boolean hasNext() {return !(position>=catalog.length || catalog[position] == null);} 14 | 15 | @Override 16 | public Product next() { 17 | position++; 18 | return catalog[position-1]; 19 | } 20 | 21 | @Override 22 | public void remove() { 23 | if (position<=0){ 24 | throw new IllegalStateException("Can't remove an item until you've done at least one next()"); 25 | }else { 26 | if (catalog[position-1] == null){ 27 | for (int i = position-1; i { 7 | private ArrayList catalog; 8 | private int position = 0; 9 | 10 | public GeekyStoreIterator(ArrayList catalog) { 11 | this.catalog = catalog; 12 | } 13 | 14 | @Override 15 | public boolean hasNext() { return !(position>=catalog.size()|| catalog.get(position) == null);} 16 | 17 | @Override 18 | public Product next() { 19 | position++; 20 | return catalog.get(position-1);} 21 | 22 | @Override 23 | public void remove() { 24 | if (position<=0){ 25 | throw new IllegalStateException("Can't remove an item until you've done at least one next()"); 26 | }else { 27 | catalog.remove(position); 28 | } 29 | } 30 | } 31 | 32 | -------------------------------------------------------------------------------- /15_IteratorPattern/IteratorPattern/src/com/java/course/iterator/ICatalog.java: -------------------------------------------------------------------------------- 1 | package com.java.course.iterator; 2 | 3 | public interface ICatalog { 4 | public Iterator getIterator(); 5 | } 6 | -------------------------------------------------------------------------------- /15_IteratorPattern/IteratorPattern/src/com/java/course/iterator/Iterator.java: -------------------------------------------------------------------------------- 1 | package com.java.course.iterator; 2 | public interface Iterator { 3 | boolean hasNext(); 4 | T next(); 5 | void remove(); 6 | } 7 | -------------------------------------------------------------------------------- /15_IteratorPattern/IteratorPattern/src/com/java/course/model/Product.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | public class Product { 4 | private String name; 5 | private String description; 6 | private double price; 7 | 8 | public Product(String name, String description, double price) { 9 | this.name = name; 10 | this.description = description; 11 | this.price = price; 12 | } 13 | 14 | public String getName() { 15 | return name; 16 | } 17 | 18 | public String getDescription() { 19 | return description; 20 | } 21 | 22 | public double getPrice() { 23 | return price; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /16_StatePattern/StatePattern/Diagram1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/16_StatePattern/StatePattern/Diagram1.jpg -------------------------------------------------------------------------------- /16_StatePattern/StatePattern/Diagram2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/16_StatePattern/StatePattern/Diagram2.jpg -------------------------------------------------------------------------------- /16_StatePattern/StatePattern/README.md: -------------------------------------------------------------------------------- 1 | # The State design pattern: 2 | It allows an object to alter its behaviour when its internal state changes. The object will appear to change its class. 3 | 4 | ##### Case of soda vending machine: 5 | - Obvious solution: 6 | * Create a SodaMachine Class 7 | * Create If/Switch Statement for each state and respond accordingly 8 | * It's not a flexible solution when a new state or spec altered (e.g. give a soda for free for every 10 bought soda) then we have to change all our code. 9 | -------------------------------------------------------------------------------- /16_StatePattern/StatePattern/figure.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/16_StatePattern/StatePattern/figure.jpg -------------------------------------------------------------------------------- /16_StatePattern/StatePattern/figure2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/16_StatePattern/StatePattern/figure2.jpg -------------------------------------------------------------------------------- /16_StatePattern/StatePattern/src/com/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | import com.java.course.model.SodaMachine; 3 | 4 | public class Main { 5 | public static void main(String[] args) { 6 | SodaMachine sodaMachine = new SodaMachine(10); 7 | sodaMachine.insertMoney(); 8 | sodaMachine.select(); 9 | sodaMachine.dispense(); 10 | System.out.println("Inventory: " + sodaMachine.getCount()); 11 | System.out.println("========================="); 12 | sodaMachine.insertMoney(); 13 | sodaMachine.ejectMoney(); 14 | sodaMachine.select(); 15 | System.out.println("Inventory: " + sodaMachine.getCount()); 16 | System.out.println("========================="); 17 | sodaMachine.insertMoney(); 18 | sodaMachine.select(); 19 | sodaMachine.dispense(); 20 | sodaMachine.ejectMoney(); 21 | System.out.println("Inventory: " + sodaMachine.getCount()); 22 | System.out.println("========================="); 23 | sodaMachine.ejectMoney(); 24 | sodaMachine.insertMoney(); 25 | sodaMachine.select(); 26 | sodaMachine.ejectMoney(); 27 | sodaMachine.dispense(); 28 | System.out.println("Inventory: " + sodaMachine.getCount()); 29 | 30 | 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /16_StatePattern/StatePattern/src/com/java/course/model/SodaMachine.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | public class SodaMachine { 4 | //states 5 | final static int SOLD_OUT = 0; 6 | final static int NO_MONEY = 1; 7 | final static int HAS_MONEY = 2; 8 | final static int SOLD = 3; 9 | int state = SOLD_OUT; 10 | 11 | public int getCount() { 12 | return count; 13 | } 14 | 15 | //count how many soda available 16 | int count= 0; 17 | 18 | public SodaMachine(int count) { 19 | this.count = count; 20 | if (count>0){ 21 | state=NO_MONEY; 22 | System.out.println("Welcome to our Soda vending machine"); 23 | System.out.println(count + " Sodas available in inventory"); 24 | System.out.println("Insert a dollar to get started ..."); 25 | } 26 | } 27 | //Actions 28 | public void insertMoney(){ 29 | switch (state){ 30 | case HAS_MONEY: 31 | System.out.println("you can't insert another dollar bill"); 32 | break; 33 | case NO_MONEY: 34 | state=HAS_MONEY; 35 | System.out.println("you inserted a dollar"); 36 | break; 37 | case SOLD_OUT: 38 | System.out.println("the machine is sold out."); 39 | break; 40 | case SOLD: 41 | System.out.println("Please wait we already preparing your soda."); 42 | break; 43 | default: 44 | } 45 | } 46 | public void ejectMoney(){ 47 | switch (state){ 48 | case HAS_MONEY: 49 | System.out.println("Returning a dollar bill"); 50 | state=NO_MONEY; 51 | break; 52 | case NO_MONEY: 53 | System.out.println("you haven't inserted a dollar"); 54 | break; 55 | case SOLD_OUT: 56 | System.out.println("the machine is sold out."); 57 | break; 58 | case SOLD: 59 | System.out.println("You've already selected a soda!"); 60 | break; 61 | default: 62 | } 63 | } 64 | public void select(){ 65 | switch (state){ 66 | case HAS_MONEY: 67 | System.out.println("You selected a Soda!"); 68 | state=SOLD; 69 | break; 70 | case NO_MONEY: 71 | System.out.println("Please insert a dollar!"); 72 | break; 73 | case SOLD_OUT: 74 | System.out.println("the machine is sold out."); 75 | break; 76 | case SOLD: 77 | System.out.println("Dispensing a soda...enjoy!"); 78 | break; 79 | default: 80 | } 81 | 82 | } 83 | //Or distribute 84 | public void dispense(){ 85 | switch (state){ 86 | case HAS_MONEY: 87 | System.out.println("No soda dispensed"); 88 | break; 89 | case NO_MONEY: 90 | System.out.println("Please insert a dollar"); 91 | break; 92 | case SOLD_OUT: 93 | System.out.println("the machine is sold out."); 94 | break; 95 | case SOLD: 96 | System.out.println("Dispensing a soda...enjoy!"); 97 | count--; 98 | if (count == 0) { 99 | System.out.println("the machine is sold out."); 100 | state=SOLD_OUT; 101 | } else state=NO_MONEY; 102 | break; 103 | default: 104 | } 105 | 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /17_StatePatternSolution/StatePatternSolution/Diagram1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/17_StatePatternSolution/StatePatternSolution/Diagram1.jpg -------------------------------------------------------------------------------- /17_StatePatternSolution/StatePatternSolution/Diagram2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/17_StatePatternSolution/StatePatternSolution/Diagram2.jpg -------------------------------------------------------------------------------- /17_StatePatternSolution/StatePatternSolution/README.md: -------------------------------------------------------------------------------- 1 | # The State design pattern: 2 | It allows an object to alter its behaviour when its internal state changes. The object will appear to change its class. 3 | 4 | ##### Case of soda vending machine: 5 | - Obvious solution: 6 | * Create a SodaMachine Class 7 | * Create If/Switch Statement for each state and respond accordingly 8 | * It's not a flexible solution when a new state or spec altered (e.g. give a soda for free for every 10 bought soda) then we have to change all our code. 9 | -------------------------------------------------------------------------------- /17_StatePatternSolution/StatePatternSolution/figure.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/17_StatePatternSolution/StatePatternSolution/figure.jpg -------------------------------------------------------------------------------- /17_StatePatternSolution/StatePatternSolution/figure2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/17_StatePatternSolution/StatePatternSolution/figure2.jpg -------------------------------------------------------------------------------- /17_StatePatternSolution/StatePatternSolution/src/com/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | import com.java.course.model.SodaVendingMachine; 4 | 5 | public class Main { 6 | 7 | public static void main(String[] args) { 8 | SodaVendingMachine sodaVendingMachine = new SodaVendingMachine(10); 9 | System.out.println(sodaVendingMachine); 10 | System.out.println("======================="); 11 | 12 | sodaVendingMachine.insertMoney(); 13 | sodaVendingMachine.select(); 14 | System.out.println(sodaVendingMachine); 15 | System.out.println("======================="); 16 | 17 | sodaVendingMachine.insertMoney(); 18 | sodaVendingMachine.select(); 19 | System.out.println("======================="); 20 | 21 | sodaVendingMachine.insertMoney(); 22 | sodaVendingMachine.select(); 23 | System.out.println(sodaVendingMachine); 24 | System.out.println("======================="); 25 | 26 | 27 | 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /17_StatePatternSolution/StatePatternSolution/src/com/java/course/model/HasMoneyState.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | public class HasMoneyState implements IState{ 4 | private SodaVendingMachine sodaVendingMachine; 5 | 6 | public HasMoneyState(SodaVendingMachine sodaVendingMachine) { 7 | this.sodaVendingMachine = sodaVendingMachine; 8 | } 9 | 10 | @Override 11 | public void insertMoney() { 12 | System.out.println("No need to insert a dollar"); 13 | } 14 | 15 | @Override 16 | public void ejectMoney() { 17 | System.out.println("Returning a dollar"); 18 | sodaVendingMachine.setState(sodaVendingMachine.getNoMoneyState()); 19 | } 20 | 21 | @Override 22 | public void select() { 23 | System.out.println("selected item..."); 24 | sodaVendingMachine.setState(sodaVendingMachine.getSoldState()); 25 | sodaVendingMachine.setCount(sodaVendingMachine.getCount()-1); 26 | } 27 | 28 | @Override 29 | public void dispense() { 30 | System.out.println("No soda dispensed..."); 31 | } 32 | 33 | @Override 34 | public String toString() { 35 | return "Waiting for a new selection..."; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /17_StatePatternSolution/StatePatternSolution/src/com/java/course/model/IState.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | public interface IState { 4 | void insertMoney(); 5 | void ejectMoney(); 6 | void select(); 7 | void dispense(); 8 | } 9 | -------------------------------------------------------------------------------- /17_StatePatternSolution/StatePatternSolution/src/com/java/course/model/NoMoneyState.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | public class NoMoneyState implements IState{ 4 | private SodaVendingMachine sodaVendingMachine; 5 | 6 | public NoMoneyState(SodaVendingMachine sodaVendingMachine) { 7 | this.sodaVendingMachine = sodaVendingMachine; 8 | } 9 | 10 | @Override 11 | public void insertMoney() { 12 | System.out.println("You inserted a dollar"); 13 | sodaVendingMachine.setState(sodaVendingMachine.getHasMoneyState()); 14 | } 15 | 16 | @Override 17 | public void ejectMoney() { 18 | System.out.println("you haven't inserted a dollar"); 19 | } 20 | 21 | @Override 22 | public void select() { 23 | System.out.println("Your selected but there is no money"); 24 | } 25 | 26 | @Override 27 | public void dispense() { 28 | System.out.println("Pay me first buddy!"); 29 | } 30 | 31 | @Override 32 | public String toString() { 33 | return "waiting for a dollar..."; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /17_StatePatternSolution/StatePatternSolution/src/com/java/course/model/SodaVendingMachine.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | public class SodaVendingMachine { 4 | private IState soldOutState; 5 | private IState noMoneyState; 6 | private IState hasMoneyState; 7 | private IState soldState; 8 | 9 | private IState state = soldOutState; 10 | private int count= 0; 11 | 12 | public SodaVendingMachine(int numberOfSodas) { 13 | this.hasMoneyState = new HasMoneyState(this); 14 | this.noMoneyState = new NoMoneyState(this); 15 | this.soldOutState = new SoldOutState(this); 16 | this.soldState = new SoldState(this); 17 | this.count = numberOfSodas; 18 | if (numberOfSodas>0){ 19 | state = noMoneyState; 20 | System.out.println("Welcome to our Soda vending machine"); 21 | System.out.println(count + " Sodas available in inventory"); 22 | System.out.println("Insert a dollar to get started ..."); 23 | } 24 | } 25 | 26 | public void insertMoney() { 27 | state.insertMoney(); 28 | } 29 | 30 | public void ejectMoney() { 31 | state.ejectMoney(); 32 | } 33 | 34 | public void select() { 35 | state.select(); 36 | } 37 | 38 | public void dispense() { 39 | state.dispense(); 40 | } 41 | 42 | public IState getSoldOutState() { 43 | return soldOutState; 44 | } 45 | 46 | public void setSoldOutState(IState soldOutState) { 47 | this.soldOutState = soldOutState; 48 | } 49 | 50 | public IState getNoMoneyState() { 51 | return noMoneyState; 52 | } 53 | 54 | public void setNoMoneyState(IState noMoneyState) { 55 | this.noMoneyState = noMoneyState; 56 | } 57 | 58 | public IState getHasMoneyState() { 59 | return hasMoneyState; 60 | } 61 | 62 | public void setHasMoneyState(IState hasMoneyState) { 63 | this.hasMoneyState = hasMoneyState; 64 | } 65 | 66 | public IState getSoldState() { 67 | return soldState; 68 | } 69 | 70 | public void setSoldState(IState soldState) { 71 | this.soldState = soldState; 72 | } 73 | 74 | public IState getState() { 75 | return state; 76 | } 77 | 78 | public void setState(IState state) { 79 | this.state = state; 80 | } 81 | 82 | public void setCount(int count) { 83 | this.count = count; 84 | } 85 | 86 | public int getCount() { 87 | return count; 88 | } 89 | 90 | @Override 91 | public String toString() { 92 | StringBuffer result = new StringBuffer(); 93 | result.append("\nThe soda machine, co"); 94 | result.append("\nInventory: "+count+ " soda"); 95 | if (count !=1){ 96 | result.append("s"); 97 | } 98 | result.append("\nSoda vending machine is "+state+"\n"); 99 | return result.toString(); 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /17_StatePatternSolution/StatePatternSolution/src/com/java/course/model/SoldOutState.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | public class SoldOutState implements IState{ 4 | private SodaVendingMachine sodaVendingMachine; 5 | 6 | public SoldOutState(SodaVendingMachine sodaVendingMachine) { 7 | this.sodaVendingMachine = sodaVendingMachine; 8 | } 9 | 10 | @Override 11 | public void insertMoney() { 12 | System.out.println("machine sold out"); 13 | } 14 | 15 | @Override 16 | public void ejectMoney() { 17 | System.out.println("insert money before ejecting"); 18 | 19 | } 20 | 21 | @Override 22 | public void select() { 23 | System.out.println("No soda available"); 24 | } 25 | 26 | @Override 27 | public void dispense() { 28 | System.out.println("Sold out!"); 29 | } 30 | 31 | @Override 32 | public String toString() { 33 | return "Sold out!"; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /17_StatePatternSolution/StatePatternSolution/src/com/java/course/model/SoldState.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | public class SoldState implements IState { 4 | private SodaVendingMachine sodaVendingMachine; 5 | 6 | public SoldState(SodaVendingMachine sodaVendingMachine) { 7 | this.sodaVendingMachine = sodaVendingMachine; 8 | } 9 | 10 | @Override 11 | public void insertMoney() { 12 | System.out.println("give a second soda coming right up"); 13 | 14 | } 15 | 16 | @Override 17 | public void ejectMoney() { 18 | System.out.println("Nope... you can't eject the money if you already have the soda"); 19 | } 20 | 21 | @Override 22 | public void select() { 23 | System.out.println("sorry the soda is coming!"); 24 | sodaVendingMachine.setCount(sodaVendingMachine.getCount()-1); 25 | } 26 | 27 | @Override 28 | public void dispense() { 29 | System.out.println("Stop trying to get a second soda for free"); 30 | if (sodaVendingMachine.getCount()>0){ 31 | sodaVendingMachine.setState(sodaVendingMachine.getNoMoneyState()); 32 | }else{ 33 | System.out.println("Sorry... out of soda!"); 34 | sodaVendingMachine.setState(sodaVendingMachine.getSoldOutState()); 35 | } 36 | } 37 | 38 | @Override 39 | public String toString() { 40 | return "Dispensing soda"; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /18_ProxyPattern/ProxyPattern/Diagram1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/18_ProxyPattern/ProxyPattern/Diagram1.jpg -------------------------------------------------------------------------------- /18_ProxyPattern/ProxyPattern/Diagram2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/18_ProxyPattern/ProxyPattern/Diagram2.jpg -------------------------------------------------------------------------------- /18_ProxyPattern/ProxyPattern/figure1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/18_ProxyPattern/ProxyPattern/figure1.jpg -------------------------------------------------------------------------------- /18_ProxyPattern/ProxyPattern/figure2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/18_ProxyPattern/ProxyPattern/figure2.jpg -------------------------------------------------------------------------------- /18_ProxyPattern/ProxyPattern/figure3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/18_ProxyPattern/ProxyPattern/figure3.jpg -------------------------------------------------------------------------------- /18_ProxyPattern/ProxyPattern/src/com/java/course/IBank.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public interface IBank { 4 | void withdrawMoney(String clientName) throws Exception; 5 | } 6 | -------------------------------------------------------------------------------- /18_ProxyPattern/ProxyPattern/src/com/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public class Main { 4 | 5 | public static void main(String[] args) { 6 | IBank bank = new ProxyBank(); 7 | try { 8 | bank.withdrawMoney("kejeiri"); 9 | bank.withdrawMoney("me@me"); 10 | } catch (Exception e) { 11 | System.out.println(e.getMessage()); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /18_ProxyPattern/ProxyPattern/src/com/java/course/ProxyBank.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | import java.util.ArrayList; 4 | /* 5 | * Remote proxy will make sure nobody is getting money directly from the bank 6 | * Proxy is linked to the bank through composition 7 | * */ 8 | public class ProxyBank implements IBank{ 9 | //no direct access from the client to the real bank, ProxyBank or surrogate(ATM) will manage this instead 10 | private RealBank bank = new RealBank(); 11 | //background security check 12 | private static ArrayList bannedClient = new ArrayList<>(); 13 | //some business logic such checking if the client is banned! 14 | static{ 15 | bannedClient.add("xxcs"); 16 | bannedClient.add("me@me"); 17 | bannedClient.add("@xmil.com"); 18 | } 19 | 20 | 21 | @Override 22 | public void withdrawMoney(String clientName) throws Exception { 23 | if (bannedClient.contains(clientName.toLowerCase())) 24 | { 25 | throw new Exception("Access denied for " + clientName); 26 | } 27 | bank.withdrawMoney(clientName); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /18_ProxyPattern/ProxyPattern/src/com/java/course/RealBank.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | import java.util.ArrayList; 4 | 5 | public class RealBank implements IBank{ 6 | @Override 7 | public void withdrawMoney(String clientName) throws Exception { 8 | System.out.println(clientName + " is withdrawing from ATM..."); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /19_MVCDesignPattern/MVCDesignPattern/README.md: -------------------------------------------------------------------------------- 1 | # Creating payroll system 2 | [![N|Picture](./figure1.jpg)] 3 | A lot of components to build a system in place, e.g. Employee EmployeeDashboard, EmployeeController, ... 4 | The idea of MVC is look at the components that are compartmentalize or separating responsibilities (model/entiies, dashboard, controller ...) 5 | 6 | MVC will compartmentalize the code into a different categories: 7 | - Employee -> Model 8 | - EmployeeDashboard -> View that admin could use to manage the employees 9 | - EmployeeController -> Controller which act as a connector between the Employee model and EmployeeController. 10 | 11 | > Controller has instance of Employee and EmployeeDashboard. 12 | 13 | MVC uses other design patterns (compound design patterns!): 14 | - EmployeeController & EmployeeDashboard are observers: they will be notified when the state change in the model 15 | - EmployeeController & EmployeeDashboard use the stategy design pattern: the EmployeeDashboard(view) delegates the controller to hanlde certain actions and the controller need to know which actions need to be done 16 | 17 | as a reminder **strategy design pattern** allows us to create different algorithms/actions our classes at runtime. 18 | [![N|Picture](./figure2.jpg)] -------------------------------------------------------------------------------- /19_MVCDesignPattern/MVCDesignPattern/figure1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/19_MVCDesignPattern/MVCDesignPattern/figure1.jpg -------------------------------------------------------------------------------- /19_MVCDesignPattern/MVCDesignPattern/figure2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/19_MVCDesignPattern/MVCDesignPattern/figure2.jpg -------------------------------------------------------------------------------- /19_MVCDesignPattern/MVCDesignPattern/figure3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/19_MVCDesignPattern/MVCDesignPattern/figure3.jpg -------------------------------------------------------------------------------- /19_MVCDesignPattern/MVCDesignPattern/src/com/kejeiri/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course; 2 | 3 | import com.kejeiri.java.course.controller.EmployeeController; 4 | import com.kejeiri.java.course.model.Employee; 5 | import com.kejeiri.java.course.view.EmployeeDashboard; 6 | 7 | public class Main { 8 | 9 | public static void main(String[] args) { 10 | Employee employee =retrieveEmployeeFromServer(); 11 | //Create our view to which we will write our employee info into 12 | 13 | EmployeeDashboard view= new EmployeeDashboard(); 14 | 15 | //Create our controller 16 | EmployeeController controller = new EmployeeController(employee, view); 17 | controller.updateDashboardView(); 18 | } 19 | 20 | //simulate a call to a server 21 | public static Employee retrieveEmployeeFromServer(){ 22 | Employee employee = new Employee(); 23 | employee.setLastName("kejeiri"); 24 | employee.setFirstName("mohamed"); 25 | employee.setSsNumber("12445"); 26 | employee.setSalary(4000.60); 27 | return employee; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /19_MVCDesignPattern/MVCDesignPattern/src/com/kejeiri/java/course/controller/EmployeeController.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.controller; 2 | 3 | import com.kejeiri.java.course.model.Employee; 4 | import com.kejeiri.java.course.view.EmployeeDashboard; 5 | 6 | public class EmployeeController { 7 | private Employee employeeModel; 8 | private EmployeeDashboard view; 9 | 10 | public EmployeeController(Employee employeeModel, EmployeeDashboard view) { 11 | this.employeeModel = employeeModel; 12 | this.view = view; 13 | } 14 | 15 | public void setEmployee(String firstName, String lastName) { 16 | employeeModel.setFirstName(firstName); 17 | employeeModel.setLastName(lastName); 18 | } 19 | public String getEmployeeName(){return employeeModel.getFirstName()+" "+employeeModel.getLastName();} 20 | public void setSsNumber(String ssn) {employeeModel.setSsNumber(ssn);} 21 | public String getSsn(){return employeeModel.getSsNumber();} 22 | //update our view 23 | public void updateDashboardView(){view.printEmployeeInfo(employeeModel);} 24 | } 25 | 26 | -------------------------------------------------------------------------------- /19_MVCDesignPattern/MVCDesignPattern/src/com/kejeiri/java/course/model/Employee.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.model; 2 | 3 | public class Employee { 4 | private String firstName; 5 | private String lastName; 6 | private String ssNumber; 7 | private double salary; 8 | 9 | public double getSalary() { 10 | return salary; 11 | } 12 | 13 | public void setSalary(double salary) { 14 | this.salary = salary; 15 | } 16 | 17 | public String getFirstName() { 18 | return firstName; 19 | } 20 | 21 | public void setFirstName(String firstName) { 22 | this.firstName = firstName; 23 | } 24 | 25 | public String getLastName() { 26 | return lastName; 27 | } 28 | 29 | public void setLastName(String lastName) { 30 | this.lastName = lastName; 31 | } 32 | 33 | public String getSsNumber() { 34 | return ssNumber; 35 | } 36 | 37 | public void setSsNumber(String ssNumber) { 38 | this.ssNumber = ssNumber; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /19_MVCDesignPattern/MVCDesignPattern/src/com/kejeiri/java/course/view/EmployeeDashboard.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.view; 2 | 3 | import com.kejeiri.java.course.model.Employee; 4 | 5 | public class EmployeeDashboard { 6 | public void printEmployeeInfo(Employee employee){ 7 | System.out.println("FirstName: "+employee.getFirstName()); 8 | System.out.println("LastName: "+employee.getLastName()); 9 | System.out.println("SS number: "+employee.getSsNumber()); 10 | System.out.println("Salary: "+employee.getSalary()); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /20_BuilderDesignPattern/BuilderDesignPattern/src/com/kejeiri/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course; 2 | 3 | public class Main { 4 | 5 | public static void main(String[] args) { 6 | User user = new User.UserBuilder("Mohamed","kejeiri") 7 | .age(40) 8 | .address("Brussels") 9 | .phone("+34545477888") 10 | .build(); 11 | System.out.println(user); 12 | 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /20_BuilderDesignPattern/BuilderDesignPattern/src/com/kejeiri/java/course/User.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course; 2 | 3 | public class User { 4 | private final String firstName; 5 | private final String lastName; 6 | private final int age; 7 | private final String address; 8 | private final String phone; 9 | 10 | public User(UserBuilder builder) { 11 | this.firstName = builder.firstName; 12 | this.lastName = builder.lastName; 13 | this.age = builder.age; 14 | this.address = builder.address; 15 | this.phone = builder.phone; 16 | } 17 | @Override 18 | public String toString() { 19 | return "Name: " + firstName +" "+lastName + "\nage:" + age + ", address: " +address + ", phone: "+phone ; 20 | } 21 | public static class UserBuilder{ 22 | private final String firstName; 23 | private final String lastName; 24 | private int age; 25 | private String address; 26 | private String phone; 27 | 28 | 29 | 30 | public UserBuilder(String firstName, String lastName) { 31 | this.firstName = firstName; 32 | this.lastName = lastName; 33 | } 34 | 35 | public UserBuilder age (int age) { 36 | this.age = age; 37 | return this; 38 | } 39 | 40 | public UserBuilder address(String address) { 41 | this.address = address; 42 | return this; 43 | } 44 | public UserBuilder phone (String phone) { 45 | this.phone = phone; 46 | return this; 47 | } 48 | public User build() { 49 | return new User(this); 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /21_BuilderInterfaceDesignPattern/BuilderInterfaceDesignPattern/src/com/kejeiri/java/course/IPerson.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course; 2 | 3 | public interface IPerson { 4 | String getFirstName(); 5 | String getLastName(); 6 | String getPhone(); 7 | int getAge(); 8 | String getAddress(); 9 | 10 | class DefautlPerson implements IPerson{ 11 | //Required parameters 12 | private final String firstName; 13 | private final String lastName; 14 | 15 | //optional parameters 16 | protected int age; 17 | protected String phone; 18 | protected String address; 19 | 20 | protected DefautlPerson(Builder builder) { 21 | this(builder.getFirstName(), builder.getLastName()); 22 | this.address = builder.getAddress(); 23 | this.age = builder.getAge(); 24 | this.phone=builder.getPhone(); 25 | } 26 | 27 | private DefautlPerson(String firstName, String lastName) { 28 | this.firstName=firstName; 29 | this.lastName=lastName; 30 | } 31 | 32 | @Override 33 | public String getFirstName() { 34 | return firstName; 35 | } 36 | 37 | @Override 38 | public String toString() { 39 | return "Name: "+firstName+" "+lastName+",age: "+age+" ,address: "+address+" ,phone: "+phone; 40 | } 41 | 42 | @Override 43 | public String getLastName() { 44 | return lastName; 45 | } 46 | 47 | @Override 48 | public String getPhone() { 49 | return phone; 50 | } 51 | 52 | @Override 53 | public int getAge() { 54 | return age; 55 | } 56 | 57 | @Override 58 | public String getAddress() { 59 | return address; 60 | } 61 | } 62 | //Inner class of the interface 63 | class Builder extends DefautlPerson{ 64 | public Builder(String firstName, String lastName) { 65 | super(firstName,lastName); 66 | } 67 | 68 | public Builder age(int age){ 69 | this.age = age; 70 | return this; 71 | } 72 | 73 | public Builder phone (String phone){ 74 | this.phone=phone; 75 | return this; 76 | } 77 | public Builder address (String address){ 78 | this.address=address; 79 | return this; 80 | } 81 | IPerson build(){ 82 | return new DefautlPerson(this); 83 | } 84 | } 85 | 86 | 87 | } 88 | -------------------------------------------------------------------------------- /21_BuilderInterfaceDesignPattern/BuilderInterfaceDesignPattern/src/com/kejeiri/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course; 2 | 3 | public class Main { 4 | 5 | public static void main(String[] args) { 6 | IPerson person = new IPerson.Builder("mohamed","kejeiri") 7 | .age(34) 8 | .address("Brussels") 9 | .phone("003469898") 10 | .build(); 11 | 12 | System.out.println(person); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /22_PrototypeDesignPattern/PrototypeDesignPattern/README.md: -------------------------------------------------------------------------------- 1 | # Prototype design pattern 2 | [![N|Picture](./figure1.jpg)] 3 | 4 | used when creating an instance of a given class is either exprensive or complicated 5 | 6 | - It's really exprensive to create an object 7 | - also performing transactions on remote persistant DB object is exprensive 8 | 9 | [![N|Picture](./figure2.jpg)] -------------------------------------------------------------------------------- /22_PrototypeDesignPattern/PrototypeDesignPattern/figure1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/22_PrototypeDesignPattern/PrototypeDesignPattern/figure1.jpg -------------------------------------------------------------------------------- /22_PrototypeDesignPattern/PrototypeDesignPattern/figure2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/22_PrototypeDesignPattern/PrototypeDesignPattern/figure2.jpg -------------------------------------------------------------------------------- /22_PrototypeDesignPattern/PrototypeDesignPattern/src/com/java/course/Dolphin.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public class Dolphin implements IPrototype{ 4 | private String name; 5 | private int age; 6 | 7 | public Dolphin(String name, int age) { 8 | this.name = name; 9 | this.age = age; 10 | } 11 | 12 | public String getName() { 13 | return name; 14 | } 15 | 16 | public void setName(String name) { 17 | this.name = name; 18 | } 19 | 20 | public int getAge() { 21 | return age; 22 | } 23 | 24 | public void setAge(int age) { 25 | this.age = age; 26 | } 27 | 28 | @Override 29 | public IPrototype clone() { 30 | return new Dolphin(name, age); 31 | } 32 | 33 | @Override 34 | public String toString() { 35 | return name; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /22_PrototypeDesignPattern/PrototypeDesignPattern/src/com/java/course/IPrototype.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public interface IPrototype { 4 | IPrototype clone(); 5 | } 6 | -------------------------------------------------------------------------------- /22_PrototypeDesignPattern/PrototypeDesignPattern/src/com/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | import com.java.course.model.Animal; 4 | import com.sun.org.apache.bcel.internal.generic.ANEWARRAY; 5 | 6 | public class Main { 7 | 8 | public static void main(String[] args) { 9 | System.out.println("Custom cloning"); 10 | Person person = new Person("kejeiri",40); 11 | System.out.println("person 1 : " + person); 12 | 13 | Person ahmed =(Person)person.clone(); 14 | ahmed.setName("Ahmed"); 15 | System.out.println("person 2 : " + ahmed); 16 | 17 | Dolphin dolphin = new Dolphin("Jerry",70); 18 | System.out.println("Dolphin 1 " + dolphin); 19 | 20 | Dolphin sam = (Dolphin) dolphin.clone(); 21 | sam.setName("Sam"); 22 | System.out.println("Dolphin 2 " + sam); 23 | 24 | System.out.println("===================================================="); 25 | System.out.println("Using cloneable From JAVA"); 26 | Animal animal = new Animal("Cow",3); 27 | System.out.println(animal); 28 | Animal cow = (Animal) animal.clone(); 29 | cow.setName("new cow"); 30 | System.out.println(cow); 31 | System.out.println(System.identityHashCode(animal)); 32 | System.out.println(System.identityHashCode(cow)); 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /22_PrototypeDesignPattern/PrototypeDesignPattern/src/com/java/course/Person.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public class Person implements IPrototype{ 4 | private String name; 5 | private int age; 6 | 7 | public Person(String name, int age) { 8 | this.name = name; 9 | this.age = age; 10 | } 11 | 12 | @Override 13 | public IPrototype clone() { 14 | return new Person(name,age); 15 | } 16 | 17 | public String getName() { 18 | return name; 19 | } 20 | 21 | public void setName(String name) { 22 | this.name = name; 23 | } 24 | 25 | public int getAge() { 26 | return age; 27 | } 28 | 29 | public void setAge(int age) { 30 | this.age = age; 31 | } 32 | 33 | @Override 34 | public String toString() { 35 | return name; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /22_PrototypeDesignPattern/PrototypeDesignPattern/src/com/java/course/model/Animal.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | public class Animal implements IAnimal{ 4 | public String getName() { 5 | return name; 6 | } 7 | 8 | public void setName(String name) { 9 | this.name = name; 10 | } 11 | 12 | public int getAge() { 13 | return age; 14 | } 15 | 16 | public void setAge(int age) { 17 | this.age = age; 18 | } 19 | 20 | private String name; 21 | private int age; 22 | 23 | public Animal(String name, int age) { 24 | this.name = name; 25 | this.age = age; 26 | } 27 | @Override 28 | public IAnimal clone() { 29 | try { 30 | return (IAnimal) super.clone(); 31 | } catch (CloneNotSupportedException e) { 32 | e.printStackTrace(); 33 | } 34 | return null; 35 | } 36 | 37 | @Override 38 | public String toString() { 39 | return name; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /22_PrototypeDesignPattern/PrototypeDesignPattern/src/com/java/course/model/IAnimal.java: -------------------------------------------------------------------------------- 1 | package com.java.course.model; 2 | 3 | public interface IAnimal extends Cloneable { 4 | IAnimal clone(); 5 | } 6 | -------------------------------------------------------------------------------- /23_MediatorDesignPattern/MediatorDesignPattern/Diagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/23_MediatorDesignPattern/MediatorDesignPattern/Diagram.jpg -------------------------------------------------------------------------------- /23_MediatorDesignPattern/MediatorDesignPattern/README.md: -------------------------------------------------------------------------------- 1 | # Mediator design pattern 2 | [![N|Picture](./figure1.jpg) 3 | 4 | 5 | Centralizes complex communications and control between related object, such as a Complex system which contains subsystems 6 | - It will make sure that communications is centralized in one place (mediator = complex system, ATC and airplanes), thus minimize the communications between objects! 7 | - The subsystems (also called colleagues) doesn't have to know about each other's, they have to know how to communicate and receive information's from/to them to the mediator 8 | 9 | > through the mediator we loose coupling our classes (minimize the dependencies between classes), this should be the only reason for using mediator! (communications minimization!) 10 | > there is other to do loose coupling, as the number of mediator grows it becomes hard to maintain! 11 | 12 | 13 | 14 | [![N|Picture](./figure2.jpg) 15 | -------------------------------------------------------------------------------- /23_MediatorDesignPattern/MediatorDesignPattern/figure1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/23_MediatorDesignPattern/MediatorDesignPattern/figure1.jpg -------------------------------------------------------------------------------- /23_MediatorDesignPattern/MediatorDesignPattern/figure2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/23_MediatorDesignPattern/MediatorDesignPattern/figure2.jpg -------------------------------------------------------------------------------- /23_MediatorDesignPattern/MediatorDesignPattern/figure3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/23_MediatorDesignPattern/MediatorDesignPattern/figure3.jpg -------------------------------------------------------------------------------- /23_MediatorDesignPattern/MediatorDesignPattern/src/com/java/course/ATCMediator.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public interface ATCMediator { 4 | void sendMessage(String message, AirCraft airCraft); 5 | void addAirCraft(AirCraft airCraft); 6 | } 7 | -------------------------------------------------------------------------------- /23_MediatorDesignPattern/MediatorDesignPattern/src/com/java/course/ATCMediatorImpl.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | import java.util.ArrayList; 4 | /* 5 | * through the mediator we loose coupling our classes (minimize the dependencies between classes), 6 | * this should be the only reason for using mediator! 7 | * */ 8 | 9 | public class ATCMediatorImpl implements ATCMediator{ 10 | //ATC needs to know about all aircraft 11 | ArrayList airCraftList; 12 | public ATCMediatorImpl() { 13 | this.airCraftList = new ArrayList<>(); 14 | } 15 | 16 | @Override 17 | public void sendMessage(String message, AirCraft msgSendingAirCraft ) { 18 | for (AirCraft airCraft : this.airCraftList) { 19 | //message should'nt be received by the aircraft sending the message 20 | if (!airCraft.equals(msgSendingAirCraft)){ 21 | airCraft.receive(message); 22 | } 23 | } 24 | } 25 | 26 | @Override 27 | public void addAirCraft(AirCraft airCraft) { 28 | this.airCraftList.add(airCraft); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /23_MediatorDesignPattern/MediatorDesignPattern/src/com/java/course/AirCraft.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public abstract class AirCraft { 4 | protected ATCMediator mediator; 5 | protected String name; 6 | 7 | public AirCraft(ATCMediator mediator,String name) { 8 | this.name = name; 9 | this.mediator = mediator; 10 | } 11 | 12 | public abstract void send(String message); 13 | public abstract void receive(String message); 14 | } 15 | -------------------------------------------------------------------------------- /23_MediatorDesignPattern/MediatorDesignPattern/src/com/java/course/AirCraftImpl.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public class AirCraftImpl extends AirCraft{ 4 | public AirCraftImpl(ATCMediator mediator,String name) { 5 | super(mediator,name); 6 | } 7 | 8 | @Override 9 | public void send(String message) { 10 | System.out.println(this.name+" is sending message = " +message); 11 | this.mediator.sendMessage(message,this); 12 | } 13 | 14 | @Override 15 | public void receive(String message) { 16 | System.out.println(this.name+" is receiving message = " +message); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /23_MediatorDesignPattern/MediatorDesignPattern/src/com/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public class Main { 4 | 5 | public static void main(String[] args) { 6 | 7 | ATCMediator mediator = new ATCMediatorImpl(); 8 | 9 | AirCraft airCraft1 = new AirCraftImpl(mediator,"airCraft1"); 10 | AirCraft airCraft2 = new AirCraftImpl(mediator,"airCraft2"); 11 | AirCraft airCraft3 = new AirCraftImpl(mediator,"airCraft3"); 12 | AirCraft airCraft4 = new AirCraftImpl(mediator,"airCraft4"); 13 | 14 | mediator.addAirCraft(airCraft1); 15 | mediator.addAirCraft(airCraft2); 16 | mediator.addAirCraft(airCraft3); 17 | mediator.addAirCraft(airCraft4); 18 | airCraft2.send("from aircraft1"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /24_VisitorDesignPattern/VisitorDesignPattern/Diagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/24_VisitorDesignPattern/VisitorDesignPattern/Diagram.jpg -------------------------------------------------------------------------------- /24_VisitorDesignPattern/VisitorDesignPattern/README.md: -------------------------------------------------------------------------------- 1 | # Visitor design pattern 2 | [![N|Picture](./figure1.jpg)] 3 | 4 | Allows us to add methods to classes of different types without musch altering the original classes. 5 | 6 | - Suppose we sell items such as Tshirt, shirt and Jacket, and need to get the final price after taxes, the obvious solution would be to add the tax structure in those classes (model) 7 | - the downsize is if the tax structure change we have to make changes to all our items which is not very handy! 8 | - Here when the visitor design pattern come to rescue. 9 | 10 | > we create a visitor interface which is attached to each individual item where the final price (tax incl.) calculations are done depending on the items type as opposed to do this calculation at each class level! 11 | 12 | [![N|Picture](./diagram.jpg)] 13 | -------------------------------------------------------------------------------- /24_VisitorDesignPattern/VisitorDesignPattern/figure1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/24_VisitorDesignPattern/VisitorDesignPattern/figure1.jpg -------------------------------------------------------------------------------- /24_VisitorDesignPattern/VisitorDesignPattern/src/com/kejeiri/java/course/Interfaces/Visitable.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.Interfaces; 2 | 3 | public interface Visitable { 4 | double accept(Visitor visitor); 5 | } 6 | -------------------------------------------------------------------------------- /24_VisitorDesignPattern/VisitorDesignPattern/src/com/kejeiri/java/course/Interfaces/Visitor.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.Interfaces; 2 | 3 | import com.kejeiri.java.course.model.Jacket; 4 | import com.kejeiri.java.course.model.Shirt; 5 | import com.kejeiri.java.course.model.TShirt; 6 | 7 | public interface Visitor { 8 | double visit(Shirt shirt); 9 | double visit(TShirt tShirt); 10 | double visit(Jacket jacket); 11 | } 12 | -------------------------------------------------------------------------------- /24_VisitorDesignPattern/VisitorDesignPattern/src/com/kejeiri/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course; 2 | 3 | import com.kejeiri.java.course.business.DiscountVisitor; 4 | import com.kejeiri.java.course.business.TaxVisitor; 5 | import com.kejeiri.java.course.model.Jacket; 6 | import com.kejeiri.java.course.model.Shirt; 7 | import com.kejeiri.java.course.model.TShirt; 8 | 9 | public class Main { 10 | 11 | public static void main(String[] args) { 12 | TaxVisitor taxVisitor = new TaxVisitor(); 13 | Jacket jacket = new Jacket(40.99); 14 | Shirt shirt = new Shirt(5.25); 15 | TShirt tShirt = new TShirt(6.59); 16 | 17 | 18 | System.out.println(jacket.accept(taxVisitor)); 19 | System.out.println(shirt.accept(taxVisitor)); 20 | System.out.println(tShirt.accept(taxVisitor)); 21 | 22 | System.out.println("============================================"); 23 | System.out.println("Discount Tax not included:"); 24 | DiscountVisitor discountVisitor = new DiscountVisitor(); 25 | System.out.println(jacket.accept(discountVisitor)); 26 | System.out.println(shirt.accept(discountVisitor)); 27 | System.out.println(tShirt.accept(discountVisitor)); 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /24_VisitorDesignPattern/VisitorDesignPattern/src/com/kejeiri/java/course/business/DiscountVisitor.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.business; 2 | 3 | import com.kejeiri.java.course.Interfaces.Visitor; 4 | import com.kejeiri.java.course.model.Jacket; 5 | import com.kejeiri.java.course.model.Shirt; 6 | import com.kejeiri.java.course.model.TShirt; 7 | 8 | import java.text.DecimalFormat; 9 | 10 | public class DiscountVisitor implements Visitor { 11 | DecimalFormat decimalFormat = new DecimalFormat("#.##"); 12 | @Override 13 | public double visit(Shirt shirt) { 14 | double discount = 0.1; 15 | System.out.println("Shirt discount: "+ discount*100); 16 | return Double.parseDouble(decimalFormat.format(shirt.getPrice()*(1.0-discount))); 17 | } 18 | 19 | @Override 20 | public double visit(TShirt tShirt) { 21 | double discount = 0.5; 22 | System.out.println("TShirt discount: " + discount*100); 23 | return Double.parseDouble(decimalFormat.format(tShirt.getPrice()*(1.0-discount))); 24 | } 25 | 26 | @Override 27 | public double visit(Jacket jacket) { 28 | double discount = 0.3; 29 | System.out.println("Jacket discount: "+ discount*100); 30 | return Double.parseDouble(decimalFormat.format(jacket.getPrice()*(1.0-discount))); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /24_VisitorDesignPattern/VisitorDesignPattern/src/com/kejeiri/java/course/business/TaxVisitor.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.business; 2 | 3 | import com.kejeiri.java.course.Interfaces.Visitor; 4 | import com.kejeiri.java.course.model.Jacket; 5 | import com.kejeiri.java.course.model.Shirt; 6 | import com.kejeiri.java.course.model.TShirt; 7 | 8 | import java.text.DecimalFormat; 9 | 10 | public class TaxVisitor implements Visitor { 11 | DecimalFormat decimalFormat = new DecimalFormat("#.##"); 12 | @Override 13 | public double visit(Shirt shirt) { 14 | System.out.println("Shirt final price with tax: "); 15 | return Double.parseDouble(decimalFormat.format(shirt.getPrice() *.15+shirt.getPrice())); 16 | } 17 | 18 | @Override 19 | public double visit(TShirt tShirt) { 20 | System.out.println("TShirt final price with tax: "); 21 | return Double.parseDouble(decimalFormat.format(tShirt.getPrice() *.20+tShirt.getPrice())); 22 | } 23 | 24 | @Override 25 | public double visit(Jacket jacket) { 26 | System.out.println("Jacket final price with tax: "); 27 | return Double.parseDouble(decimalFormat.format(jacket.getPrice() *.10+jacket.getPrice())); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /24_VisitorDesignPattern/VisitorDesignPattern/src/com/kejeiri/java/course/model/Jacket.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.model; 2 | 3 | import com.kejeiri.java.course.Interfaces.Visitable; 4 | import com.kejeiri.java.course.Interfaces.Visitor; 5 | 6 | public class Jacket implements Visitable { 7 | private double price; 8 | 9 | public double getPrice() { 10 | return price; 11 | } 12 | 13 | public Jacket(double price) { 14 | this.price = price; 15 | } 16 | 17 | 18 | @Override 19 | public double accept(Visitor visitor) { 20 | return visitor.visit(this); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /24_VisitorDesignPattern/VisitorDesignPattern/src/com/kejeiri/java/course/model/Shirt.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.model; 2 | 3 | import com.kejeiri.java.course.Interfaces.Visitable; 4 | import com.kejeiri.java.course.Interfaces.Visitor; 5 | 6 | public class Shirt implements Visitable { 7 | private double price; 8 | 9 | public double getPrice() { 10 | return price; 11 | } 12 | 13 | public Shirt(double price) { 14 | this.price = price; 15 | } 16 | 17 | @Override 18 | public double accept(Visitor visitor) { 19 | return visitor.visit(this); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /24_VisitorDesignPattern/VisitorDesignPattern/src/com/kejeiri/java/course/model/TShirt.java: -------------------------------------------------------------------------------- 1 | package com.kejeiri.java.course.model; 2 | 3 | import com.kejeiri.java.course.Interfaces.Visitable; 4 | import com.kejeiri.java.course.Interfaces.Visitor; 5 | 6 | public class TShirt implements Visitable { 7 | private double price; 8 | 9 | public double getPrice() { 10 | return price; 11 | } 12 | 13 | public TShirt(double price) { 14 | this.price = price; 15 | } 16 | 17 | 18 | @Override 19 | public double accept(Visitor visitor) { 20 | return visitor.visit(this); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /25_MementoDesignPattern/MementoDesignPattern/Diagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/25_MementoDesignPattern/MementoDesignPattern/Diagram.jpg -------------------------------------------------------------------------------- /25_MementoDesignPattern/MementoDesignPattern/README.md: -------------------------------------------------------------------------------- 1 | # Memento design pattern 2 | [![N|Picture](./figure1.jpg)] 3 | 4 | It covers the undoing of something, anything that changes a state and allows us to go back to the previous state 5 | It returns an object to one of its previous states; if the user request an "undo". 6 | 7 | - Caretaker: Encapsulates Mementos (states freezer), it keeps track of multiple mementos so we can have different mementos, i.e. different states so when needed, we could allow users to go back to those states 8 | - Originator: is the object for which the state is to be saved, it create a memento and use it in the future to undo. It will store the information in the memento object and it will also retrieve previous state when it needs to back track. 9 | - Memento: is the object that will maintain the state of the originator, it stores what the oginator give to it. the memento object is unreachable/unvisible for the entire application otherwise theintegrity of the data saving will be compromise. 10 | 11 | 12 | [![N|Picture](./Diagram.jpg)] 13 | -------------------------------------------------------------------------------- /25_MementoDesignPattern/MementoDesignPattern/figure1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/25_MementoDesignPattern/MementoDesignPattern/figure1.jpg -------------------------------------------------------------------------------- /25_MementoDesignPattern/MementoDesignPattern/src/com/java/course/CareTaker.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | import java.util.ArrayList; 4 | 5 | public class CareTaker { 6 | private ArrayList stateList; 7 | 8 | public CareTaker() { 9 | this.stateList = new ArrayList<>(); 10 | } 11 | 12 | public void addMemento(Memento memento){ 13 | this.stateList.add(memento); 14 | } 15 | public Memento getMemento(int index){ 16 | return stateList.get(index); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /25_MementoDesignPattern/MementoDesignPattern/src/com/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public class Main { 4 | 5 | public static void main(String[] args) { 6 | Originator originator = new Originator(); 7 | originator.setState("Monster 1"); 8 | 9 | Memento memento = originator.createMemento(); 10 | 11 | CareTaker careTaker = new CareTaker(); 12 | careTaker.addMemento(memento); 13 | 14 | originator.setState("Monster 2"); 15 | originator.setState("Monster 3"); 16 | 17 | memento = originator.createMemento(); 18 | careTaker.addMemento(memento); 19 | 20 | originator.setState("monster 4"); 21 | 22 | System.out.println("Originator current state : " + originator.getState()); 23 | 24 | System.out.println("Resorting originator to previous state...."); 25 | memento = careTaker.getMemento(1); 26 | //originator.setMemento(memento); 27 | originator.restoreMemento(memento); 28 | System.out.println("Originator state : " + originator.getState()); 29 | 30 | memento = careTaker.getMemento(0); 31 | //originator.setMemento(memento); 32 | originator.restoreMemento(memento); 33 | System.out.println("Originator state : " + originator.getState()); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /25_MementoDesignPattern/MementoDesignPattern/src/com/java/course/Memento.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public class Memento { 4 | private String state; 5 | 6 | public Memento(String state) { 7 | this.state = state; 8 | } 9 | 10 | public String getState() { 11 | return state; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /25_MementoDesignPattern/MementoDesignPattern/src/com/java/course/Originator.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public class Originator { 4 | //for simplicity we use string, in real world app we use java model class, e.g. employee, Characater.java.. 5 | private String state; 6 | 7 | public void setState(String state) { 8 | this.state = state; 9 | } 10 | public String getState() { 11 | return state; 12 | } 13 | public Memento createMemento(){ 14 | return new Memento(state); 15 | } 16 | 17 | public String restoreMemento(Memento memento){ 18 | this.state= memento.getState(); 19 | return state; 20 | } 21 | public void setMemento(Memento memento){ 22 | this.state = memento.getState(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /26_InterpreterDesignPattern/InterpreterDesignPattern/Diagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/26_InterpreterDesignPattern/InterpreterDesignPattern/Diagram.jpg -------------------------------------------------------------------------------- /26_InterpreterDesignPattern/InterpreterDesignPattern/README.md: -------------------------------------------------------------------------------- 1 | # Interpreter design pattern 2 | [![N|Picture](./figure1.jpg)] 3 | 4 | It's about interpreting some expression into something else such language interpreter. java use interpreter when it comes to generate the bycode 5 | 1- Source code 6 | 2- Interpreter/Compiler 7 | 3- Bytecode 8 | 9 | 10 | [![N|Picture](./Diagram.jpg)] 11 | -------------------------------------------------------------------------------- /26_InterpreterDesignPattern/InterpreterDesignPattern/figure1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/26_InterpreterDesignPattern/InterpreterDesignPattern/figure1.jpg -------------------------------------------------------------------------------- /26_InterpreterDesignPattern/InterpreterDesignPattern/src/com/java/course/Expression.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public interface Expression { 4 | String interpret(InterpreterContext interpreterContext); 5 | } 6 | -------------------------------------------------------------------------------- /26_InterpreterDesignPattern/InterpreterDesignPattern/src/com/java/course/IntToBinaryExpression.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public class IntToBinaryExpression implements Expression { 4 | private int a; 5 | 6 | public IntToBinaryExpression(int a) { 7 | this.a = a; 8 | } 9 | 10 | @Override 11 | public String interpret(InterpreterContext interpreterContext) { 12 | return interpreterContext.getBinaryFormat(a); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /26_InterpreterDesignPattern/InterpreterDesignPattern/src/com/java/course/IntToHexExpression.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public class IntToHexExpression implements Expression{ 4 | private int a; 5 | 6 | public IntToHexExpression(int a) { 7 | this.a = a; 8 | } 9 | 10 | @Override 11 | public String interpret(InterpreterContext interpreterContext) { 12 | return interpreterContext.getHexadecimalFormat(a); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /26_InterpreterDesignPattern/InterpreterDesignPattern/src/com/java/course/InterpreterClient.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public class InterpreterClient { 4 | private InterpreterContext interpreterContext; 5 | public InterpreterClient(InterpreterContext interpreterContext) { 6 | this.interpreterContext = interpreterContext; 7 | } 8 | public String interpret(String expr){ 9 | Expression expression = null; 10 | if (expr.contains("Hexadecimal")){ 11 | expression= new IntToHexExpression( 12 | Integer.parseInt(expr.substring(0,expr.indexOf(" "))) 13 | ); 14 | }else if (expr.contains("Binary")){ 15 | expression= new IntToBinaryExpression( 16 | Integer.parseInt(expr.substring(0, expr.indexOf(" "))) 17 | ); 18 | } else return expr; 19 | return expression.interpret(interpreterContext); 20 | } 21 | public static void main(String[] args) { 22 | String f = "13 in Binary"; 23 | String s = "20 in Hexadecimal"; 24 | 25 | InterpreterClient interpreter = new InterpreterClient(new InterpreterContext()); 26 | System.out.println(f+" = " +interpreter.interpret(f)); 27 | System.out.println(s+" = " +interpreter.interpret(s)); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /26_InterpreterDesignPattern/InterpreterDesignPattern/src/com/java/course/InterpreterContext.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public class InterpreterContext { 4 | public InterpreterContext() {} 5 | public String getBinaryFormat(int i){return Integer.toBinaryString(i); } 6 | public String getHexadecimalFormat(int i){ 7 | return Integer.toHexString(i); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /27_ChainOfResponsabilityDesignPattern/ChainOfResponsabilityDesignPattern/Diagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/27_ChainOfResponsabilityDesignPattern/ChainOfResponsabilityDesignPattern/Diagram.jpg -------------------------------------------------------------------------------- /27_ChainOfResponsabilityDesignPattern/ChainOfResponsabilityDesignPattern/README.md: -------------------------------------------------------------------------------- 1 | # Chain of responsability design pattern 2 | [![N|Picture](./figure1.jpg)] 3 | it uses when we give to more that one object a chance to handle a request. it's all about dividing responsabilities, to make sure that each request is handeled by a specific handler! 4 | 5 | Email Filtering example: 6 | - spam folder : spam filter handler 7 | - familly folder : familly filter handler 8 | - bussines folder : bussines filter handler 9 | ... 10 | 11 | 12 | [![N|Picture](./Diagram.jpg)] 13 | -------------------------------------------------------------------------------- /27_ChainOfResponsabilityDesignPattern/ChainOfResponsabilityDesignPattern/figure1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/27_ChainOfResponsabilityDesignPattern/ChainOfResponsabilityDesignPattern/figure1.jpg -------------------------------------------------------------------------------- /27_ChainOfResponsabilityDesignPattern/ChainOfResponsabilityDesignPattern/src/com/java/course/CEOPurchasePower.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public class CEOPurchasePower extends PurchasePower { 4 | @Override 5 | protected double getAllowable() { 6 | return BASE*100; 7 | } 8 | 9 | @Override 10 | protected String getRole() { 11 | return "CEO"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /27_ChainOfResponsabilityDesignPattern/ChainOfResponsabilityDesignPattern/src/com/java/course/DirectorPurchasePower.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public class DirectorPurchasePower extends PurchasePower{ 4 | @Override 5 | protected double getAllowable() { 6 | return BASE*20; 7 | } 8 | 9 | @Override 10 | protected String getRole() { 11 | return "Director"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /27_ChainOfResponsabilityDesignPattern/ChainOfResponsabilityDesignPattern/src/com/java/course/Main.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.IOException; 5 | import java.io.InputStreamReader; 6 | 7 | public class Main { 8 | 9 | public static void main(String[] args) { 10 | CEOPurchasePower ceo= new CEOPurchasePower(); 11 | DirectorPurchasePower director = new DirectorPurchasePower(); 12 | ManagerPurchasePower manager = new ManagerPurchasePower(); 13 | 14 | ceo.setSuccessor(director); 15 | director.setSuccessor(ceo); 16 | manager.setSuccessor(director); 17 | while (true){ 18 | System.out.println("Enter the amount to check who should approved your expenditure:"); 19 | System.out.print(">>"); 20 | try { 21 | double d = Double.parseDouble(new BufferedReader(new InputStreamReader(System.in)).readLine()); 22 | manager.processRequest(new PurchaseRequest(d,"general expenditure")); 23 | } catch (IOException e) { 24 | e.printStackTrace(); 25 | } 26 | 27 | } 28 | 29 | 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /27_ChainOfResponsabilityDesignPattern/ChainOfResponsabilityDesignPattern/src/com/java/course/ManagerPurchasePower.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | public class ManagerPurchasePower extends PurchasePower{ 4 | @Override 5 | protected double getAllowable() { 6 | return BASE*10; 7 | } 8 | 9 | @Override 10 | protected String getRole() { 11 | return "Manager"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /27_ChainOfResponsabilityDesignPattern/ChainOfResponsabilityDesignPattern/src/com/java/course/PurchasePower.java: -------------------------------------------------------------------------------- 1 | package com.java.course; 2 | 3 | //this the Handler! 4 | public abstract class PurchasePower { 5 | protected static final double BASE=1000.00; 6 | protected PurchasePower successor; 7 | abstract protected double getAllowable(); 8 | abstract protected String getRole(); 9 | 10 | public PurchasePower getSuccessor() { 11 | return successor; 12 | } 13 | 14 | public void setSuccessor(PurchasePower successor) { 15 | this.successor = successor; 16 | } 17 | 18 | //Chain of responsibility and decision making! 19 | public void processRequest(PurchaseRequest request){ 20 | if (request.getAmount() circleMap= new HashMap(); 7 | public static Shape getCircle(String color){ 8 | Circle circle = circleMap.get(color); 9 | if (circle == null){ 10 | circle = new Circle(color); 11 | circleMap.put(color,circle); 12 | System.out.println("Making circle of color: "+color); 13 | } 14 | return circle; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Design Patterns, Elements of Reusable Object-Oriented Software.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkejeiri/Java-Design-Pattern/4ecdaf02fc817ac5ff3ec4d8df3c7c916ff8d79e/Design Patterns, Elements of Reusable Object-Oriented Software.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Most commonly used Java Design pattern 2 | 3 | Based on the gang of four book : Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson et John Vlissides 4 | 5 | 29 folders of differents design pattern are listed... --------------------------------------------------------------------------------