├── .github └── workflows │ └── build.yml ├── .gitignore ├── LICENSE ├── README.md ├── build.gradle ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── logo.png ├── settings.gradle └── src ├── main ├── java │ └── design_patterns │ │ ├── behavioral │ │ ├── chain_of_responsibility │ │ │ ├── ApplicationLog.java │ │ │ ├── Chain.java │ │ │ ├── NetworkLog.java │ │ │ └── SystemLog.java │ │ ├── command │ │ │ ├── Command.java │ │ │ ├── Invoker.java │ │ │ ├── Receiver.java │ │ │ ├── TurnOffCommand.java │ │ │ └── TurnOnCommand.java │ │ ├── iterator │ │ │ ├── Compound.java │ │ │ ├── ConcreteCompound.java │ │ │ ├── ConcreteIterator.java │ │ │ └── Iterator.java │ │ ├── mediator │ │ │ ├── ConcreteMediator.java │ │ │ ├── FirstPartner.java │ │ │ ├── Mediator.java │ │ │ ├── Partner.java │ │ │ └── SecondPartner.java │ │ ├── memento │ │ │ ├── Memento.java │ │ │ └── Originator.java │ │ ├── observer │ │ │ ├── ConcreteObserver.java │ │ │ ├── ConcreteSubject.java │ │ │ ├── Observer.java │ │ │ └── Subject.java │ │ ├── state │ │ │ ├── CloseState.java │ │ │ ├── Context.java │ │ │ ├── OpenState.java │ │ │ └── State.java │ │ ├── strategy │ │ │ ├── Concrete.java │ │ │ ├── FirstStrategy.java │ │ │ ├── SecondStrategy.java │ │ │ └── Strategy.java │ │ ├── template_method │ │ │ ├── AbstractClass.java │ │ │ └── ConcreteClass.java │ │ └── visitor │ │ │ ├── Circle.java │ │ │ ├── Figure.java │ │ │ ├── PrintNameVisitor.java │ │ │ ├── Square.java │ │ │ └── Visitor.java │ │ ├── creational │ │ ├── abstract_factory │ │ │ ├── AbstractFactory.java │ │ │ ├── FemaleAbstractFactory.java │ │ │ ├── FemaleGiftProduct.java │ │ │ ├── FemalePackProduct.java │ │ │ ├── MaleAbstractFactory.java │ │ │ ├── MaleGiftProduct.java │ │ │ ├── MalePackProduct.java │ │ │ └── Product.java │ │ ├── builder │ │ │ ├── Pizza.java │ │ │ ├── PizzaBuilder.java │ │ │ └── PizzaMargheritaBuilder.java │ │ ├── factory_method │ │ │ ├── Creator.java │ │ │ ├── LimitedCreator.java │ │ │ ├── LimitedProduct.java │ │ │ ├── Product.java │ │ │ ├── SpecialCreator.java │ │ │ └── SpecialProduct.java │ │ ├── prototype │ │ │ ├── CloneableObject.java │ │ │ └── Prototype.java │ │ └── singleton │ │ │ └── Singleton.java │ │ └── structural │ │ ├── bridge │ │ ├── Circle.java │ │ ├── DrawProgram.java │ │ ├── DrawProgram1.java │ │ ├── DrawProgram2.java │ │ ├── Line.java │ │ └── Shape.java │ │ ├── class_adapter │ │ ├── AdapterRectangle.java │ │ ├── Figure.java │ │ ├── Line.java │ │ └── Rectangle.java │ │ ├── composite │ │ ├── Composite.java │ │ ├── Figure.java │ │ ├── Line.java │ │ └── Point.java │ │ ├── decorator │ │ ├── Coffee.java │ │ ├── CoffeeDecorator.java │ │ ├── Milk.java │ │ ├── SimpleCoffee.java │ │ └── Sugar.java │ │ ├── facade │ │ ├── Caffeine.java │ │ ├── Facade.java │ │ ├── Sugar.java │ │ └── Water.java │ │ ├── flyweight │ │ ├── CoffeeFlavour.java │ │ ├── CoffeeShop.java │ │ ├── Menu.java │ │ └── Order.java │ │ ├── object_adapter │ │ ├── AdapterRectangle.java │ │ ├── Figure.java │ │ ├── Line.java │ │ └── Rectangle.java │ │ └── proxy │ │ ├── File.java │ │ ├── ProxyProtectedFile.java │ │ └── PublicFile.java └── resources │ └── img │ ├── uml-abstract-factory.png │ ├── uml-bridge.png │ ├── uml-builder.png │ ├── uml-chain-of-responsability.png │ ├── uml-class-adapter.png │ ├── uml-command.png │ ├── uml-composite.png │ ├── uml-decorator.png │ ├── uml-facade.png │ ├── uml-factory-method.png │ ├── uml-flyweight.png │ ├── uml-iterator.png │ ├── uml-mediator.png │ ├── uml-memento.png │ ├── uml-object-adapter.png │ ├── uml-observer.png │ ├── uml-prototype.png │ ├── uml-proxy.png │ ├── uml-singleton.png │ ├── uml-state.png │ ├── uml-strategy.png │ ├── uml-template-method.png │ └── uml-visitor.png └── test └── java └── design_patterns ├── behavioral ├── chain_of_responsibility │ └── ChainOfResponsibilityTest.java ├── command │ └── CommandTest.java ├── iterator │ ├── ConcreteCompoundTest.java │ └── ConcreteIteratorTest.java ├── mediator │ └── MediatorTest.java ├── memento │ └── MementoTest.java ├── observer │ └── ObserverTest.java ├── state │ └── StateTest.java ├── strategy │ └── StrategyTest.java ├── template_method │ └── TemplateMethodTest.java └── visitor │ └── VisitorTest.java ├── creational ├── abstract_factory │ ├── FemaleAbstractFactoryTest.java │ └── MaleAbstractFactoryTest.java ├── builder │ ├── PizzaMargheritaBuilderTest.java │ └── PizzaTest.java ├── factory_method │ └── FactoryMethodTest.java ├── prototype │ └── CloneableObjectTest.java └── singleton │ └── SingletonTest.java └── structural ├── bridge └── BridgeTest.java ├── class_adapter └── ClassAdapterTest.java ├── composite ├── CompositeTest.java ├── LineTest.java └── PointTest.java ├── decorator └── DecoratorTest.java ├── facade ├── CaffeineTest.java ├── FacadeTest.java ├── SugarTest.java └── WaterTest.java ├── flyweight ├── CoffeeFlavourTest.java ├── CoffeeShopTest.java ├── MenuTest.java └── OrderTest.java ├── object_adapter └── ObjectAdapterTest.java └── proxy ├── ProxyProtectedFileTest.java └── ProxyTest.java /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | branches: [ "master" ] 6 | pull_request: 7 | branches: [ "master" ] 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-latest 13 | permissions: 14 | contents: read 15 | 16 | steps: 17 | - uses: actions/checkout@v4 18 | - name: Set up JDK 17 19 | uses: actions/setup-java@v4 20 | with: 21 | java-version: '17' 22 | distribution: 'temurin' 23 | 24 | # See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md 25 | - name: Setup Gradle 26 | uses: gradle/actions/setup-gradle@v3 27 | 28 | - name: Build with Gradle Wrapper 29 | run: ./gradlew build 30 | 31 | dependency-submission: 32 | 33 | runs-on: ubuntu-latest 34 | permissions: 35 | contents: write 36 | 37 | steps: 38 | - uses: actions/checkout@v4 39 | - name: Set up JDK 17 40 | uses: actions/setup-java@v4 41 | with: 42 | java-version: '17' 43 | distribution: 'temurin' 44 | 45 | # Generates and submits a dependency graph, enabling Dependabot Alerts for all project dependencies. 46 | # See: https://github.com/gradle/actions/blob/main/dependency-submission/README.md 47 | - name: Generate and submit dependency graph 48 | uses: gradle/actions/dependency-submission@v3 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | 3 | # Mobile Tools for Java (J2ME) 4 | .mtj.tmp/ 5 | 6 | # Package Files # 7 | *.war 8 | *.ear 9 | 10 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 11 | hs_err_pid* 12 | 13 | .DS_Store 14 | target 15 | 16 | .idea 17 | .gradle 18 | build 19 | out 20 | *.iml 21 | gradle.properties -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Alex Prut 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Design Patterns in Java

4 | 5 | [![Google Java Style](https://img.shields.io/badge/style%20guide-google-yellow.svg)](https://github.com/google/google-java-format) 6 | [![MIT](https://img.shields.io/dub/l/vibe-d.svg)](https://github.com/alexprut/design-patterns-java/blob/master/LICENSE) 7 | ![Build Status](https://github.com/alexprut/design-patterns-java/actions/workflows/build.yml/badge.svg) 8 |

Classic OOP Design Patterns from GoF, implemented in Java.

9 |
10 |
11 | 12 | Design Patterns Implemented 13 | --------------------------- 14 | #### Structural 15 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-class-adapter.png) – 16 | [Class Adapter](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/structural/class_adapter) 17 | — _allows classes with incompatible interfaces to work together by wrapping its own interface around that of an already existing class_ 18 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-object-adapter.png) – 19 | [Object Adapter](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/structural/object_adapter) 20 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-facade.png) – 21 | [Facade](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/structural/facade) 22 | — _provides a simplified interface to a large body of code_ 23 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-composite.png) – 24 | [Composite](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/structural/composite) 25 | — _composes zero-or-more similar objects so that they can be manipulated as one object_ 26 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-decorator.png) – 27 | [Decorator](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/structural/decorator) 28 | — _dynamically adds/overrides behaviour in an existing method of an object_ 29 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-proxy.png) – 30 | [Proxy](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/structural/proxy) 31 | — _provides a placeholder for another object to control access, reduce cost, and reduce complexity_ 32 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-flyweight.png) – 33 | [Flyweight](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/structural/flyweight) 34 | — _reduces the cost of creating and manipulating a large number of similar objects_ 35 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-bridge.png) – 36 | [Bridge](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/structural/bridge) 37 | — _decouples an abstraction from its implementation so that the two can vary independently_ 38 | 39 | #### Creational 40 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-factory-method.png) – 41 | [Factory Method](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/creational/factory_method) 42 | — _creates objects without specifying the exact class to create_ 43 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-abstract-factory.png) – 44 | [Abstract Factory](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/creational/abstract_factory) 45 | — _groups object factories that have a common theme_ 46 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-prototype.png) – 47 | [Prototype](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/creational/prototype) 48 | — _creates objects by cloning an existing object_ 49 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-singleton.png) – 50 | [Singleton](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/creational/singleton) 51 | — _restricts object creation for a class to only one instance_ 52 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-builder.png) – 53 | [Builder](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/creational/builder) 54 | — _constructs complex objects by separating construction and representation_ 55 | 56 | #### Behavioral 57 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-template-method.png) – 58 | [Template Method](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/behavioral/template_method) 59 | — _defines the skeleton of an algorithm as an abstract class, allowing its subclasses to provide concrete behavior_ 60 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-strategy.png) – 61 | [Strategy](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/behavioral/strategy) 62 | — _allows one of a family of algorithms to be selected on-the-fly at runtime_ 63 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-state.png) – 64 | [State](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/behavioral/state) 65 | — _allows an object to alter its behavior when its internal state changes_ 66 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-command.png) – 67 | [Command](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/behavioral/command) 68 | — _creates objects which encapsulate actions and parameters_ 69 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-observer.png) – 70 | [Observer](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/behavioral/observer) 71 | — _is a publish/subscribe pattern which allows a number of observer objects to see an event_ 72 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-mediator.png) – 73 | [Mediator](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/behavioral/mediator) 74 | — _allows loose coupling between classes by being the only class that has detailed knowledge of their methods_ 75 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-memento.png) – 76 | [Memento](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/behavioral/memento) 77 | — _provides the ability to restore an object to its previous state (undo)_ 78 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-iterator.png) – 79 | [Iterator](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/behavioral/iterator) 80 | — _accesses the elements of an object sequentially without exposing its underlying representation_ 81 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-visitor.png) – 82 | [Visitor](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/behavioral/visitor) 83 | — _separates an algorithm from an object structure by moving the hierarchy of methods into one object_ 84 | * [UML](https://github.com/alexprut/design-patterns-java/tree/master/src/main/resources/img/uml-chain-of-responsability.png) – 85 | [Chain of Responsability](https://github.com/alexprut/design-patterns-java/tree/master/src/main/java/design_patterns/behavioral/chain_of_responsibility) 86 | — _delegates commands to a chain of processing objects_ 87 | 88 | ### Build 89 | ``` 90 | ./gradlew clean build 91 | ``` 92 | 93 | ### Test 94 | ``` 95 | ./gradlew test 96 | ``` 97 | 98 | License 99 | ======= 100 | Licensed under [MIT](https://github.com/alexprut/design-patterns-java/blob/master/LICENSE). -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java-library' 3 | } 4 | 5 | repositories { 6 | mavenLocal() 7 | maven { 8 | url = uri('https://repo.maven.apache.org/maven2/') 9 | } 10 | } 11 | 12 | dependencies { 13 | testImplementation libs.junit.junit 14 | } 15 | 16 | group = 'design-patterns-java' 17 | version = '2.0.0' 18 | description = 'design-patterns-java' 19 | 20 | tasks.withType(JavaCompile) { 21 | options.encoding = 'UTF-8' 22 | } 23 | 24 | tasks.withType(Javadoc) { 25 | options.encoding = 'UTF-8' 26 | } 27 | -------------------------------------------------------------------------------- /gradle/libs.versions.toml: -------------------------------------------------------------------------------- 1 | # This file was generated by the Gradle 'init' task. 2 | # https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format 3 | 4 | [versions] 5 | junit-junit = "4.13.1" 6 | org-eluder-coveralls-coveralls-maven-plugin = "4.3.0" 7 | 8 | [libraries] 9 | junit-junit = { module = "junit:junit", version.ref = "junit-junit" } 10 | org-eluder-coveralls-coveralls-maven-plugin = { module = "org.eluder.coveralls:coveralls-maven-plugin", version.ref = "org-eluder-coveralls-coveralls-maven-plugin" } 11 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 4 | # Copyright © 2015-2021 the original authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | # 21 | # Gradle start up script for POSIX generated by Gradle. 22 | # 23 | # Important for running: 24 | # 25 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is 26 | # noncompliant, but you have some other compliant shell such as ksh or 27 | # bash, then to run this script, type that shell name before the whole 28 | # command line, like: 29 | # 30 | # ksh Gradle 31 | # 32 | # Busybox and similar reduced shells will NOT work, because this script 33 | # requires all of these POSIX shell features: 34 | # * functions; 35 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», 36 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»; 37 | # * compound commands having a testable exit status, especially «case»; 38 | # * various built-in commands including «command», «set», and «ulimit». 39 | # 40 | # Important for patching: 41 | # 42 | # (2) This script targets any POSIX shell, so it avoids extensions provided 43 | # by Bash, Ksh, etc; in particular arrays are avoided. 44 | # 45 | # The "traditional" practice of packing multiple parameters into a 46 | # space-separated string is a well documented source of bugs and security 47 | # problems, so this is (mostly) avoided, by progressively accumulating 48 | # options in "$@", and eventually passing that to Java. 49 | # 50 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, 51 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; 52 | # see the in-line comments for details. 53 | # 54 | # There are tweaks for specific operating systems such as AIX, CygWin, 55 | # Darwin, MinGW, and NonStop. 56 | # 57 | # (3) This script is generated from the Groovy template 58 | # https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt 59 | # within the Gradle project. 60 | # 61 | # You can find Gradle at https://github.com/gradle/gradle/. 62 | # 63 | ############################################################################## 64 | 65 | # Attempt to set APP_HOME 66 | 67 | # Resolve links: $0 may be a link 68 | app_path=$0 69 | 70 | # Need this for daisy-chained symlinks. 71 | while 72 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path 73 | [ -h "$app_path" ] 74 | do 75 | ls=$( ls -ld "$app_path" ) 76 | link=${ls#*' -> '} 77 | case $link in #( 78 | /*) app_path=$link ;; #( 79 | *) app_path=$APP_HOME$link ;; 80 | esac 81 | done 82 | 83 | # This is normally unused 84 | # shellcheck disable=SC2034 85 | APP_BASE_NAME=${0##*/} 86 | # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) 87 | APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit 88 | 89 | # Use the maximum available, or set MAX_FD != -1 to use that value. 90 | MAX_FD=maximum 91 | 92 | warn () { 93 | echo "$*" 94 | } >&2 95 | 96 | die () { 97 | echo 98 | echo "$*" 99 | echo 100 | exit 1 101 | } >&2 102 | 103 | # OS specific support (must be 'true' or 'false'). 104 | cygwin=false 105 | msys=false 106 | darwin=false 107 | nonstop=false 108 | case "$( uname )" in #( 109 | CYGWIN* ) cygwin=true ;; #( 110 | Darwin* ) darwin=true ;; #( 111 | MSYS* | MINGW* ) msys=true ;; #( 112 | NONSTOP* ) nonstop=true ;; 113 | esac 114 | 115 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 116 | 117 | 118 | # Determine the Java command to use to start the JVM. 119 | if [ -n "$JAVA_HOME" ] ; then 120 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 121 | # IBM's JDK on AIX uses strange locations for the executables 122 | JAVACMD=$JAVA_HOME/jre/sh/java 123 | else 124 | JAVACMD=$JAVA_HOME/bin/java 125 | fi 126 | if [ ! -x "$JAVACMD" ] ; then 127 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 128 | 129 | Please set the JAVA_HOME variable in your environment to match the 130 | location of your Java installation." 131 | fi 132 | else 133 | JAVACMD=java 134 | if ! command -v java >/dev/null 2>&1 135 | then 136 | die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 137 | 138 | Please set the JAVA_HOME variable in your environment to match the 139 | location of your Java installation." 140 | fi 141 | fi 142 | 143 | # Increase the maximum file descriptors if we can. 144 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then 145 | case $MAX_FD in #( 146 | max*) 147 | # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. 148 | # shellcheck disable=SC2039,SC3045 149 | MAX_FD=$( ulimit -H -n ) || 150 | warn "Could not query maximum file descriptor limit" 151 | esac 152 | case $MAX_FD in #( 153 | '' | soft) :;; #( 154 | *) 155 | # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. 156 | # shellcheck disable=SC2039,SC3045 157 | ulimit -n "$MAX_FD" || 158 | warn "Could not set maximum file descriptor limit to $MAX_FD" 159 | esac 160 | fi 161 | 162 | # Collect all arguments for the java command, stacking in reverse order: 163 | # * args from the command line 164 | # * the main class name 165 | # * -classpath 166 | # * -D...appname settings 167 | # * --module-path (only if needed) 168 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. 169 | 170 | # For Cygwin or MSYS, switch paths to Windows format before running java 171 | if "$cygwin" || "$msys" ; then 172 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) 173 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) 174 | 175 | JAVACMD=$( cygpath --unix "$JAVACMD" ) 176 | 177 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 178 | for arg do 179 | if 180 | case $arg in #( 181 | -*) false ;; # don't mess with options #( 182 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath 183 | [ -e "$t" ] ;; #( 184 | *) false ;; 185 | esac 186 | then 187 | arg=$( cygpath --path --ignore --mixed "$arg" ) 188 | fi 189 | # Roll the args list around exactly as many times as the number of 190 | # args, so each arg winds up back in the position where it started, but 191 | # possibly modified. 192 | # 193 | # NB: a `for` loop captures its iteration list before it begins, so 194 | # changing the positional parameters here affects neither the number of 195 | # iterations, nor the values presented in `arg`. 196 | shift # remove old arg 197 | set -- "$@" "$arg" # push replacement arg 198 | done 199 | fi 200 | 201 | 202 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 203 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 204 | 205 | # Collect all arguments for the java command: 206 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, 207 | # and any embedded shellness will be escaped. 208 | # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be 209 | # treated as '${Hostname}' itself on the command line. 210 | 211 | set -- \ 212 | "-Dorg.gradle.appname=$APP_BASE_NAME" \ 213 | -classpath "$CLASSPATH" \ 214 | org.gradle.wrapper.GradleWrapperMain \ 215 | "$@" 216 | 217 | # Stop when "xargs" is not available. 218 | if ! command -v xargs >/dev/null 2>&1 219 | then 220 | die "xargs is not available" 221 | fi 222 | 223 | # Use "xargs" to parse quoted args. 224 | # 225 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed. 226 | # 227 | # In Bash we could simply go: 228 | # 229 | # readarray ARGS < <( xargs -n1 <<<"$var" ) && 230 | # set -- "${ARGS[@]}" "$@" 231 | # 232 | # but POSIX shell has neither arrays nor command substitution, so instead we 233 | # post-process each arg (as a line of input to sed) to backslash-escape any 234 | # character that might be a shell metacharacter, then use eval to reverse 235 | # that process (while maintaining the separation between arguments), and wrap 236 | # the whole thing up as a single "set" statement. 237 | # 238 | # This will of course break if any of these variables contains a newline or 239 | # an unmatched quote. 240 | # 241 | 242 | eval "set -- $( 243 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | 244 | xargs -n1 | 245 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | 246 | tr '\n' ' ' 247 | )" '"$@"' 248 | 249 | exec "$JAVACMD" "$@" 250 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%"=="" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%"=="" set DIRNAME=. 29 | @rem This is normally unused 30 | set APP_BASE_NAME=%~n0 31 | set APP_HOME=%DIRNAME% 32 | 33 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 34 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 35 | 36 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 37 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 38 | 39 | @rem Find java.exe 40 | if defined JAVA_HOME goto findJavaFromJavaHome 41 | 42 | set JAVA_EXE=java.exe 43 | %JAVA_EXE% -version >NUL 2>&1 44 | if %ERRORLEVEL% equ 0 goto execute 45 | 46 | echo. 1>&2 47 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 48 | echo. 1>&2 49 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 50 | echo location of your Java installation. 1>&2 51 | 52 | goto fail 53 | 54 | :findJavaFromJavaHome 55 | set JAVA_HOME=%JAVA_HOME:"=% 56 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 57 | 58 | if exist "%JAVA_EXE%" goto execute 59 | 60 | echo. 1>&2 61 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 62 | echo. 1>&2 63 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 64 | echo location of your Java installation. 1>&2 65 | 66 | goto fail 67 | 68 | :execute 69 | @rem Setup the command line 70 | 71 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 72 | 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if %ERRORLEVEL% equ 0 goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | set EXIT_CODE=%ERRORLEVEL% 85 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 86 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 87 | exit /b %EXIT_CODE% 88 | 89 | :mainEnd 90 | if "%OS%"=="Windows_NT" endlocal 91 | 92 | :omega 93 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/logo.png -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'design-patterns-java' 2 | -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/chain_of_responsibility/ApplicationLog.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.chain_of_responsibility; 2 | 3 | public class ApplicationLog extends Chain { 4 | 5 | public ApplicationLog() { 6 | super.priority = Chain.ERR_APPLICATION; 7 | } 8 | 9 | public String writeMessage() { 10 | return "Application error logged"; 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/chain_of_responsibility/Chain.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.chain_of_responsibility; 2 | 3 | abstract class Chain { 4 | 5 | protected static final int ERR_SYSTEM = 1; 6 | protected static final int ERR_APPLICATION = 2; 7 | protected static final int ERR_NETWORK = 3; 8 | protected int priority; 9 | private Chain next = null; 10 | 11 | public String handleRequest(int priority) { 12 | if (this.priority == priority) { 13 | return this.writeMessage(); 14 | } else if (next != null) { 15 | return this.next.handleRequest(priority); 16 | } 17 | 18 | return "Request Not Handled"; 19 | } 20 | 21 | public void setNext(Chain nextChain) { 22 | this.next = nextChain; 23 | } 24 | 25 | public abstract String writeMessage(); 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/chain_of_responsibility/NetworkLog.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.chain_of_responsibility; 2 | 3 | public class NetworkLog extends Chain { 4 | 5 | public NetworkLog() { 6 | super.priority = Chain.ERR_NETWORK; 7 | } 8 | 9 | public String writeMessage() { 10 | return "Network error logged"; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/chain_of_responsibility/SystemLog.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.chain_of_responsibility; 2 | 3 | public class SystemLog extends Chain { 4 | 5 | public SystemLog() { 6 | super.priority = Chain.ERR_SYSTEM; 7 | } 8 | 9 | public String writeMessage() { 10 | return "System error logged"; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/command/Command.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.command; 2 | 3 | abstract class Command { 4 | 5 | protected Receiver r; 6 | 7 | public Command(Receiver r) { 8 | this.r = r; 9 | } 10 | 11 | public abstract void execute(); 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/command/Invoker.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.command; 2 | 3 | import java.util.ArrayList; 4 | 5 | class Invoker { 6 | 7 | private ArrayList commands = new ArrayList(); 8 | 9 | public void setCommandAndExecute(Command c) { 10 | commands.add(c); 11 | c.execute(); 12 | } 13 | 14 | public String toString() { 15 | String output = "History:"; 16 | 17 | for (Command command : commands) { 18 | output += "\n" + command.toString(); 19 | } 20 | 21 | return output; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/command/Receiver.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.command; 2 | 3 | class Receiver { 4 | 5 | public void turnOn() { 6 | } 7 | 8 | public void turnOff() { 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/command/TurnOffCommand.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.command; 2 | 3 | class TurnOffCommand extends Command { 4 | 5 | public TurnOffCommand(Receiver r) { 6 | super(r); 7 | } 8 | 9 | public void execute() { 10 | r.turnOff(); 11 | } 12 | 13 | public String toString() { 14 | return "Turn off Command"; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/command/TurnOnCommand.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.command; 2 | 3 | class TurnOnCommand extends Command { 4 | 5 | public TurnOnCommand(Receiver r) { 6 | super(r); 7 | } 8 | 9 | public void execute() { 10 | r.turnOn(); 11 | } 12 | 13 | public String toString() { 14 | return "Turn on Command"; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/iterator/Compound.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.iterator; 2 | 3 | abstract class Compound { 4 | 5 | abstract Iterator getIterator(); 6 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/iterator/ConcreteCompound.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.iterator; 2 | 3 | class ConcreteCompound extends Compound { 4 | 5 | private String word; 6 | 7 | public ConcreteCompound(String word) { 8 | this.word = word; 9 | } 10 | 11 | public Iterator getIterator() { 12 | return new ConcreteIterator(word); 13 | } 14 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/iterator/ConcreteIterator.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.iterator; 2 | 3 | class ConcreteIterator extends Iterator { 4 | 5 | private String word; 6 | private int count = 0; 7 | 8 | public ConcreteIterator(String word) { 9 | this.word = word; 10 | } 11 | 12 | public String current() { 13 | return String.valueOf(word.charAt(count)); 14 | } 15 | 16 | public boolean hasNext() { 17 | return (count + 1 < word.length()); 18 | } 19 | 20 | public String first() { 21 | return String.valueOf(word.charAt(0)); 22 | } 23 | 24 | public String last() { 25 | return String.valueOf(word.charAt(word.length() - 1)); 26 | } 27 | 28 | public String next() { 29 | count++; 30 | 31 | return current(); 32 | } 33 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/iterator/Iterator.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.iterator; 2 | 3 | abstract class Iterator { 4 | 5 | abstract String current(); 6 | 7 | abstract boolean hasNext(); 8 | 9 | abstract String first(); 10 | 11 | abstract String last(); 12 | 13 | abstract String next(); 14 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/mediator/ConcreteMediator.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.mediator; 2 | 3 | class ConcreteMediator implements Mediator { 4 | 5 | private FirstPartner first; 6 | private SecondPartner second; 7 | 8 | public void registerFirstPartner(FirstPartner partner) { 9 | first = partner; 10 | } 11 | 12 | public void registerSecondPartner(SecondPartner partner) { 13 | second = partner; 14 | } 15 | 16 | public String executeFirstPartner() { 17 | return first.execute(); 18 | } 19 | 20 | public String executeSecondPartner() { 21 | return second.execute(); 22 | } 23 | 24 | public FirstPartner getFirstPartner() { 25 | return first; 26 | } 27 | 28 | public SecondPartner getSecondPartner() { 29 | return second; 30 | } 31 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/mediator/FirstPartner.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.mediator; 2 | 3 | class FirstPartner extends Partner { 4 | 5 | public FirstPartner(Mediator mediator) { 6 | super(mediator); 7 | mediator.registerFirstPartner(this); 8 | } 9 | 10 | public String execute() { 11 | return "First Partner"; 12 | } 13 | 14 | public String executePartner() { 15 | return mediator.executeSecondPartner(); 16 | } 17 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/mediator/Mediator.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.mediator; 2 | 3 | interface Mediator { 4 | 5 | void registerFirstPartner(FirstPartner partner); 6 | 7 | void registerSecondPartner(SecondPartner partner); 8 | 9 | String executeFirstPartner(); 10 | 11 | String executeSecondPartner(); 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/mediator/Partner.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.mediator; 2 | 3 | abstract class Partner { 4 | 5 | protected Mediator mediator; 6 | 7 | public Partner(Mediator mediator) { 8 | this.mediator = mediator; 9 | } 10 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/mediator/SecondPartner.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.mediator; 2 | 3 | class SecondPartner extends Partner { 4 | 5 | public SecondPartner(Mediator mediator) { 6 | super(mediator); 7 | mediator.registerSecondPartner(this); 8 | } 9 | 10 | public String execute() { 11 | return "Second Partner"; 12 | } 13 | 14 | public String executePartner() { 15 | return mediator.executeFirstPartner(); 16 | } 17 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/memento/Memento.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.memento; 2 | 3 | class Memento { 4 | 5 | private final String STATE; 6 | 7 | public Memento(String state) { 8 | STATE = state; 9 | } 10 | 11 | public String getSavedState() { 12 | return STATE; 13 | } 14 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/memento/Originator.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.memento; 2 | 3 | class Originator { 4 | 5 | private String state; 6 | 7 | public void setState(String state) { 8 | this.state = state; 9 | } 10 | 11 | public Memento saveToMemento() { 12 | return new Memento(state); 13 | } 14 | 15 | public void restoreFromMemento(Memento memento) { 16 | state = memento.getSavedState(); 17 | } 18 | 19 | public String toString() { 20 | return state; 21 | } 22 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/observer/ConcreteObserver.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.observer; 2 | 3 | class ConcreteObserver extends Observer { 4 | 5 | public ConcreteObserver(Subject observed) { 6 | super(observed); 7 | } 8 | 9 | public void update() { 10 | observedState = observed.getState(); 11 | } 12 | 13 | public String toString() { 14 | return observedState; 15 | } 16 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/observer/ConcreteSubject.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.observer; 2 | 3 | class ConcreteSubject extends Subject { 4 | 5 | private String state; 6 | 7 | public void setState(String s) { 8 | state = s; 9 | notifyObservers(); 10 | } 11 | 12 | public String getState() { 13 | return state; 14 | } 15 | 16 | public String toString() { 17 | return state; 18 | } 19 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/observer/Observer.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.observer; 2 | 3 | abstract class Observer { 4 | 5 | protected String observedState; 6 | protected Subject observed; 7 | 8 | public Observer(Subject observed) { 9 | this.observed = observed; 10 | this.observed.registerObserver(this); 11 | } 12 | 13 | public abstract void update(); 14 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/observer/Subject.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.observer; 2 | 3 | import java.util.ArrayList; 4 | 5 | abstract class Subject { 6 | 7 | protected ArrayList observers = new ArrayList(); 8 | 9 | public void notifyObservers() { 10 | for (Observer observer : observers) { 11 | observer.update(); 12 | } 13 | } 14 | 15 | public void registerObserver(Observer observer) { 16 | observers.add(observer); 17 | } 18 | 19 | public void unregisterObserver(Observer observer) { 20 | observers.remove(observer); 21 | } 22 | 23 | public abstract String getState(); 24 | 25 | public abstract void setState(String s); 26 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/state/CloseState.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.state; 2 | 3 | class CloseState extends State { 4 | 5 | public void request(Context context) { 6 | context.setState(new OpenState()); 7 | } 8 | 9 | public String toString() { 10 | return "Close State"; 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/state/Context.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.state; 2 | 3 | class Context { 4 | 5 | private State state; 6 | 7 | public Context(State state) { 8 | this.state = state; 9 | } 10 | 11 | public void request() { 12 | state.request(this); 13 | } 14 | 15 | public void setState(State state) { 16 | this.state = state; 17 | } 18 | 19 | public String toString() { 20 | return "Context with: " + state.toString(); 21 | } 22 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/state/OpenState.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.state; 2 | 3 | class OpenState extends State { 4 | 5 | public void request(Context context) { 6 | context.setState(new CloseState()); 7 | } 8 | 9 | public String toString() { 10 | return "Open State"; 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/state/State.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.state; 2 | 3 | abstract class State { 4 | 5 | public abstract void request(Context context); 6 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/strategy/Concrete.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.strategy; 2 | 3 | class Concrete { 4 | 5 | protected Strategy strategy; 6 | 7 | public Concrete(Strategy strategy) { 8 | setStrategy(strategy); 9 | } 10 | 11 | public String algorithm() { 12 | return strategy.algorithm(); 13 | } 14 | 15 | public void setStrategy(Strategy strategy) { 16 | this.strategy = strategy; 17 | } 18 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/strategy/FirstStrategy.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.strategy; 2 | 3 | class FirstStrategy extends Strategy { 4 | 5 | public String algorithm() { 6 | return doSomething() + " then " + doSomethingElse(); 7 | } 8 | 9 | private String doSomething() { 10 | return "Do something"; 11 | } 12 | 13 | private String doSomethingElse() { 14 | return "Do something else"; 15 | } 16 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/strategy/SecondStrategy.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.strategy; 2 | 3 | class SecondStrategy extends Strategy { 4 | 5 | public String algorithm() { 6 | return doSomething() + " then " + doSomethingElse() + " and " + doSomethingDifferent(); 7 | } 8 | 9 | private String doSomething() { 10 | return "Do something"; 11 | } 12 | 13 | private String doSomethingElse() { 14 | return "Do something else"; 15 | } 16 | 17 | private String doSomethingDifferent() { 18 | return "Do something different"; 19 | } 20 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/strategy/Strategy.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.strategy; 2 | 3 | abstract class Strategy { 4 | 5 | public abstract String algorithm(); 6 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/template_method/AbstractClass.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.template_method; 2 | 3 | abstract class AbstractClass { 4 | 5 | protected abstract String doSomething(); 6 | 7 | protected abstract String doSomethingElse(); 8 | 9 | public String templateMethod() { 10 | return doSomething() + " then " + doSomethingElse(); 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/template_method/ConcreteClass.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.template_method; 2 | 3 | class ConcreteClass extends AbstractClass { 4 | 5 | protected String doSomething() { 6 | return "I do something"; 7 | } 8 | 9 | protected String doSomethingElse() { 10 | return "I do something else"; 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/visitor/Circle.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.visitor; 2 | 3 | public class Circle extends Figure { 4 | 5 | public Circle() { 6 | setName("Circle"); 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/visitor/Figure.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.visitor; 2 | 3 | abstract class Figure { 4 | 5 | protected String name = "Figure"; 6 | 7 | public void accept(Visitor visitor) { 8 | visitor.visit(this); 9 | } 10 | 11 | public String getName() { 12 | return name; 13 | } 14 | 15 | public void setName(String name) { 16 | this.name = name; 17 | } 18 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/visitor/PrintNameVisitor.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.visitor; 2 | 3 | public class PrintNameVisitor extends Visitor { 4 | 5 | public String visit(Circle figure) { 6 | return figure.getName(); 7 | } 8 | 9 | public String visit(Square figure) { 10 | return figure.getName(); 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/visitor/Square.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.visitor; 2 | 3 | public class Square extends Figure { 4 | 5 | public Square() { 6 | setName("Square"); 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/behavioral/visitor/Visitor.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.visitor; 2 | 3 | abstract class Visitor { 4 | 5 | public String visit(Figure figure) { 6 | return figure.getName(); 7 | } 8 | 9 | abstract String visit(Square figure); 10 | 11 | abstract String visit(Circle figure); 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/abstract_factory/AbstractFactory.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.abstract_factory; 2 | 3 | abstract class AbstractFactory { 4 | 5 | public abstract Product makePack(); 6 | 7 | public abstract Product makeGift(); 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/abstract_factory/FemaleAbstractFactory.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.abstract_factory; 2 | 3 | class FemaleAbstractFactory extends AbstractFactory { 4 | 5 | public Product makeGift() { 6 | return new FemaleGiftProduct(); 7 | } 8 | 9 | public Product makePack() { 10 | return new FemalePackProduct(); 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/abstract_factory/FemaleGiftProduct.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.abstract_factory; 2 | 3 | class FemaleGiftProduct extends Product { 4 | 5 | public String getType() { 6 | return "FemaleGiftProduct"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/abstract_factory/FemalePackProduct.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.abstract_factory; 2 | 3 | class FemalePackProduct extends Product { 4 | 5 | public String getType() { 6 | return "FemalePackProduct"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/abstract_factory/MaleAbstractFactory.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.abstract_factory; 2 | 3 | class MaleAbstractFactory extends AbstractFactory { 4 | 5 | public Product makeGift() { 6 | return new MaleGiftProduct(); 7 | } 8 | 9 | public Product makePack() { 10 | return new MalePackProduct(); 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/abstract_factory/MaleGiftProduct.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.abstract_factory; 2 | 3 | class MaleGiftProduct extends Product { 4 | 5 | public String getType() { 6 | return "MaleGiftProduct"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/abstract_factory/MalePackProduct.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.abstract_factory; 2 | 3 | class MalePackProduct extends Product { 4 | 5 | public String getType() { 6 | return "MalePackProduct"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/abstract_factory/Product.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.abstract_factory; 2 | 3 | abstract class Product { 4 | 5 | public abstract String getType(); 6 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/builder/Pizza.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.builder; 2 | 3 | import java.util.ArrayList; 4 | import java.util.ListIterator; 5 | 6 | public class Pizza { 7 | 8 | private ArrayList ingredients; 9 | private String name; 10 | private int price; 11 | 12 | public Pizza() { 13 | } 14 | 15 | public Pizza(String name) { 16 | setName(name); 17 | } 18 | 19 | public Pizza(PizzaBuilder builder) { 20 | setIngredients(builder.getIngredients()); 21 | setName(builder.getName()); 22 | setPrice(builder.getPrice()); 23 | } 24 | 25 | public void setIngredients(ArrayList ingredients) { 26 | this.ingredients = ingredients; 27 | } 28 | 29 | public void setName(String name) { 30 | this.name = name; 31 | } 32 | 33 | public void setPrice(int price) { 34 | this.price = price; 35 | } 36 | 37 | public String toString() { 38 | String string = "Ingredients"; 39 | 40 | for (String ingredient : ingredients) { 41 | string += " " + ingredient; 42 | } 43 | 44 | return string + "; Price: " + this.price + "; Name: " + this.name; 45 | } 46 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/builder/PizzaBuilder.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.builder; 2 | 3 | import java.util.ArrayList; 4 | 5 | abstract public class PizzaBuilder { 6 | 7 | protected ArrayList ingredients; 8 | protected String name; 9 | protected int price; 10 | protected Pizza pizza; 11 | 12 | public Pizza getPizza() { 13 | return new Pizza(this); 14 | } 15 | 16 | public void setIngredients(ArrayList ingredients) { 17 | this.ingredients = ingredients; 18 | } 19 | 20 | public void setName(String name) { 21 | this.name = name; 22 | } 23 | 24 | public void setPrice(int price) { 25 | this.price = price; 26 | } 27 | 28 | public ArrayList getIngredients() { 29 | return this.ingredients; 30 | } 31 | 32 | public String getName() { 33 | return this.name; 34 | } 35 | 36 | public int getPrice() { 37 | return this.price; 38 | } 39 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/builder/PizzaMargheritaBuilder.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.builder; 2 | 3 | import java.util.ArrayList; 4 | 5 | public class PizzaMargheritaBuilder extends PizzaBuilder { 6 | 7 | public PizzaMargheritaBuilder() { 8 | this.name = "margherita"; 9 | this.ingredients = new ArrayList() {{ 10 | add("pomodoro"); 11 | add("mozzarella"); 12 | }}; 13 | } 14 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/factory_method/Creator.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.factory_method; 2 | 3 | abstract class Creator { 4 | 5 | abstract Product factoryMethod(); 6 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/factory_method/LimitedCreator.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.factory_method; 2 | 3 | class LimitedCreator extends Creator { 4 | 5 | public Product factoryMethod() { 6 | return new LimitedProduct(); 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/factory_method/LimitedProduct.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.factory_method; 2 | 3 | class LimitedProduct extends Product { 4 | 5 | public String getType() { 6 | return "LimitedProduct"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/factory_method/Product.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.factory_method; 2 | 3 | abstract class Product { 4 | 5 | public abstract String getType(); 6 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/factory_method/SpecialCreator.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.factory_method; 2 | 3 | class SpecialCreator extends Creator { 4 | 5 | public Product factoryMethod() { 6 | return new SpecialProduct(); 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/factory_method/SpecialProduct.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.factory_method; 2 | 3 | class SpecialProduct extends Product { 4 | 5 | public String getType() { 6 | return "SpecialProduct"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/prototype/CloneableObject.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.prototype; 2 | 3 | class CloneableObject extends Prototype { 4 | 5 | private final int ID; 6 | 7 | public CloneableObject(int id) { 8 | ID = id; 9 | } 10 | 11 | public Prototype clone() { 12 | return new CloneableObject(ID); 13 | } 14 | 15 | public int getId() { 16 | return ID; 17 | } 18 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/prototype/Prototype.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.prototype; 2 | 3 | abstract class Prototype { 4 | 5 | protected abstract Prototype clone(); 6 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/creational/singleton/Singleton.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.singleton; 2 | 3 | class Singleton { 4 | 5 | private static Singleton instance; 6 | 7 | private Singleton() { 8 | } 9 | 10 | public static synchronized Singleton getInstance() { 11 | if (instance == null) { 12 | Singleton.instance = new Singleton(); 13 | } 14 | 15 | return instance; 16 | } 17 | 18 | protected String doSomething() { 19 | return "I do something"; 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/bridge/Circle.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.bridge; 2 | 3 | class Circle extends Shape { 4 | 5 | public Circle(DrawProgram drawProgram) { 6 | super(drawProgram); 7 | } 8 | 9 | public String draw() { 10 | return drawProgram.drawCircle(); 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/bridge/DrawProgram.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.bridge; 2 | 3 | abstract class DrawProgram { 4 | 5 | public abstract String drawCircle(); 6 | 7 | public abstract String drawLine(); 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/bridge/DrawProgram1.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.bridge; 2 | 3 | class DrawProgram1 extends DrawProgram { 4 | 5 | public String drawCircle() { 6 | return "DrawProgram1: Circle"; 7 | } 8 | 9 | public String drawLine() { 10 | return "DrawProgram1: Line"; 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/bridge/DrawProgram2.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.bridge; 2 | 3 | class DrawProgram2 extends DrawProgram { 4 | 5 | public String drawCircle() { 6 | return "DrawProgram2: Circle"; 7 | } 8 | 9 | public String drawLine() { 10 | return "DrawProgram2: Line"; 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/bridge/Line.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.bridge; 2 | 3 | class Line extends Shape { 4 | 5 | public Line(DrawProgram drawProgram) { 6 | super(drawProgram); 7 | } 8 | 9 | public String draw() { 10 | return drawProgram.drawLine(); 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/bridge/Shape.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.bridge; 2 | 3 | abstract class Shape { 4 | 5 | protected DrawProgram drawProgram; 6 | 7 | public Shape(DrawProgram drawProgram) { 8 | this.drawProgram = drawProgram; 9 | } 10 | 11 | public abstract String draw(); 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/class_adapter/AdapterRectangle.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.class_adapter; 2 | 3 | class AdapterRectangle extends Rectangle implements Figure { 4 | 5 | public String draw() { 6 | return this.drawRectangle(); 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/class_adapter/Figure.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.class_adapter; 2 | 3 | interface Figure { 4 | 5 | public String draw(); 6 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/class_adapter/Line.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.class_adapter; 2 | 3 | class Line implements Figure { 4 | 5 | public String draw() { 6 | return "Draw: Line"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/class_adapter/Rectangle.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.class_adapter; 2 | 3 | class Rectangle { 4 | 5 | public String drawRectangle() { 6 | return "Draw: Rectangle"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/composite/Composite.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.composite; 2 | 3 | import java.util.ArrayList; 4 | 5 | class Composite extends Figure { 6 | 7 | private ArrayList
figures = new ArrayList
(); 8 | 9 | public String draw() { 10 | String s = ""; 11 | 12 | for (Figure f : figures) { 13 | s += f.draw() + " "; 14 | } 15 | 16 | return s; 17 | } 18 | 19 | public void remove(Figure figure) { 20 | figures.remove(figure); 21 | } 22 | 23 | public void add(Figure figure) { 24 | figures.add(figure); 25 | } 26 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/composite/Figure.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.composite; 2 | 3 | abstract class Figure { 4 | 5 | public abstract String draw(); 6 | 7 | public void add(Figure figure) { 8 | } 9 | 10 | public void remove(Figure figure) { 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/composite/Line.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.composite; 2 | 3 | class Line extends Figure { 4 | 5 | public String draw() { 6 | return "Draw: Line"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/composite/Point.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.composite; 2 | 3 | class Point extends Figure { 4 | 5 | public String draw() { 6 | return "Draw: Point"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/decorator/Coffee.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.decorator; 2 | 3 | abstract class Coffee { 4 | 5 | public abstract double getCost(); 6 | 7 | public abstract String getIngredients(); 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/decorator/CoffeeDecorator.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.decorator; 2 | 3 | abstract class CoffeeDecorator extends Coffee { 4 | 5 | private final Coffee decorator; 6 | 7 | public CoffeeDecorator(Coffee decorator) { 8 | this.decorator = decorator; 9 | } 10 | 11 | public double getCost() { 12 | return decorator.getCost(); 13 | } 14 | 15 | public String getIngredients() { 16 | return decorator.getIngredients(); 17 | } 18 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/decorator/Milk.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.decorator; 2 | 3 | class Milk extends CoffeeDecorator { 4 | 5 | public Milk(Coffee decorator) { 6 | super(decorator); 7 | } 8 | 9 | public double getCost() { 10 | return super.getCost() + 0.5; 11 | } 12 | 13 | public String getIngredients() { 14 | return super.getIngredients() + ", " + "Milk"; 15 | } 16 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/decorator/SimpleCoffee.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.decorator; 2 | 3 | class SimpleCoffee extends Coffee { 4 | 5 | public double getCost() { 6 | return 1; 7 | } 8 | 9 | public String getIngredients() { 10 | return "SimpleCoffee"; 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/decorator/Sugar.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.decorator; 2 | 3 | class Sugar extends CoffeeDecorator { 4 | 5 | public Sugar(Coffee decorator) { 6 | super(decorator); 7 | } 8 | 9 | public String getIngredients() { 10 | return super.getIngredients() + ", " + "Sugar"; 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/facade/Caffeine.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.facade; 2 | 3 | class Caffeine { 4 | 5 | public String addCaffeine() { 6 | return "Caffeine"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/facade/Facade.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.facade; 2 | 3 | class Facade { 4 | 5 | public String makeCoffee() { 6 | Sugar s = new Sugar(); 7 | Caffeine c = new Caffeine(); 8 | Water w = new Water(); 9 | 10 | return "Coffee = " + w.addWater() + " + " + c.addCaffeine() + " + " + s.addSugar(); 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/facade/Sugar.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.facade; 2 | 3 | class Sugar { 4 | 5 | public String addSugar() { 6 | return "Sugar"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/facade/Water.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.facade; 2 | 3 | class Water { 4 | 5 | public String addWater() { 6 | return "Water"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/flyweight/CoffeeFlavour.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.flyweight; 2 | 3 | class CoffeeFlavour { 4 | 5 | private final String FLAVOUR; 6 | 7 | public CoffeeFlavour(String flavourName) { 8 | FLAVOUR = flavourName; 9 | } 10 | 11 | public String getFlavourName() { 12 | return FLAVOUR; 13 | } 14 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/flyweight/CoffeeShop.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.flyweight; 2 | 3 | import java.util.ArrayList; 4 | 5 | class CoffeeShop { 6 | 7 | private Menu menu = new Menu(); 8 | private ArrayList orders = new ArrayList(); 9 | 10 | public void getOrder(int tableNumber, String coffeeFlavour) { 11 | orders.add(new Order(tableNumber, menu.lookup(coffeeFlavour))); 12 | } 13 | 14 | public String toString() { 15 | String report = ""; 16 | 17 | for (Order order : orders) { 18 | report += order.toString() + "\n"; 19 | } 20 | 21 | return report; 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/flyweight/Menu.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.flyweight; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | class Menu { 7 | 8 | private Map coffeeFlavours = new HashMap(); 9 | 10 | public CoffeeFlavour lookup(String flavorName) { 11 | if (!coffeeFlavours.containsKey(flavorName)) { 12 | coffeeFlavours.put(flavorName, new CoffeeFlavour(flavorName)); 13 | } 14 | 15 | return coffeeFlavours.get(flavorName); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/flyweight/Order.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.flyweight; 2 | 3 | class Order { 4 | 5 | private final int TABLE_NUMBER; 6 | private final CoffeeFlavour COFFEE_FLAVOUR; 7 | 8 | public Order(int tableNumber, CoffeeFlavour coffeeFlavour) { 9 | TABLE_NUMBER = tableNumber; 10 | COFFEE_FLAVOUR = coffeeFlavour; 11 | } 12 | 13 | public String toString() { 14 | return "Order at table: " + TABLE_NUMBER + ", coffee flavour: " + COFFEE_FLAVOUR 15 | .getFlavourName(); 16 | } 17 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/object_adapter/AdapterRectangle.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.object_adapter; 2 | 3 | class AdapterRectangle implements Figure { 4 | 5 | private Rectangle rectangle = new Rectangle(); 6 | 7 | public String draw() { 8 | return rectangle.drawRectangle(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/object_adapter/Figure.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.object_adapter; 2 | 3 | interface Figure { 4 | 5 | public String draw(); 6 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/object_adapter/Line.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.object_adapter; 2 | 3 | class Line implements Figure { 4 | 5 | public String draw() { 6 | return "Draw: Line"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/object_adapter/Rectangle.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.object_adapter; 2 | 3 | class Rectangle { 4 | 5 | public String drawRectangle() { 6 | return "Draw: Rectangle"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/proxy/File.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.proxy; 2 | 3 | abstract class File { 4 | 5 | protected boolean isProtected = true; 6 | 7 | public abstract String read(); 8 | 9 | public void setProtection(boolean isProtected) { 10 | this.isProtected = isProtected; 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/proxy/ProxyProtectedFile.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.proxy; 2 | 3 | class ProxyProtectedFile extends File { 4 | 5 | private File file; 6 | 7 | public ProxyProtectedFile() { 8 | file = new PublicFile(); 9 | } 10 | 11 | public String read() { 12 | return isProtected ? "Read: File is Protected" : file.read(); 13 | } 14 | } -------------------------------------------------------------------------------- /src/main/java/design_patterns/structural/proxy/PublicFile.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.proxy; 2 | 3 | class PublicFile extends File { 4 | 5 | public String read() { 6 | return "Read: File"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/resources/img/uml-abstract-factory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-abstract-factory.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-bridge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-bridge.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-builder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-builder.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-chain-of-responsability.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-chain-of-responsability.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-class-adapter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-class-adapter.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-command.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-command.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-composite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-composite.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-decorator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-decorator.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-facade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-facade.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-factory-method.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-factory-method.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-flyweight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-flyweight.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-iterator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-iterator.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-mediator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-mediator.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-memento.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-memento.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-object-adapter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-object-adapter.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-observer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-observer.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-prototype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-prototype.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-proxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-proxy.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-singleton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-singleton.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-state.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-state.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-strategy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-strategy.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-template-method.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-template-method.png -------------------------------------------------------------------------------- /src/main/resources/img/uml-visitor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexprut/design-patterns-java/12993a3cb0fbd825d857db5b904a46193e387d91/src/main/resources/img/uml-visitor.png -------------------------------------------------------------------------------- /src/test/java/design_patterns/behavioral/chain_of_responsibility/ChainOfResponsibilityTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.chain_of_responsibility; 2 | 3 | import org.junit.*; 4 | 5 | public class ChainOfResponsibilityTest { 6 | 7 | @Test 8 | public void designPatternTest() { 9 | Chain chain = new NetworkLog(); 10 | Chain second = new SystemLog(); 11 | Chain third = new ApplicationLog(); 12 | 13 | chain.setNext(second); 14 | second.setNext(third); 15 | 16 | Assert.assertEquals(chain.handleRequest(Chain.ERR_APPLICATION), "Application error logged"); 17 | Assert.assertEquals(chain.handleRequest(Chain.ERR_SYSTEM), "System error logged"); 18 | Assert.assertEquals(chain.handleRequest(Chain.ERR_NETWORK), "Network error logged"); 19 | Assert.assertEquals(chain.handleRequest(100), "Request Not Handled"); 20 | } 21 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/behavioral/command/CommandTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.command; 2 | 3 | import org.junit.*; 4 | 5 | public class CommandTest { 6 | 7 | @Test 8 | public void designPatternTest() { 9 | Receiver r = new Receiver(); 10 | Command c1 = new TurnOnCommand(r); 11 | Command c2 = new TurnOffCommand(r); 12 | Invoker i = new Invoker(); 13 | 14 | i.setCommandAndExecute(c1); 15 | i.setCommandAndExecute(c2); 16 | i.setCommandAndExecute(c1); 17 | i.setCommandAndExecute(c2); 18 | 19 | Assert.assertEquals( 20 | i.toString(), 21 | "History:\nTurn on Command\nTurn off Command\nTurn on Command\nTurn off Command" 22 | ); 23 | } 24 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/behavioral/iterator/ConcreteCompoundTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.iterator; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class ConcreteCompoundTest { 7 | 8 | @Test 9 | public void designPatternTest() { 10 | Compound c = new ConcreteCompound("random word"); 11 | Iterator it = c.getIterator(); 12 | 13 | String output = it.current(); 14 | while (it.hasNext()) { 15 | output += it.next(); 16 | } 17 | 18 | Assert.assertEquals(output, "random word"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/test/java/design_patterns/behavioral/iterator/ConcreteIteratorTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.iterator; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Before; 5 | import org.junit.Test; 6 | 7 | public class ConcreteIteratorTest { 8 | 9 | private Iterator iterator; 10 | 11 | @Before 12 | public void init() { 13 | iterator = new ConcreteIterator("random word"); 14 | } 15 | 16 | @Test 17 | public void last() { 18 | Assert.assertEquals(iterator.last(), "d"); 19 | } 20 | 21 | @Test 22 | public void first() { 23 | Assert.assertEquals(iterator.first(), "r"); 24 | } 25 | 26 | @Test 27 | public void hasNext() { 28 | Assert.assertTrue(iterator.hasNext()); 29 | } 30 | 31 | @Test 32 | public void current() { 33 | Assert.assertEquals(iterator.current(), "r"); 34 | } 35 | 36 | @Test 37 | public void next() { 38 | Assert.assertEquals(iterator.next(), "a"); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/test/java/design_patterns/behavioral/mediator/MediatorTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.mediator; 2 | 3 | import org.junit.*; 4 | 5 | public class MediatorTest { 6 | 7 | @Test 8 | public void designPatternTest() { 9 | Mediator mediator = new ConcreteMediator(); 10 | FirstPartner firstPartner = new FirstPartner(mediator); 11 | SecondPartner secondPartner = new SecondPartner(mediator); 12 | 13 | Assert.assertEquals(firstPartner.execute(), "First Partner"); 14 | Assert.assertEquals(secondPartner.execute(), "Second Partner"); 15 | Assert.assertEquals(firstPartner.executePartner(), "Second Partner"); 16 | Assert.assertEquals(secondPartner.executePartner(), "First Partner"); 17 | } 18 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/behavioral/memento/MementoTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.memento; 2 | 3 | import java.util.ArrayList; 4 | import org.junit.*; 5 | 6 | public class MementoTest { 7 | 8 | @Test 9 | public void designPatternTest() { 10 | ArrayList savedStates = new ArrayList(); 11 | Originator origin = new Originator(); 12 | 13 | origin.setState("first"); 14 | Assert.assertEquals(origin.toString(), "first"); 15 | 16 | savedStates.add(origin.saveToMemento()); 17 | origin.setState("second"); 18 | Assert.assertEquals(origin.toString(), "second"); 19 | 20 | origin.restoreFromMemento(savedStates.get(0)); 21 | Assert.assertEquals(origin.toString(), "first"); 22 | } 23 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/behavioral/observer/ObserverTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.observer; 2 | 3 | import org.junit.*; 4 | 5 | public class ObserverTest { 6 | 7 | @Test 8 | public void designPatternTest() { 9 | Subject observed = new ConcreteSubject(); 10 | Observer observer = new ConcreteObserver(observed); 11 | 12 | Assert.assertNull(observed.getState()); 13 | Assert.assertNull(observer.toString()); 14 | 15 | observed.setState("something"); 16 | 17 | Assert.assertEquals(observed.getState(), "something"); 18 | Assert.assertEquals(observer.toString(), "something"); 19 | } 20 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/behavioral/state/StateTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.state; 2 | 3 | import org.junit.*; 4 | 5 | public class StateTest { 6 | 7 | @Test 8 | public void designPatternTest() { 9 | Context c = new Context(new OpenState()); 10 | 11 | Assert.assertEquals(c.toString(), "Context with: Open State"); 12 | 13 | c.request(); 14 | Assert.assertEquals(c.toString(), "Context with: Close State"); 15 | } 16 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/behavioral/strategy/StrategyTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.strategy; 2 | 3 | import org.junit.*; 4 | 5 | public class StrategyTest { 6 | 7 | @Test 8 | public void designPatternTest() { 9 | Strategy s1 = new FirstStrategy(); 10 | Strategy s2 = new SecondStrategy(); 11 | Concrete concrete = new Concrete(s1); 12 | 13 | Assert.assertEquals(concrete.algorithm(), "Do something then Do something else"); 14 | 15 | concrete.setStrategy(s2); 16 | Assert.assertEquals( 17 | concrete.algorithm(), 18 | "Do something then Do something else and Do something different" 19 | ); 20 | } 21 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/behavioral/template_method/TemplateMethodTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.template_method; 2 | 3 | import org.junit.*; 4 | 5 | public class TemplateMethodTest { 6 | 7 | @Test 8 | public void designPatternTest() { 9 | AbstractClass c = new ConcreteClass(); 10 | 11 | Assert.assertEquals(c.templateMethod(), "I do something then I do something else"); 12 | } 13 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/behavioral/visitor/VisitorTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.behavioral.visitor; 2 | 3 | import org.junit.*; 4 | 5 | public class VisitorTest { 6 | 7 | @Test 8 | public void designPatternTest() { 9 | Visitor visitor = new PrintNameVisitor(); 10 | Circle circle = new Circle(); 11 | Square square = new Square(); 12 | 13 | Assert.assertEquals(visitor.visit(circle), "Circle"); 14 | Assert.assertEquals(visitor.visit(square), "Square"); 15 | } 16 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/creational/abstract_factory/FemaleAbstractFactoryTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.abstract_factory; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class FemaleAbstractFactoryTest { 7 | 8 | @Test 9 | public void designPatternTest() { 10 | AbstractFactory factory = new FemaleAbstractFactory(); 11 | Product gift = factory.makeGift(); 12 | Product pack = factory.makePack(); 13 | 14 | Assert.assertTrue(gift instanceof FemaleGiftProduct); 15 | Assert.assertTrue(pack instanceof FemalePackProduct); 16 | Assert.assertEquals(gift.getType(), "FemaleGiftProduct"); 17 | Assert.assertEquals(pack.getType(), "FemalePackProduct"); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/test/java/design_patterns/creational/abstract_factory/MaleAbstractFactoryTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.abstract_factory; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class MaleAbstractFactoryTest { 7 | 8 | @Test 9 | public void designPatternTest() { 10 | AbstractFactory factory = new MaleAbstractFactory(); 11 | Product gift = factory.makeGift(); 12 | Product pack = factory.makePack(); 13 | 14 | Assert.assertTrue(gift instanceof MaleGiftProduct); 15 | Assert.assertTrue(pack instanceof MalePackProduct); 16 | Assert.assertEquals(gift.getType(), "MaleGiftProduct"); 17 | Assert.assertEquals(pack.getType(), "MalePackProduct"); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/test/java/design_patterns/creational/builder/PizzaMargheritaBuilderTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.builder; 2 | 3 | import org.junit.*; 4 | 5 | public class PizzaMargheritaBuilderTest { 6 | 7 | @Test 8 | public void properSerialization() { 9 | PizzaMargheritaBuilder pizzaBuilder = new PizzaMargheritaBuilder(); 10 | pizzaBuilder.setPrice(3); 11 | Pizza p1 = pizzaBuilder.getPizza(); 12 | Pizza p2 = new Pizza(pizzaBuilder); 13 | 14 | Assert.assertEquals(p1.toString(), p2.toString()); 15 | Assert.assertEquals(p1.toString(), "Ingredients pomodoro mozzarella; Price: 3; Name: margherita"); 16 | } 17 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/creational/builder/PizzaTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.builder; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | import org.junit.Assert; 6 | import org.junit.Test; 7 | 8 | public class PizzaTest { 9 | 10 | @Test 11 | public void properSerialization() { 12 | Pizza p = new Pizza(); 13 | p.setPrice(1); 14 | p.setName("marinara"); 15 | p.setIngredients(new ArrayList(Arrays.asList("mozzarella", "pomodoro"))); 16 | 17 | Assert.assertEquals(p.toString(), "Ingredients mozzarella pomodoro; Price: 1; Name: marinara"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/test/java/design_patterns/creational/factory_method/FactoryMethodTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.factory_method; 2 | 3 | import org.junit.*; 4 | 5 | public class FactoryMethodTest { 6 | 7 | @Test 8 | public void designPatterTest() { 9 | Creator specialCreator = new SpecialCreator(); 10 | Creator limitedCreator = new LimitedCreator(); 11 | Product specialProduct = specialCreator.factoryMethod(); 12 | Product limitedProduct = limitedCreator.factoryMethod(); 13 | 14 | Assert.assertEquals(specialProduct.getType(), "SpecialProduct"); 15 | Assert.assertEquals(limitedProduct.getType(), "LimitedProduct"); 16 | } 17 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/creational/prototype/CloneableObjectTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.prototype; 2 | 3 | import org.junit.*; 4 | 5 | public class CloneableObjectTest { 6 | 7 | @Test 8 | public void isCloneDifferentWithSameData() { 9 | int id = 1; 10 | CloneableObject o1 = new CloneableObject(id); 11 | CloneableObject o2 = (CloneableObject) o1.clone(); 12 | 13 | Assert.assertNotSame(o1, o2); 14 | Assert.assertEquals(id, o2.getId()); 15 | Assert.assertEquals(id, o1.getId()); 16 | } 17 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/creational/singleton/SingletonTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.creational.singleton; 2 | 3 | import org.junit.*; 4 | 5 | public class SingletonTest { 6 | 7 | @Test 8 | public void isSameInstance() { 9 | Singleton s = Singleton.getInstance(); 10 | 11 | Assert.assertEquals(s, Singleton.getInstance()); 12 | Assert.assertEquals(s.doSomething(), "I do something"); 13 | } 14 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/structural/bridge/BridgeTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.bridge; 2 | 3 | import org.junit.*; 4 | 5 | public class BridgeTest { 6 | 7 | @Test 8 | public void designPatternTest() { 9 | DrawProgram dp1 = new DrawProgram1(); 10 | DrawProgram dp2 = new DrawProgram2(); 11 | Shape[] shapes = new Shape[]{ 12 | new Circle(dp1), 13 | new Circle(dp2), 14 | new Line(dp1), 15 | new Line(dp2) 16 | }; 17 | 18 | Assert.assertEquals(shapes[0].draw(), "DrawProgram1: Circle"); 19 | Assert.assertEquals(shapes[1].draw(), "DrawProgram2: Circle"); 20 | Assert.assertEquals(shapes[2].draw(), "DrawProgram1: Line"); 21 | Assert.assertEquals(shapes[3].draw(), "DrawProgram2: Line"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/test/java/design_patterns/structural/class_adapter/ClassAdapterTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.class_adapter; 2 | 3 | import org.junit.*; 4 | 5 | public class ClassAdapterTest { 6 | 7 | @Test 8 | public void designPatternTest() { 9 | Figure[] figures = new Figure[]{ 10 | new Line(), 11 | new AdapterRectangle() 12 | }; 13 | 14 | Assert.assertEquals(figures[0].draw(), "Draw: Line"); 15 | Assert.assertEquals(figures[1].draw(), "Draw: Rectangle"); 16 | } 17 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/structural/composite/CompositeTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.composite; 2 | 3 | import org.junit.*; 4 | 5 | public class CompositeTest { 6 | 7 | @Test 8 | public void doesDraw() { 9 | Figure c = new Composite(); 10 | c.add(new Point()); 11 | c.add(new Line()); 12 | 13 | Assert.assertEquals(c.draw(), "Draw: Point Draw: Line "); 14 | } 15 | 16 | @Test 17 | public void doesAddFigure() { 18 | Figure c = new Composite(); 19 | Assert.assertEquals(c.draw(), ""); 20 | 21 | c.add(new Point()); 22 | Assert.assertEquals(c.draw(), "Draw: Point "); 23 | } 24 | 25 | @Test 26 | public void doesRemoveFigure() { 27 | Figure c = new Composite(); 28 | Figure p = new Point(); 29 | c.add(p); 30 | c.remove(p); 31 | 32 | Assert.assertEquals(c.draw(), ""); 33 | } 34 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/structural/composite/LineTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.composite; 2 | 3 | import org.junit.*; 4 | 5 | public class LineTest { 6 | 7 | @Test 8 | public void doesDraw() { 9 | Figure l = new Line(); 10 | 11 | Assert.assertEquals(l.draw(), "Draw: Line"); 12 | } 13 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/structural/composite/PointTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.composite; 2 | 3 | import org.junit.*; 4 | 5 | public class PointTest { 6 | 7 | @Test 8 | public void doesDraw() { 9 | Figure p = new Point(); 10 | 11 | Assert.assertEquals(p.draw(), "Draw: Point"); 12 | } 13 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/structural/decorator/DecoratorTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.decorator; 2 | 3 | import org.junit.*; 4 | 5 | public class DecoratorTest { 6 | 7 | @Test 8 | public void designPatternTest() { 9 | Coffee c = new SimpleCoffee(); 10 | Coffee custom = new Sugar(new Milk(c)); 11 | 12 | Assert.assertEquals(custom.getIngredients(), "SimpleCoffee, Milk, Sugar"); 13 | Assert.assertEquals(custom.getCost(), 1.5, 0); 14 | } 15 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/structural/facade/CaffeineTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.facade; 2 | 3 | import org.junit.*; 4 | 5 | public class CaffeineTest { 6 | 7 | @Test 8 | public void doesAddCaffeine() { 9 | Caffeine c = new Caffeine(); 10 | 11 | Assert.assertEquals(c.addCaffeine(), "Caffeine"); 12 | } 13 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/structural/facade/FacadeTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.facade; 2 | 3 | import org.junit.*; 4 | 5 | public class FacadeTest { 6 | 7 | @Test 8 | public void designPatternTest() { 9 | Facade f = new Facade(); 10 | 11 | Assert.assertEquals(f.makeCoffee(), "Coffee = Water + Caffeine + Sugar"); 12 | } 13 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/structural/facade/SugarTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.facade; 2 | 3 | import org.junit.*; 4 | 5 | public class SugarTest { 6 | 7 | @Test 8 | public void doesAddSugar() { 9 | Sugar s = new Sugar(); 10 | 11 | Assert.assertEquals(s.addSugar(), "Sugar"); 12 | } 13 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/structural/facade/WaterTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.facade; 2 | 3 | import org.junit.*; 4 | 5 | public class WaterTest { 6 | 7 | @Test 8 | public void doesAddWater() { 9 | Water w = new Water(); 10 | 11 | Assert.assertEquals(w.addWater(), "Water"); 12 | } 13 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/structural/flyweight/CoffeeFlavourTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.flyweight; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class CoffeeFlavourTest { 7 | 8 | @Test 9 | public void isFlavorSet() { 10 | CoffeeFlavour cf = new CoffeeFlavour("exotic"); 11 | 12 | Assert.assertEquals(cf.getFlavourName(), "exotic"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/test/java/design_patterns/structural/flyweight/CoffeeShopTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.flyweight; 2 | 3 | import org.junit.*; 4 | 5 | public class CoffeeShopTest { 6 | 7 | @Test 8 | public void designPatternTest() { 9 | CoffeeShop shop = new CoffeeShop(); 10 | shop.getOrder(1, "espresso"); 11 | shop.getOrder(7, "macchiato"); 12 | 13 | Assert.assertEquals( 14 | shop.toString(), 15 | "Order at table: 1, coffee flavour: espresso\nOrder at table: 7, coffee flavour: macchiato\n" 16 | ); 17 | } 18 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/structural/flyweight/MenuTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.flyweight; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class MenuTest { 7 | 8 | @Test 9 | public void lookupCreationSingleFlavour() { 10 | Menu m = new Menu(); 11 | CoffeeFlavour cf = m.lookup("exotic"); 12 | 13 | Assert.assertEquals(m.lookup("exotic"), cf); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/test/java/design_patterns/structural/flyweight/OrderTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.flyweight; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class OrderTest { 7 | 8 | @Test 9 | public void getOrder() { 10 | Order order = new Order(1, new CoffeeFlavour("exotic")); 11 | 12 | Assert.assertEquals(order.toString(), "Order at table: 1, coffee flavour: exotic"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/test/java/design_patterns/structural/object_adapter/ObjectAdapterTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.object_adapter; 2 | 3 | import org.junit.*; 4 | 5 | public class ObjectAdapterTest { 6 | 7 | @Test 8 | public void designPatternTest() { 9 | Figure[] figures = new Figure[]{ 10 | new Line(), 11 | new AdapterRectangle() 12 | }; 13 | 14 | Assert.assertEquals(figures[0].draw(), "Draw: Line"); 15 | Assert.assertEquals(figures[1].draw(), "Draw: Rectangle"); 16 | } 17 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/structural/proxy/ProxyProtectedFileTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.proxy; 2 | 3 | import org.junit.*; 4 | 5 | public class ProxyProtectedFileTest { 6 | 7 | @Test 8 | public void readProtectedFile() { 9 | File file = new ProxyProtectedFile(); 10 | 11 | Assert.assertEquals(file.read(), "Read: File is Protected"); 12 | } 13 | 14 | @Test 15 | public void readUnprotectedFile() { 16 | File file = new ProxyProtectedFile(); 17 | file.setProtection(false); 18 | 19 | Assert.assertEquals(file.read(), "Read: File"); 20 | } 21 | } -------------------------------------------------------------------------------- /src/test/java/design_patterns/structural/proxy/ProxyTest.java: -------------------------------------------------------------------------------- 1 | package design_patterns.structural.proxy; 2 | 3 | import org.junit.*; 4 | 5 | public class ProxyTest { 6 | 7 | @Test 8 | public void designPatternTest() { 9 | File[] files = new File[]{ 10 | new ProxyProtectedFile(), 11 | new PublicFile() 12 | }; 13 | 14 | Assert.assertEquals(files[0].read(), "Read: File is Protected"); 15 | Assert.assertEquals(files[1].read(), "Read: File"); 16 | } 17 | } --------------------------------------------------------------------------------