Compare commits

...
Author SHA1 Message Date
dependabot[bot] 41625d8d35 build(deps): bump org.apache.kafka:kafka-clients (#3574)
Bumps org.apache.kafka:kafka-clients from 3.6.1 to 3.9.2.

---
updated-dependencies:
- dependency-name: org.apache.kafka:kafka-clients
  dependency-version: 3.9.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-30 14:52:26 +03:00
dependabot[bot] 6055caf34a build(deps): bump com.fasterxml.jackson.core:jackson-databind (#3573)
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.16.1 to 2.18.9.
- [Commits](https://github.com/FasterXML/jackson/commits)

---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
  dependency-version: 2.18.9
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-30 14:47:21 +03:00
Mukul Howale 3dad8220bb feat: transactional outbox pattern (#3589)
* Add transactional-outbox module

Introduce a new transactional-outbox Maven module demonstrating the Transactional Outbox pattern. Adds a Spring Boot sample app and README explaining the pattern. New code includes Order and OutboxEvent entities, OrderStatus/EventStatus enums, Spring Data repositories (OrderRepository, OutboxRepository), OrderService (atomic write of order + outbox), OutboxPublisher (scheduled poll & publish), MessageBroker interface and MessageConsumer implementation, and App entrypoint. Includes unit tests (AppTest, OrderServiceTest, OutboxPublisherTest). Root pom.xml updated to register the new module. Module uses Spring Data JPA, Spring Web, Lombok, H2 and standard test dependencies.

* Add OutboxPublisher edge-case tests

Add two unit tests for OutboxPublisher: one verifies processOutboxEvents returns an empty list when there are no pending events; the other simulates a MessageBroker exception to ensure the event status is set to FAILED and the repository.save is called. Added necessary Mockito and assertion imports to support the tests.

* Use MockitoExtension for OutboxPublisher test

Replace the legacy inline/mock-based test with a JUnit5 + MockitoExtension unit test. Adds OutboxPublisherUnitTest (uses @ExtendWith(MockitoExtension.class), @Mock and @InjectMocks) that verifies broker exceptions mark events as FAILED and that the repository.save(...) is called. Removes the duplicate inline-mocking test and unused Mockito imports from OutboxPublisherTest.

* Replace Lombok @Slf4j with explicit Logger

Remove Lombok's @Slf4j and add explicit org.slf4j.Logger/LoggerFactory fields in transactional-outbox classes.
This makes logging explicit and removes reliance on Lombok's @Slf4j annotation.

* Add scheduled wrapper for outbox publishing

Introduce publishOutboxEvents() annotated with @Scheduled(fixedDelay = 5000) that delegates to the existing processOutboxEvents(). This separates the scheduling concern from the transactional processing method; processOutboxEvents() remains @Transactional and now only handles fetching and dispatching pending OutboxEvent items.

* Use UTC timestamps and add OutboxPublisher ctor

Use UTC for timestamps in OrderService and OutboxPublisher by switching LocalDateTime.now() to LocalDateTime.now(ZoneOffset.UTC). Replace Lombok @RequiredArgsConstructor on OutboxPublisher with an explicit constructor for dependency injection and remove the @Transactional annotation from processOutboxEvents. Update processedAt assignment to use UTC as well.
2026-08-30 14:02:32 +03:00
Ilkka Seppälä 7c0abffe05 docs: Add SerpApi to Supporters (#3591)
* Update README.md
* Add logos
2026-08-30 09:28:23 +03:00
allcontributors[bot] 126ad5fa1f docs: add zanarellidev as a contributor for translation (#3587)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-08-25 07:52:05 +03:00
zanarelli c8423198cd docs: pt: add localization for polling-publisher, money, delegation patterns (#3583)
Add Brazilian Portuguese (pt) translations for three previously
untranslated pattern READMEs, following the existing localization/pt/
convention documented in the wiki (15. Support for multiple languages).
Frontmatter and section headers follow the same structure used by the
most recently updated existing translation (singleton), keeping code
blocks, links, and image references unchanged from the English source.
2026-08-25 07:51:26 +03:00
allcontributors[bot] d7327917cf docs: add devikae as a contributor for code (#3586)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-08-25 07:48:14 +03:00
dev-ikae b0c34db084 feat: Implement Write-Ahead Log (WAL) pattern (#3576) (#3582)
* feat: Implement Write-Ahead Log (WAL) pattern (#3576)

* test: Add exception handling tests and verify coverage
2026-08-25 07:47:35 +03:00
allcontributors[bot] aa11f6b6be docs: add SandhyaDevadiga as a contributor for code (#3585)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-08-25 07:39:42 +03:00
Sandhya 5698dea49b feat: Add Fork/Join design pattern (#3227) (#3550)
* Add fork-join pattern implementation

* Add input validation for start > end in SumTask

Signed-off-by: SandhyaDevadiga <sandhyadevadiga8197@gmail.com>

* Add fork-join module to parent pom.xml

* Add missing assertThrows import in SumTaskTest

* Format fork-join code with Spotless

* Add AppTest to satisfy coverage requirements

Signed-off-by: SandhyaDevadiga <sandhyadevadiga8197@gmail.com>

---------

Signed-off-by: SandhyaDevadiga <sandhyadevadiga8197@gmail.com>
2026-08-25 07:39:07 +03:00
dependabot[bot] 4f28d4eb5b build(deps): bump io.zipkin.reporter2:zipkin-reporter-brave (#3579)
Bumps [io.zipkin.reporter2:zipkin-reporter-brave](https://github.com/openzipkin/zipkin-reporter-java) from 3.5.0 to 3.5.3.
- [Release notes](https://github.com/openzipkin/zipkin-reporter-java/releases)
- [Changelog](https://github.com/openzipkin/zipkin-reporter-java/blob/master/RELEASE.md)
- [Commits](https://github.com/openzipkin/zipkin-reporter-java/compare/3.5.0...3.5.3)

---
updated-dependencies:
- dependency-name: io.zipkin.reporter2:zipkin-reporter-brave
  dependency-version: 3.5.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-25 07:30:43 +03:00
dependabot[bot] 22a34127d0 build(deps): bump com.fasterxml.jackson.core:jackson-databind (#3567)
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.22.0 to 2.22.1.
- [Commits](https://github.com/FasterXML/jackson/commits)

---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
  dependency-version: 2.22.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-16 22:16:49 +03:00
allcontributors[bot] 8b079dba5c docs: add Mukul-Howale as a contributor for code (#3572)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-08-16 22:13:01 +03:00
Mukul Howale a563344a35 feat: microservice messaging pattern (#3564)
* Initialize microservices-messaging Spring Boot project

Add initial project structure for microservices-messaging using Spring Boot. Includes Maven configuration with dependencies for Kafka, Lombok, and testing, as well as main application, test class, and application properties.

* Initialize microservices messaging pattern

1. Added initial project structure for demonstrating the microservices messaging pattern.
2. Introduced service stubs (OrderService, InventoryService, PaymentService, NotificationService), a Message and MessageBroker class, and a main App entry point.
3. Added README and logging configuration.

* Implement Message and MessageBroker classes

1. Added the Message class with unique ID, content, and timestamp fields, and a toString method.
2. Implemented the MessageBroker class to support topic-based publish-subscribe messaging, including subscriber management, message publishing, and logging.

* Implement messaging pattern for microservices

1. Added message handling logic to InventoryService, PaymentService, and NotificationService.
2. OrderService now publishes order events to a MessageBroker, and App demonstrates the messaging workflow. 3. Each service processes relevant order events and logs actions for demonstration purposes.

* Expand microservices messaging docs and add diagrams

1. Enhanced the README with detailed explanations, real-world examples, Java code samples, and references for the Microservices Messaging pattern.
2. Added flowchart and sequence diagram images to illustrate the pattern.

* Refactor to use Kafka for microservices messaging

1. Added Apache Kafka for asynchronous communication between services.
2. Added KafkaMessageProducer and KafkaMessageConsumer classes, updated service implementations and main application logic to use Kafka, and adjusted the Maven configuration to include Kafka and Jackson dependencies.
3. Updated and moved all classes to the com.iluwatar.messaging package, improved documentation, and updated diagrams to reflect the new architecture.

* Add unit tests and license headers to messaging module

1. Added comprehensive unit tests for App, InventoryService, KafkaMessageConsumer, KafkaMessageProducer, Message, NotificationService, OrderService, and PaymentService.
2. Added MIT license headers to all main source files and logback.xml.
3. Updated pom.xml to include JUnit Jupiter as a test dependency.

* Refactor and simplify service and Kafka test classes

1. Simplified unit tests for InventoryService, NotificationService, and PaymentService by removing null content tests and adding instantiation checks.
2. Refactored KafkaMessageConsumerTest and KafkaMessageProducerTest to avoid requiring a real Kafka instance, focusing on class structure and method existence instead of integration behavior.

* Add microservices-messaging module and run scripts

Introduce the microservices-messaging module and register it in the root pom.xml. Add docker-compose.yml to run a local Kafka (confluentinc/cp-kafka) with a healthcheck, plus run-app.ps1 and run-app.sh helper scripts that start Kafka if needed and then launch the application. Update the module README with usage instructions. Also remove a duplicated junit-jupiter-api test dependency from the module pom to rely on project defaults.

* microservices-messaging: code style and Lombok

Add Lombok as a provided dependency and apply formatting/refactoring across the microservices-messaging module. Changes include import reordering, Javadoc and logging formatting, consistent lambda/try/catch indentation, small Kafka consumer/producer refinements (Duration/Properties usage and callback formatting), Message class tweaks (@Getter, JSON ctor and toString formatting) and EOF/newline fixes. Unit tests were also reformatted for consistency. These are non-functional style and readability improvements; no behavior changes intended.

* Make Kafka producer/consumer testable

Refactor KafkaMessageProducer and KafkaMessageConsumer to depend on the Producer/Consumer interfaces and add constructors that accept mockable instances. Extract default producer/consumer creation into factory methods so tests can inject MockProducer/MockConsumer. Update tests across the microservices-messaging module to use MockProducer/MockConsumer, add more meaningful assertions, error/interrupt handling tests, and simplify AppTest. These changes improve unit testability and remove the need for a running Kafka instance while preserving runtime behavior.

* Format test Javadoc and reorder imports

Normalize Javadoc formatting and reorder static JUnit imports for consistency in messaging tests. Converted multi-line test Javadocs to single-line comments and adjusted import ordering in the following files:

- microservices-messaging/src/test/java/com/iluwatar/messaging/KafkaMessageConsumerTest.java
- microservices-messaging/src/test/java/com/iluwatar/messaging/KafkaMessageProducerTest.java
- microservices-messaging/src/test/java/com/iluwatar/messaging/OrderServiceTest.java

No functional changes.

* Add MIT headers and exclude .ps1 from license checks

Add MIT license headers to microservices-messaging/docker-compose.yml, run-app.ps1 and run-app.sh to ensure license text is present in these scripts. Update root pom.xml to exclude PowerShell (*.ps1) files from the license plugin checks so those files are not processed by the license rule.

* Add Kafka docker service to CI workflows

Bring up Kafka for tests in CI and PR workflows. Adds steps to run docker compose for microservices-messaging, poll Kafka readiness (up to 20 retries), and always tear down with docker compose down. Enables Maven tests that depend on Kafka. Affects .github/workflows/maven-ci.yml and .github/workflows/maven-pr-builder.yml.

* Use kafka-topics instead of kafka-topics.sh

Replace calls to kafka-topics.sh with kafka-topics in CI workflows and the Docker Compose healthcheck. Updated .github/workflows/maven-ci.yml, .github/workflows/maven-pr-builder.yml, and microservices-messaging/docker-compose.yml to use the kafka-topics binary for readiness checks and healthchecks. This prevents failures on images that expose the kafka-topics command without the .sh wrapper.

* Use docker compose --wait for Kafka startup

Replace the custom bash readiness loop with `docker compose ... up -d --wait` in CI and PR workflows. This simplifies startup of the microservices-messaging Kafka service and removes the manual retry/polling logic. Files changed: .github/workflows/maven-ci.yml, .github/workflows/maven-pr-builder.yml. Note: requires a Docker Compose version that supports the `--wait` flag.

* Reformat tests for readability

Reformatted KafkaMessageConsumerTest and PaymentServiceTest for readability and consistent formatting: reflowed constructor invocation, expanded anonymous HashMap and schedulePollTask lambda blocks, and aligned assertDoesNotThrow parameters. These are pure style changes with no behavioral modifications.

* Remove Kafka Docker Compose steps from CI

Removed the Start/Stop Kafka Docker Service steps that ran docker compose for microservices-messaging from .github/workflows/maven-ci.yml and .github/workflows/maven-pr-builder.yml. Workflows no longer start or tear down the Kafka docker-compose service during CI/PR runs; other steps (xvfb install, Maven build, Codecov upload, Sonar cache) remain unchanged.

* Bump google-java-format to 1.27.0; tidy tests

Update pom.xml to use google-java-format 1.27.0 (was 1.17.0). Make minor formatting cleanups in KafkaMessageConsumerTest and PaymentServiceTest by collapsing multi-line calls into single lines. No functional changes.

* Downgrade Google Java Format to 1.17.0

Update Spotless googleJavaFormat version in root pom.xml from 1.27.0 to 1.17.0

* Improve Kafka producer and consumer tests

Enhance microservices-messaging tests: add consumer tests to verify run() exits immediately when stopped and gracefully handles a WakeupException (ensuring the MockConsumer is closed). Update producer error test to avoid try-with-resources, assert publish behavior and history, trigger failingProducer.errorNext(...) before closing to cover the error callback branch, then close and assert the mock producer is closed.

* Refactor App.run and add messaging tests

Extract App.run(...) and introduce a package-private sleepMs field to control sleep durations so the demo can be exercised programmatically and sped up for tests. Main now delegates to run; consumers are started there. Tests updated: AppTest sets sleepMs to 0 and adds testRunWithMockObjects using MockProducer/MockConsumer to exercise run without a Kafka broker; KafkaMessageProducerTest adds a null-message publish test; minor formatting fix in KafkaMessageConsumerTest. These changes improve testability and coverage for the microservices-messaging module.
2026-08-16 22:12:29 +03:00
dependabot[bot] 8c7a3105df build(deps): bump com.fasterxml.jackson.core:jackson-databind (#3549)
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.18.3 to 2.18.9.
- [Commits](https://github.com/FasterXML/jackson/commits)

---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
  dependency-version: 2.18.9
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-16 21:59:12 +03:00
allcontributors[bot] 29442249f8 docs: add AnveshSrivastava as a contributor for code (#3571)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-08-16 21:57:31 +03:00
Anvesh Srivastava 1673930bc0 feat: Add Backends For Frontends (BFF) pattern (#300) (#3543)
* Add Backends For Frontends pattern (#300)

Implements the BFF pattern with two client-specific gateways
(MobileBff, DesktopBff) aggregating shared downstream services
(AuthService, CartService, OrderService, SupplierService) into
client-tailored response shapes.

Closes #300

* Rename SupplierService lookup key to productName for clarity

The service is looked up by product name throughout the codebase, not
an actual product ID as the previous naming implied.

* Address review feedback: remove unnecessary compact constructors, add InMemory* service tests
2026-08-16 21:56:51 +03:00
dependabot[bot] c298e94d96 build(deps): bump ch.qos.logback:logback-core in /polling-publisher (#3546)
Bumps [ch.qos.logback:logback-core](https://github.com/qos-ch/logback) from 1.5.18 to 1.5.34.
- [Release notes](https://github.com/qos-ch/logback/releases)
- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.18...v_1.5.34)

---
updated-dependencies:
- dependency-name: ch.qos.logback:logback-core
  dependency-version: 1.5.34
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-16 21:50:34 +03:00
dependabot[bot] d498332345 build(deps): bump ch.qos.logback:logback-core in /subclass-sandbox (#3545)
Bumps [ch.qos.logback:logback-core](https://github.com/qos-ch/logback) from 1.5.34 to 1.5.35.
- [Release notes](https://github.com/qos-ch/logback/releases)
- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.34...v_1.5.35)

---
updated-dependencies:
- dependency-name: ch.qos.logback:logback-core
  dependency-version: 1.5.35
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-16 21:49:02 +03:00
allcontributors[bot] 653bced988 docs: add MohamedMBG as a contributor for code (#3570)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-08-16 21:47:52 +03:00
BAGHDAD Mohamed 5d6ff2f0c4 feat: add rule engine design pattern (#3548)
Add an educational rule-engine module demonstrating the Rule Engine
pattern. Each business rule is an independent object exposing evaluate
(decision) and execute (action); a RuleEngine evaluates a collection of
rules against an immutable loan-application context in insertion order,
runs the passing rules, and reports every passed and failed rule via an
immutable RuleEngineResult. Includes three concrete rules, an App demo,
unit tests, README, and class diagram.
2026-08-16 21:47:18 +03:00
allcontributors[bot] a7000fe61b docs: add arnabnandy7 as a contributor for doc (#3569)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-08-16 21:43:53 +03:00
Arnab Nandy 47693507db docs: Update factory method Java API links (#3539)
* Update factory method Java API links

Signed-off-by: Arnab Nandy <arnab_nandy7@yahoo.com>

* Trigger PR checks

Signed-off-by: Arnab Nandy <arnab_nandy7@yahoo.com>

---------

Signed-off-by: Arnab Nandy <arnab_nandy7@yahoo.com>
2026-08-16 21:43:10 +03:00
dependabot[bot] f5bdf688f1 build(deps): bump com.diffplug.spotless:spotless-maven-plugin (#3540)
Bumps [com.diffplug.spotless:spotless-maven-plugin](https://github.com/diffplug/spotless) from 2.44.2 to 3.8.0.
- [Release notes](https://github.com/diffplug/spotless/releases)
- [Changelog](https://github.com/diffplug/spotless/blob/main/CHANGES.md)
- [Commits](https://github.com/diffplug/spotless/compare/maven/2.44.2...maven/3.8.0)

---
updated-dependencies:
- dependency-name: com.diffplug.spotless:spotless-maven-plugin
  dependency-version: 3.8.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-16 21:37:59 +03:00
allcontributors[bot] 401c44b797 docs: add priyanshuvishwakarma273403 as a contributor for code (#3568)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-08-16 21:32:18 +03:00
PriyanshuandIlkka Seppälä 7e0ddb01cd feat: Implement Fallback design pattern #2846 (#3538)
* feat: implement Fallback design pattern with circuit breaker and service monitoring

* docs: add README for Fallback design pattern implementation

---------

Co-authored-by: Ilkka Seppälä <iluwatar@users.noreply.github.com>
2026-08-16 21:31:20 +03:00
dependabot[bot] f1dcddfd3a build(deps): bump com.fasterxml.jackson.core:jackson-databind (#3533)
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.18.3 to 2.22.0.
- [Commits](https://github.com/FasterXML/jackson/commits)

---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
  dependency-version: 2.22.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-16 20:33:44 +03:00
Hattori Henzo 688095a4c7 feat: Add the implementation of Onion-Architecture (#3532)
* Add the implementation of Onion-Architecture

* Execute maven command: mvn spotless:apply
2026-08-16 20:30:42 +03:00
allcontributors[bot] b55fc2bcb5 docs: add SrGiuliano77 as a contributor for translation (#3537)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-07-04 21:26:44 +03:00
Giuliano Oliveira 74d2dbe0be docs: Translation of the README.md file for active-object to pt (#2553) 2026-07-04 21:26:07 +03:00
dependabot[bot] f179974422 build(deps-dev): bump de.flapdoodle.embed:de.flapdoodle.embed.mongo (#3528)
Bumps [de.flapdoodle.embed:de.flapdoodle.embed.mongo](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo) from 4.20.0 to 4.33.0.
- [Commits](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/compare/de.flapdoodle.embed.mongo-4.20.0...de.flapdoodle.embed.mongo-4.33.0)

---
updated-dependencies:
- dependency-name: de.flapdoodle.embed:de.flapdoodle.embed.mongo
  dependency-version: 4.33.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-04 21:22:08 +03:00
dependabot[bot] 448c8b5d21 build(deps): bump org.slf4j:slf4j-api from 2.0.9 to 2.0.18 (#3525)
Bumps org.slf4j:slf4j-api from 2.0.9 to 2.0.18.

---
updated-dependencies:
- dependency-name: org.slf4j:slf4j-api
  dependency-version: 2.0.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-04 21:21:10 +03:00
OrbisAI SecurityandClaude Sonnet 4.6 fcdf639b15 fix: remove unsafe exec() in page controller App.java (#3471)
* fix: V-002 security vulnerability

Automated security fix generated by Orbis Security AI

* adding cross-platform support

* fixing sonarqube hotspots

* fixing the formating for java windows

* fix: address PR review comments - Windows title bug, Unix paths, and consistency

- Add empty string title arg to cmd /c start to fix paths-with-spaces bug
- Revert Unix commands to bare names (open, xdg-open) with NOSONAR since
  xdg-open location varies by distro; absolute paths broke portability
- Apply same ProcessBuilder fix to page-object/src App.java for consistency

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: resolve Windows path via SystemRoot env var instead of hardcoding

C:\Windows\System32\cmd.exe fails when Windows is installed on a
non-C drive. Use System.getenv("SystemRoot") with a C:\Windows
fallback to locate cmd.exe portably in both App.java files.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 19:09:13 +03:00
dependabot[bot] 39dce8eedf build(deps): bump org.springframework.boot:spring-boot-starter-thymeleaf (#3520)
Bumps [org.springframework.boot:spring-boot-starter-thymeleaf](https://github.com/spring-projects/spring-boot) from 3.4.4 to 4.0.6.
- [Release notes](https://github.com/spring-projects/spring-boot/releases)
- [Commits](https://github.com/spring-projects/spring-boot/compare/v3.4.4...v4.0.6)

---
updated-dependencies:
- dependency-name: org.springframework.boot:spring-boot-starter-thymeleaf
  dependency-version: 4.0.6
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-10 19:02:44 +03:00
dependabot[bot] 9c5d703dda build(deps): bump ch.qos.logback:logback-classic from 1.5.18 to 1.5.34 (#3517)
Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.5.18 to 1.5.34.
- [Release notes](https://github.com/qos-ch/logback/releases)
- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.18...v_1.5.34)

---
updated-dependencies:
- dependency-name: ch.qos.logback:logback-classic
  dependency-version: 1.5.34
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-10 18:56:32 +03:00
Ilkka Seppälä 3b9a2df119 fix: website build failed 2026-06-07 19:32:28 +03:00
Ilkka Seppälä 7b4482f08c refactor: remove redundant compiler property declarations from module POM files 2026-06-07 14:00:45 +03:00
dependabot[bot] 3b758da41a build(deps-dev): bump org.assertj:assertj-core in /rate-limiting-pattern (#3505)
Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.24.2 to 3.27.7.
- [Release notes](https://github.com/assertj/assertj/releases)
- [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.24.2...assertj-build-3.27.7)

---
updated-dependencies:
- dependency-name: org.assertj:assertj-core
  dependency-version: 3.27.7
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-07 13:44:31 +03:00
allcontributors[bot] 0f67a61be1 docs: add AnakinYen0329 as a contributor for translation (#3513)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-06-07 13:17:28 +03:00
Anakin Yen 5a2beb8808 feat: translage to traditional Chinese (zh-tw) (#3324)
* 修改完成

* Add Singleton pattern example
2026-06-07 13:16:48 +03:00
Ved Asole 4cc30055fc docs: Update ved-asole link in .all-contributorsrc (#3294)
* Update ved-asole link in .all-contributorsrc

Updated my profile link in .all-contributorsrc

* Update README.md with url for ved-asole profile

Update README.md with url for ved-asole profile
2026-06-07 13:09:39 +03:00
Ilkka Seppälä 2dfb27c859 fix: spotless formatting fixes 2026-06-07 12:40:02 +03:00
Ilkka Seppälä c317ce012a feat: Enable codecov reports 2026-06-07 12:35:18 +03:00
Ilkka Seppälä 177dc52704 fix: Fix test stability issues 2026-06-07 12:10:39 +03:00
OrbisAI Security 13cde46f2e fix: CVE-2025-22235 security vulnerability (#3510)
Automated dependency upgrade by OrbisAI Security
2026-06-07 10:11:45 +03:00
allcontributors[bot] c70b63d069 docs: add alex052525 as a contributor for code (#3511)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-06-06 22:06:25 +03:00
김정모andClaude Sonnet 4.6 7473378ca2 feat: implement Immutable pattern (Fixes #3448) (#3509)
* feat: implement Immutable pattern #3448

Add immutable/ module with ImmutableUser (final class, defensive copy,
withAge wither method), App demo, JUnit 5 tests, PlantUML diagram, and
README following project conventions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat: add withName and withRoles wither methods to ImmutableUser #3448

Every field now has a corresponding wither for consistency.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: add junit-jupiter-api dependency to immutable module #3448

Required for @Test annotations and assert methods in test code.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 22:05:42 +03:00
dependabot[bot] d4a0ece9e3 build(deps-dev): bump org.assertj:assertj-core in /health-check (#3438)
Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.7.
- [Release notes](https://github.com/assertj/assertj/releases)
- [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.7)

---
updated-dependencies:
- dependency-name: org.assertj:assertj-core
  dependency-version: 3.27.7
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-03 21:03:39 +03:00
allcontributors[bot] 1288720893 docs: add rranjangupta as a contributor for code (#3508)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-06-03 21:00:32 +03:00
Raju Gupta 8b0cf692cf feat: Add test coverage for single-table-inheritance pattern (#3468)
* Add STI tests

* test: add delta for floating-point comparison in VehicleServiceTest

* fix: guard teardown against nulls and use assertNotNull in VehicleServiceTest

Add null checks in @AfterEach tearDown() to prevent NullPointerException
if setUp() partially fails. Replace assertTrue(x != null) with assertNotNull(x).

* style: format code in SingleTableInheritanceTest and VehicleServiceTest for consistency
2026-06-03 20:59:52 +03:00
dependabot[bot] 5ff41687df build(deps): bump org.apache.commons:commons-lang3 in /double-buffer (#3304)
Bumps org.apache.commons:commons-lang3 from 3.17.0 to 3.18.0.

---
updated-dependencies:
- dependency-name: org.apache.commons:commons-lang3
  dependency-version: 3.18.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-03 20:48:17 +03:00
dependabot[bot] 51b03f1137 build(deps): bump ch.qos.logback:logback-core in /subclass-sandbox (#3380)
Bumps [ch.qos.logback:logback-core](https://github.com/qos-ch/logback) from 1.5.18 to 1.5.19.
- [Release notes](https://github.com/qos-ch/logback/releases)
- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.18...v_1.5.19)

---
updated-dependencies:
- dependency-name: ch.qos.logback:logback-core
  dependency-version: 1.5.19
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-03 20:43:15 +03:00
dependabot[bot] 4215c86de0 build(deps-dev): bump org.assertj:assertj-core in /bloc (#3426)
Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.7.
- [Release notes](https://github.com/assertj/assertj/releases)
- [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.7)

---
updated-dependencies:
- dependency-name: org.assertj:assertj-core
  dependency-version: 3.27.7
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-03 20:42:07 +03:00
dependabot[bot] f5bd0380d5 build(deps-dev): bump org.apache.maven.plugins:maven-war-plugin (#3431)
Bumps [org.apache.maven.plugins:maven-war-plugin](https://github.com/apache/maven-war-plugin) from 3.4.0 to 3.5.1.
- [Release notes](https://github.com/apache/maven-war-plugin/releases)
- [Commits](https://github.com/apache/maven-war-plugin/compare/maven-war-plugin-3.4.0...maven-war-plugin-3.5.1)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-war-plugin
  dependency-version: 3.5.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-03 20:40:39 +03:00
allcontributors[bot] a0a10b300b docs: add orbisai0security as a contributor for security (#3507)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-06-03 20:33:35 +03:00
OrbisAI SecurityandUbuntu 2c02289711 fix: V-001 security vulnerability (#3461)
Automated security fix generated by Orbis Security AI

Co-authored-by: Ubuntu <ubuntu@ip-172-31-32-15.us-west-2.compute.internal>
2026-06-03 20:32:57 +03:00
allcontributors[bot] 394aff8ac6 docs: add sieberss as a contributor for translation (#3506)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-06-03 20:21:02 +03:00
Stefan Siebers cd4753a660 docs: Improve existing German READMEs and add new ones (#3444)
* docs: reformulate text, add links to further languages and paragraph about the book in central README.md
(#2275)

* docs: shorten text for link to payhip
(#2275)

* docs: reformulate german translation for Abstract Document
(#2275)

* Create folder for Abstract Factory

* Create README.md for Abstract Document

* Translate README.md for Abstract Document to German

* correct typo

* docs: add class diagrams for all patterns
(#2275)

* docs: add missing words in abstract-factory.README.md
(#2275)

* docs: Create German README.md for Active Object

#2275
first text part

* docs: finish German translation of README.md for Active Object

* docs: translate actor-model into German

#2295

* docs: add German translation for Acyclic Visitor

#2295

* correct typo

* docs: Translate Singleton into German

#2295

* docs: Translate Prototype into German

#2295

* Delete localization/de/Abstract Factory

* insert line break

* correct typos in actor-model

* realignment of java code block

* docs: translate Adapter Pattern into German

#2295

* Update README.md

change 'lizenz' to 'Lizenz' in badge

* Update README.md

translate 'benefits' and 'trade-offs'

* remove additional bullet point after line break

* correct indentation

* docs: translate Dependency Injection into German

#2295

* docs: translate Bridge into German

#2295

* correct typos

* docs: Translate Builder into German

* delete english text

* little changes in formulation

* Update README.md

change link to image

* docs: remove spanish files
(#2275)

* docs: remove non-translated patterns
(#2275)

* Create README.md

docs: Translate Step Builder into German
#2275

* Create README.md

docs: Translate Fluent Interface into German
#2275

* eager is eifrig, not gierig

* Translate Chain of Responsibility into German

#2275
2026-06-03 20:20:05 +03:00
dependabot[bot] bdc008fb78 build(deps): bump com.fasterxml.jackson.core:jackson-core (#3502)
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.19.0 to 2.21.4.
- [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.19.0...jackson-core-2.21.4)

---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
  dependency-version: 2.21.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-03 20:15:59 +03:00
allcontributors[bot] 93668590e5 docs: add Dhiraj-birajdar as a contributor for doc (#3499)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-06-02 21:02:01 +03:00
Dhiraj BirajdarandDhiraj-Birajdar a9ce57c4d0 fix: Fix broken CQRS link in Saga README (#3409)
Co-authored-by: Dhiraj-Birajdar <dhirajbirajdarcs@gmail.com>
2026-06-02 21:01:17 +03:00
allcontributors[bot] f8d4dd8506 docs: add QuantumRange as a contributor for doc (#3498)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-06-01 21:28:22 +03:00
QuantumRange 2bfd3e190d fix: external spring guide link changed (#3394) 2026-06-01 21:27:43 +03:00
allcontributors[bot] b0bd9e6593 docs: add CMD137 as a contributor for code (#3497)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-06-01 21:13:49 +03:00
CMD137 e8595393d6 feat: Add Thread-Specific Storage design pattern (#3422)
* Add Thread-Specific Storage design pattern

* fixed:pom.xml
Run 'mvn spotless:apply' to fix these violations.

* fix: address Sonar security hotspots for Random usage and e.printStackTrace()

* fixed:
Run 'mvn spotless:apply'(remove unused import)

* fixed:
Refactor Thread-Specific Storage pattern implementation to address Sonar issues: remove unnecessary instantiation, add private constructor, use diamond operator, and update tests.

* fixed:
update uml and README.md

* Trigger CI rerun
2026-06-01 21:11:47 +03:00
allcontributors[bot] 48ba55a8a6 docs: add HY-love-sleep as a contributor for code (#3495)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-05-31 18:18:10 +03:00
HY-love-sleep b93a202d60 feat: Refactor Callback pattern to support asynchronous callbacks (#3274)
* refactor: Refactor Task execution to support asynchronous callbacks

* fix: CallbackTest

* chore: code style

* feat: display synchronous and asynchronous callbacks
2026-05-31 18:17:23 +03:00
allcontributors[bot] 9e65023a9f docs: add devch37 as a contributor for code (#3494)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-05-31 18:03:44 +03:00
devch37andbehappyleee 9f0b7ae81d feat: add override annotation (#3306)
Co-authored-by: behappyleee <72903623+behappyleee@users.noreply.github.com>
2026-05-31 18:03:03 +03:00
allcontributors[bot] f93514af39 docs: add quantdevv as a contributor for code (#3493)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-05-31 17:55:39 +03:00
Aditya Kumawat 318130c486 #2673: feat: Microservice pattern: Polling publisher #3243 (#3292)
* added new microservice pattern polling-publisher, created folder structure, README.md & App.java

* added two service polling service & publisher service to handle two different operation & prepared initial skeleton

* polling-publisher service implementation

* fixed checkstyle errors

* subscriber-service implementation

* added entry point for subscriber service & unit test-case

* added unit test-case for DataSourceService class

* resolved dependency & structured classes

* implemented Data repository, DataSource Service & added unittest-case & implemented polling-service microservice

* implemented subscriber microservice using kafkaConsumer

* Fixed Kafka bug & added a controller to send message using API

* Fixed subscriber-service & updated pom.xml

* Fixed topic name

* added new listener for other topic

* updated all README.md

* added description on both application.yaml file

* added scope before class definition in Test classes & removed duplicate dependency from pom.xml & added required one

* added polling-publisher module in pom.xml

* Updated README.md file based on new template

* improved the README.md file & fixed it's format

* deleted unnecessary README.md files

* fixed the printing statements & used log function

* used logger to print statement

* addressed review comment: removed unnecessary dependency

* addressed review comment
2026-05-31 17:54:58 +03:00
allcontributors[bot] f7ad42dc05 docs: add avivdon as a contributor for security (#3492)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-05-31 17:28:52 +03:00
allcontributors[bot] 5a0440b696 docs: add jackmisbach as a contributor for security (#3491)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-05-31 17:28:18 +03:00
allcontributors[bot] 546d9a5bae docs: add dagecko as a contributor for security (#3490)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-05-31 17:27:29 +03:00
allcontributors[bot] 213a4a5ee7 docs: add north-echo as a contributor for security (#3489)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-05-31 17:26:42 +03:00
allcontributors[bot] 83887271ae docs: add nilsreichardt as a contributor for security (#3488)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-05-31 17:25:58 +03:00
Ilkka Seppälä e4384ef7d2 fix: Update PR builder not to execute Sonar analysis (#3486) 2026-05-31 08:03:33 +03:00
iluwatar d24dd22bb9 feat: Add AGENTS.md 2026-05-03 18:11:17 +03:00
allcontributors[bot] 2d39fe7ed8 docs: add Olexandr88 as a contributor for doc (#3440)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-02-22 20:17:34 +02:00
Olexandr88andIlkka Seppälä b8f819988f docs: Update README.md (#3298)
Co-authored-by: Ilkka Seppälä <iluwatar@users.noreply.github.com>
2026-02-22 20:16:56 +02:00
allcontributors[bot] ce5154effc docs: add skamble2 as a contributor for code (#3437)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-02-22 20:15:55 +02:00
Soham KambleandIlkka Seppälä 265e3d0bda feat: Rate Limiting Pattern #2973 (#3291)
* need to fix one test case shouldGraduallyIncreaseLimitWhenHealthy failing for AdaptiveRateLimiter.java

* Added Class Diagram and Flow Diagrams for Adaptive, Fixed Window and Token Bucket Rate Limiter

* Updated README.md. All test case passed. Updated with Google Java Guidelines

* Updated parent pom #2973

* Updated parent pom #2973

* fixed shouldResetCounterAfterWindow() test #2973

* formatting fixed #2973

* added test coverage for app.java and fixed random to be thread safe #2973

* added test coverage for app.java and fixed random to be thread safe #2973

* added test coverage for app.java and fixed random to be thread safe #2973

* added test coverage for app.java and fixed random to be thread safe #2973

* added test coverage for app.java and fixed random to be thread safe #2973

* added test coverage for app.java and fixed random to be thread safe #2973

* added test coverage for app.java and fixed random to be thread safe #2973

* fixed random to be thread safe #2973

* fixed random to be thread safe #2973

* fixed random to be thread safe #2973

* fixed spacing in pom.xml #2973

---------

Co-authored-by: Ilkka Seppälä <iluwatar@users.noreply.github.com>
2026-02-22 20:15:11 +02:00
e5LAandIlkka Seppälä a3fcc63167 feat: Implement View Helper pattern (#3278)
* #1263 - creating new module for view-helper

* #1263 - creating Product and ProductViewModel

* #1263 - creating interfaces for View and ViewHelper

* #1263 - creating ProductViewHelper and its test

* #1263 - creating Console View for Product

* #1263 - creating ProductController

* #1263 - creating main App and its test

* #1263 - adding license header

* #1263 - keeping module in alphabetical order

* #1263 - creating README and diagrams

* #1263 apply spotless

---------

Co-authored-by: Ilkka Seppälä <iluwatar@users.noreply.github.com>
2026-02-08 21:44:17 +02:00
allcontributors[bot] dc3425dd0e docs: add letdtcode as a contributor for code (#3429)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-02-08 21:28:19 +02:00
allcontributors[bot] 7c12643b27 docs: add naman-sriv as a contributor for code (#3428)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-02-08 21:27:30 +02:00
Maziyar Geramiandkeivanshir 4caa0bfdbc docs: Persian translation: Abstract Factory (#3280)
* Persian Translation: Add persian translation to abstract-document

* Persian Translation: Add abstract-document.png to abstract-document folder

* Persian Translation: Add codes to README.md of abstract-document

* Persian Translation: some improvements in abstract-document

* Persian Translation: Add refrence links in abstract-document

* Persian Translation: add rtl tag in abstract-document

* -added persian translation of factory pattern

* -renamed file

* -changed wikipedia definition

* -fixed table problem

* active-object : translate

* active-object: improve when to use

* active-object: improve when to use

* active-object: improve bullets (test)

* active-object: improve bullets (test)

* active-object: improve bullets (test)

* active-object: improve bullets (test)

* active-object: improve bullets

* active-object: Fix all bullets

* -fixed problems in bullet alignments

* Update README.md

-fixed alignment in bullets

* Update README.md

-changed tags to English

* -added persian translation of factory pattern

* -renamed file

* -changed wikipedia definition

* -fixed table problem

* -fixed problems in bullet alignments

* Update README.md

-fixed alignment in bullets

* Update README.md

-changed tags to English

* abstract-factory: added persian translation

* abstract-factory: fixed bullets problems

* "Minor improvement

Co-authored-by: keivanshir <keivan.shir.74@gmail.com>"

---------

Co-authored-by: Seyyed Keivan Shirkoubian <keivan.shir.74@gmail.com>
2026-02-08 21:25:16 +02:00
Thanh Nguyen Duc f92e6829c3 feat: Implement DAO Factory pattern (#3282)
* feat: implement dao factory

* feat: done implement dao factory

* test: Add unit test dao-factory

* doc: add document for dao-factory

* fix: h2 inmemory database to pass CI

* fix: unit test pipeline

* add license

* fix SonarQube

* add pom.xml

* fix: throw exception + refactor
2026-02-08 21:11:47 +02:00
dependabot[bot] fecf7e7a82 build(deps-dev): bump io.projectreactor:reactor-test (#3377)
Bumps [io.projectreactor:reactor-test](https://github.com/reactor/reactor-core) from 3.8.0-M1 to 3.8.0-RC1.
- [Release notes](https://github.com/reactor/reactor-core/releases)
- [Commits](https://github.com/reactor/reactor-core/compare/v3.8.0-M1...v3.8.0-RC1)

---
updated-dependencies:
- dependency-name: io.projectreactor:reactor-test
  dependency-version: 3.8.0-RC1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-08 21:11:22 +02:00
Naman Srivastava 812e4cd6a2 feat: Microservices pattern : Self-Registration (#3245)
* Services and information

* README.md updated

* unit tests added for controllers

* pom.xml, clean up, java version update and slf4j logging added

* pom files updated

* Removed children maven wrappers

* Microservice-self-registration added to pom file

* POM file updated for self-registration

* pom file updated

* Update pom.xml

correction to mudule name

* SonarQube comments addressed

* sonarqube comments on coverage addressed

* Code coverage for custom health checks

* changes for unit tests

* changes for unit tests

* changes to for code coverage improvement
2026-02-08 20:40:07 +02:00
dependabot[bot] 3ba2560e09 build(deps-dev): bump org.htmlunit:htmlunit from 4.7.0 to 4.17.0 (#3334)
Bumps [org.htmlunit:htmlunit](https://github.com/HtmlUnit/htmlunit) from 4.7.0 to 4.17.0.
- [Release notes](https://github.com/HtmlUnit/htmlunit/releases)
- [Commits](https://github.com/HtmlUnit/htmlunit/compare/4.7.0...4.17.0)

---
updated-dependencies:
- dependency-name: org.htmlunit:htmlunit
  dependency-version: 4.17.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-08 20:37:15 +02:00
ilkka.seppala 08651d0a00 chore: Update presubmit.ai configuration 2026-01-17 21:45:49 +02:00
allcontributors[bot] 0ab60190ea docs: add ronodhirSoumik as a contributor for doc (#3418)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-01-17 21:31:13 +02:00
Soumik Sarker 98d3601b1e docs: Formatted spacing and updated documentation (#3290)
* Refactored redundant spacing in pom.xml

* Updated documentation of remove subscriber in publish-subscribe model
2026-01-17 21:28:23 +02:00
allcontributors[bot] ede37bd055 docs: add e5LA as a contributor for doc (#3281)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-05-17 08:55:06 +03:00
e5LAandSP f6bb51581f chore: adding missing license (#3273)
Co-authored-by: SP <SP@>
2025-05-17 08:53:25 +03:00
allcontributors[bot] bf164009b4 docs: add yybmion as a contributor for code (#3279)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-05-15 21:55:54 +03:00
yoobin_mion 8529017e02 feat: Implement Thread-Pool Executor pattern (#3271)
- Add implementation of Thread-Pool Executor pattern using hotel front desk example
- Include unit tests
- Create detailed README with pattern explanation and examples
- Add Java source code with appropriate Javadoc comments

Closes #3226
2025-05-15 21:53:37 +03:00
Ilkka Seppälä 3ac1a36b05 docs: update prototype 2025-05-02 22:02:40 +03:00
Ilkka Seppälä 0da4dcda5b docs: update producer-consumer 2025-05-02 21:55:44 +03:00
dependabot[bot] a62601a64f build(deps): bump com.fasterxml.jackson.core:jackson-core (#3270)
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.18.2 to 2.19.0.
- [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.18.2...jackson-core-2.19.0)

---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
  dependency-version: 2.19.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-01 10:02:39 +03:00
dependabot[bot] 7d2e6262cc build(deps): bump com.mycila:license-maven-plugin from 4.6 to 5.0.0 (#3268)
Bumps [com.mycila:license-maven-plugin](https://github.com/mathieucarbou/license-maven-plugin) from 4.6 to 5.0.0.
- [Release notes](https://github.com/mathieucarbou/license-maven-plugin/releases)
- [Commits](https://github.com/mathieucarbou/license-maven-plugin/compare/license-maven-plugin-4.6...v5.0.0)

---
updated-dependencies:
- dependency-name: com.mycila:license-maven-plugin
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-01 10:01:53 +03:00
Ilkka Seppälä 8a64f4c574 docs: update dependency injection 2025-04-26 23:14:07 +03:00
allcontributors[bot] f8f33f586a docs: add maziyar-gerami as a contributor for translation (#3265)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-04-22 21:55:51 +03:00
Maziyar GeramiandSeyyed Keivan Shirkoubian dae93adfee translation: Translate selected patterns to persian (#3256)
* Persian Translation: Add persian translation to abstract-document

* Persian Translation: Add abstract-document.png to abstract-document folder

* Persian Translation: Add codes to README.md of abstract-document

* Persian Translation: some improvements in abstract-document

* Persian Translation: Add refrence links in abstract-document

* Persian Translation: add rtl tag in abstract-document

* active-object : translate

* active-object: improve when to use

* active-object: improve when to use

* active-object: improve bullets (test)

* active-object: improve bullets (test)

* active-object: improve bullets (test)

* active-object: improve bullets (test)

* active-object: improve bullets

* active-object: Fix all bullets

* -added persian translation of factory pattern

* -renamed file

* -changed wikipedia definition

* -fixed table problem

* -fixed problems in bullet alignments

* Update README.md

-fixed alignment in bullets

* Update README.md

-changed tags to English

---------

Co-authored-by: Seyyed Keivan Shirkoubian <keivan.shir.74@gmail.com>
2025-04-22 21:55:07 +03:00
dependabot[bot] ad6bdf802d build(deps): bump org.sonarsource.scanner.maven:sonar-maven-plugin (#3261)
Bumps [org.sonarsource.scanner.maven:sonar-maven-plugin](https://github.com/SonarSource/sonar-scanner-maven) from 5.0.0.4389 to 5.1.0.4751.
- [Release notes](https://github.com/SonarSource/sonar-scanner-maven/releases)
- [Commits](https://github.com/SonarSource/sonar-scanner-maven/compare/5.0.0.4389...5.1.0.4751)

---
updated-dependencies:
- dependency-name: org.sonarsource.scanner.maven:sonar-maven-plugin
  dependency-version: 5.1.0.4751
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-22 21:52:25 +03:00
dependabot[bot] 6e20d32213 build(deps): bump org.springframework:spring-web (#3262)
Bumps [org.springframework:spring-web](https://github.com/spring-projects/spring-framework) from 7.0.0-M3 to 7.0.0-M4.
- [Release notes](https://github.com/spring-projects/spring-framework/releases)
- [Commits](https://github.com/spring-projects/spring-framework/compare/v7.0.0-M3...v7.0.0-M4)

---
updated-dependencies:
- dependency-name: org.springframework:spring-web
  dependency-version: 7.0.0-M4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-22 21:50:26 +03:00
allcontributors[bot] e4681e4a7c docs: add e5LA as a contributor for code (#3264)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-04-22 21:45:40 +03:00
e5LA 55bef7ca39 chore: removed duplicated dependency (#3258) 2025-04-22 21:44:59 +03:00
allcontributors[bot] e359f1b031 docs: add ssrijan-007-sys as a contributor for code (#3263)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-04-22 21:31:01 +03:00
ssrijan-007-sys fe522fd70d feat: Implement Actor Model pattern
* feat: Implement Actor Model pattern #3232

* feat: Implement Actor Model pattern #3232

* feat: update Actor Model implementation with multi-actor logic #3251

* feat: update Actor Model implementation with multi-actor logic and loose coupling  #3251

* test: add unit test for actor model #3251

* test: add test for App.java to increase coverage

* docs: add complete README for Actor Model pattern also implemented changes #3251
2025-04-22 21:29:58 +03:00
Ilkka Seppälä 1cde704bcb docs: remove some old diagrams 2025-04-22 07:56:11 +03:00
Ilkka Seppälä d80eca177b docs: update book link 2025-04-16 21:31:31 +03:00
Ilkka Seppälä cb3853a789 docs: update table inheritance 2025-04-15 22:29:23 +03:00
Ilkka Seppälä 67bc5e3a62 docs: update session facade 2025-04-15 21:48:41 +03:00
Ilkka Seppälä bc42e38938 docs: update service stub 2025-04-15 21:24:13 +03:00
Ilkka Seppälä 9f7ce4e732 docs: update publish-subscribe 2025-04-15 20:36:32 +03:00
Ilkka Seppälä 1a08b73af8 docs: update monolithic architecture 2025-04-15 19:50:02 +03:00
dependabot[bot] 0f37b4ee7f build(deps): bump com.diffplug.spotless:spotless-maven-plugin (#3254)
Bumps [com.diffplug.spotless:spotless-maven-plugin](https://github.com/diffplug/spotless) from 2.44.3 to 2.44.4.
- [Release notes](https://github.com/diffplug/spotless/releases)
- [Changelog](https://github.com/diffplug/spotless/blob/main/CHANGES.md)
- [Commits](https://github.com/diffplug/spotless/compare/maven/2.44.3...maven/2.44.4)

---
updated-dependencies:
- dependency-name: com.diffplug.spotless:spotless-maven-plugin
  dependency-version: 2.44.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-15 18:10:28 +03:00
dependabot[bot] 2e686b2d73 build(deps): bump io.micrometer:micrometer-tracing-bridge-brave (#3253)
Bumps [io.micrometer:micrometer-tracing-bridge-brave](https://github.com/micrometer-metrics/tracing) from 1.4.4 to 1.4.5.
- [Release notes](https://github.com/micrometer-metrics/tracing/releases)
- [Commits](https://github.com/micrometer-metrics/tracing/compare/v1.4.4...v1.4.5)

---
updated-dependencies:
- dependency-name: io.micrometer:micrometer-tracing-bridge-brave
  dependency-version: 1.4.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-15 18:09:55 +03:00
dependabot[bot] b95bf243e6 build(deps): bump org.jacoco:jacoco-maven-plugin from 0.8.12 to 0.8.13 (#3252)
Bumps [org.jacoco:jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.12 to 0.8.13.
- [Release notes](https://github.com/jacoco/jacoco/releases)
- [Commits](https://github.com/jacoco/jacoco/compare/v0.8.12...v0.8.13)

---
updated-dependencies:
- dependency-name: org.jacoco:jacoco-maven-plugin
  dependency-version: 0.8.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-15 18:09:22 +03:00
Ilkka Seppälä b8aa775d48 fix: fix code formatting 2025-04-14 20:54:05 +03:00
Ilkka Seppälä d95c6797a4 docs: update money pattern 2025-04-14 20:40:52 +03:00
Ilkka Seppälä 076fc21e40 docs: update microservices idempotent consumer 2025-04-14 20:13:14 +03:00
Ilkka Seppälä acb40e112b docs: update microservices distributed tracing 2025-04-14 19:44:58 +03:00
Ilkka Seppälä 9de12ea5f2 docs: update clean architecture 2025-04-13 21:26:14 +03:00
Ilkka Seppälä 4afabdb403 docs: update bloc pattern 2025-04-12 19:26:46 +03:00
Ilkka Seppälä 5241a4ae20 docs: update client-side ui composition 2025-04-12 18:25:26 +03:00
Ilkka Seppälä 4b06dc2a2e docs: updates for MapReduce 2025-04-12 16:40:17 +03:00
Ilkka Seppälä 8ca487e96c docs: update function composition pattern 2025-04-12 16:11:03 +03:00
Ilkka Seppälä ce2e5f75d8 docs: update backpressure description 2025-04-12 15:09:24 +03:00
Ilkka Seppälä 32c9031fcd docs: diagrams for version number, virtual proxy, visitor 2025-04-12 09:58:48 +03:00
Ilkka Seppälä 81ecb5638d docs: diagrams for unit of work, update method, and value object 2025-04-12 09:49:08 +03:00
Ilkka Seppälä 6195d5e1e8 docs: diagrams for transaction script, twin, and type object 2025-04-12 09:35:40 +03:00
Ilkka Seppälä 21914f9c88 docs: updated diagrams for tolerant reader and trampoline 2025-04-12 09:23:46 +03:00
Ilkka Seppälä 95bfd6cb4d docs: new diagrams for template view and throttling 2025-04-12 09:17:38 +03:00
Ilkka Seppälä ba7be25af3 docs: diagrams for table module and template method 2025-04-12 09:09:44 +03:00
Sanura Hettiarachchi 0b83b6dfd1 feat: Adding backpressure design pattern #3233 (#3249)
* Initial commit backpressure

temp

* Adding backpressure pattern #3233

* Fix test case #3233

* Fix formatting #3233

* Changes after review #3233

* Fix sonar error in leaderfollowers module #3233
2025-04-12 08:46:49 +03:00
Ilkka Seppälä cd224ea5fe docs: add diagrams for spatial partition, special case, specification, state, step builder, strangler, strategy, subclass sandbox 2025-04-10 21:13:17 +03:00
Ilkka Seppälä 8e823909da docs: single table inheritance and singleton diagrams 2025-04-10 20:48:39 +03:00
Ilkka Seppälä e5485dafa9 docs: service to worker, session facade, sharding diagrams 2025-04-10 20:43:16 +03:00
Ilkka Seppälä 73a582867a docs: service locator and service stub diagrams 2025-04-10 20:35:28 +03:00
Ilkka Seppälä b8f38691f3 docs: diagrams for servant and server session 2025-04-10 20:29:05 +03:00
Ilkka Seppälä 30d6875aa1 docs: diagrams for serialized entity and serialized lob 2025-04-10 20:20:47 +03:00
Ilkka Seppälä a97bfec0a7 docs: separated interface diagram 2025-04-10 20:11:01 +03:00
Ilkka Seppälä 54048a1360 docs: add saga flowchart 2025-04-10 20:03:04 +03:00
Kim Gi Uk 6cadf253ba fix: handle awaitTermination result and ensure proper ExecutorService shutdown (#3244)
* fix: handle awaitTermination result and ensure proper ExecutorService shutdown

- Added handling for the result of awaitTermination to avoid Sonar warning
- Wrapped ExecutorService with try-finally for proper shutdown (java:S2095)
- Prevents potential resource leak and aligns with best practices

Fixes: #2865

Note: ExecutorService is not AutoCloseable, so try-with-resources is not applicable. Used try-finally instead.

* fix: add missing logger definition for SLF4J

- Defined logger explicitly with LoggerFactory.getLogger(...)
- Ensured compatibility with Lombok's @Slf4j annotation
- Fixed compilation error caused by missing 'log' variable

* fix: add missing logger definition for SLF4J
2025-04-10 19:33:40 +03:00
Ilkka Seppälä 44f6ab3fd4 docs: retry and role object diagrams 2025-04-09 22:09:38 +03:00
Ilkka Seppälä 21fed2172d docs: raii diagram 2025-04-09 22:01:29 +03:00
Ilkka Seppälä 9e5d9e5a2f docs: repository diagram 2025-04-09 21:57:39 +03:00
Ilkka Seppälä 09e531378f docs: registry diagram 2025-04-09 21:54:13 +03:00
Ilkka Seppälä 6d6638ffd8 docs: reactor diagram 2025-04-09 21:49:23 +03:00
Ilkka Seppälä ae737f62ea docs: queue-based load leveling diagram 2025-04-09 21:40:18 +03:00
Ilkka Seppälä 23af67c755 docs: property, prototype, proxy diagrams 2025-04-09 21:34:01 +03:00
Ilkka Seppälä 3abaa83710 docs: producer-consumer and promise diagrams 2025-04-09 21:33:39 +03:00
Ilkka Seppälä 261da00a1b docs: poison pill and private class data diagrams 2025-04-09 21:33:13 +03:00
Ilkka Seppälä fdd07c772c docs: partial response and pipeline diagrams 2025-04-09 21:32:41 +03:00
Ilkka Seppälä ecfd944e95 docs: page object and parameter object diagrams 2025-04-09 21:32:13 +03:00
Ilkka Seppälä 32dbc7faa6 docs: optimistic offline lock diagram 2025-04-09 21:31:50 +03:00
Ilkka Seppälä 2aaf712f06 docs: object pool and observer diagrams 2025-04-09 21:31:30 +03:00
Ilkka Seppälä 6bae409380 docs: object mother diagrams 2025-04-09 21:31:04 +03:00
Ilkka Seppälä 7ed9e393f0 docs: null object diagram 2025-04-09 21:30:44 +03:00
Ilkka Seppälä f01235b30a docs: add notification diagram 2025-04-09 21:27:42 +03:00
Ilkka Seppälä 15ee32a821 deps: remove unneeded dependency (already exists in parent pom.xml) 2025-04-08 20:20:11 +03:00
dependabot[bot] 8d139234f3 build(deps): bump org.projectlombok:lombok from 1.18.36 to 1.18.38 (#3247)
Bumps [org.projectlombok:lombok](https://github.com/projectlombok/lombok) from 1.18.36 to 1.18.38.
- [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown)
- [Commits](https://github.com/projectlombok/lombok/compare/v1.18.36...v1.18.38)

---
updated-dependencies:
- dependency-name: org.projectlombok:lombok
  dependency-version: 1.18.38
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-08 20:09:47 +03:00
dependabot[bot] 48ba1b2053 build(deps-dev): bump de.flapdoodle.embed:de.flapdoodle.embed.mongo (#3248)
Bumps [de.flapdoodle.embed:de.flapdoodle.embed.mongo](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo) from 4.18.1 to 4.20.0.
- [Commits](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/compare/de.flapdoodle.embed.mongo-4.18.1...de.flapdoodle.embed.mongo-4.20.0)

---
updated-dependencies:
- dependency-name: de.flapdoodle.embed:de.flapdoodle.embed.mongo
  dependency-version: 4.20.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-08 20:08:51 +03:00
dependabot[bot] 8f263c8cca build(deps): bump org.apache.maven.plugins:maven-compiler-plugin (#3246)
Bumps [org.apache.maven.plugins:maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 3.13.0 to 3.14.0.
- [Release notes](https://github.com/apache/maven-compiler-plugin/releases)
- [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.13.0...maven-compiler-plugin-3.14.0)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-compiler-plugin
  dependency-version: 3.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-08 20:08:06 +03:00
Ilkka Seppälä 8d5cb59388 docs: add diagrams for marker interface, master-worker, mediator, memento, metadata mapping, microservices api gateway, microservices log aggregation, monad, monitor, monostate, multiton, mute idiom 2025-04-07 22:14:20 +03:00
Ilkka Seppälä 72eeb167c5 docs: add diagrams for lazy loading, leader election, leader followers, lockable object 2025-04-06 21:22:32 +03:00
Ilkka Seppälä d8b07ac484 docs: add diagrams for identity map, intercepting filter, interpreter, iterator 2025-04-06 21:11:20 +03:00
Ilkka Seppälä 9d23a234bb docs: add new diagrams for game loop, gateway, guarded suspension, half-sync/half-async, health check 2025-04-06 20:55:07 +03:00
Ilkka Seppälä 9b64cdee98 docs: add diagrams for facade, factory kit, factory method, factory, fan-out/fan-in, feature toggle, filterer, fluent interface, flyweight, front controller, function composition 2025-04-06 19:10:43 +03:00
Ilkka Seppälä aef4b37c9a docs: add diagrams for event aggregator, event-based asynchronous, event queue, execute around, extension objects 2025-04-06 18:36:32 +03:00
Ilkka Seppälä 30d13083ae docs: add diagrams for decorator, delegation, dependency injection, dirty flag, domain model, double buffer, double-checked locking, double dispatch, and dynamic proxy 2025-04-06 15:52:26 +03:00
Ilkka Seppälä 203548ec03 fix: fix image filename 2025-04-06 13:13:25 +03:00
Ilkka Seppälä b6c13a2fa0 docs: add diagrams for dao, data bus, data locality, data mapper, dto 2025-04-06 13:08:08 +03:00
Ilkka Seppälä 0509fabe8e docs: diagrams for callback, circuit breaker, client session, collecting parameter, colletion pipeline, combinator, command, commander, component, composite entity, composite view, composite, context object, converter, crtp, currying 2025-04-06 11:31:49 +03:00
Ilkka Seppälä d5a46be3c5 docs: builder, business-delegate, bytecode, caching, callback, chain diagrams 2025-04-06 09:00:19 +03:00
Ilkka Seppälä 25f7bc6fea docs: balking, bloc, bridge diagrams 2025-04-06 08:27:22 +03:00
Ilkka Seppälä 9ca63fce83 docs: add async method invocation sequence diagram 2025-04-05 21:10:41 +03:00
Ilkka Seppälä 1b17c400e3 docs: add arrange/act/assert flowchart 2025-04-05 20:55:10 +03:00
Ilkka Seppälä 35bae7e839 docs: add anti-corruption layer sequence diagram 2025-04-05 20:41:32 +03:00
Ilkka Seppälä bd622823ba docs: add ambassador sequence diagram 2025-04-05 20:33:19 +03:00
Ilkka Seppälä faea74ae2b docs: add adapter sequence diagram 2025-04-05 20:20:12 +03:00
Ilkka Seppälä 356db48c8e fix: clean-architecture logging deps and spotless formatting 2025-04-05 09:48:15 +03:00
Ilkka Seppälä ee699af6ef deps: refactor dependencies 2025-04-05 09:45:53 +03:00
allcontributors[bot] 03db45d3ea docs: add Suchismita-Deb as a contributor for code (#3242)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-04-05 09:43:11 +03:00
Suchismita DebandIlkka Seppälä f7e717dcad feat: Clean Architecture (#3235)
* #3230 - Clean Architecture.

* #3230 - Clean Architecture.

* #3230 - Clean Architecture.

* #3230 - Clean Architecture.

* #3230 - Clean Architecture Sonar.

* #3230 - Clean Architecture Sonar.

* #3230 - Clean Architecture Sonar.

* #3230 - Clean Architecture Sonar.

---------

Co-authored-by: Ilkka Seppälä <iluwatar@users.noreply.github.com>
2025-04-05 09:40:55 +03:00
dependabot[bot] d82328338d build(deps): bump com.fasterxml.jackson.core:jackson-databind (#3240)
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.17.2 to 2.18.3.
- [Commits](https://github.com/FasterXML/jackson/commits)

---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
  dependency-version: 2.18.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-01 20:58:25 +03:00
dependabot[bot] 125b909534 build(deps-dev): bump org.awaitility:awaitility from 4.2.2 to 4.3.0 (#3238)
Bumps [org.awaitility:awaitility](https://github.com/awaitility/awaitility) from 4.2.2 to 4.3.0.
- [Changelog](https://github.com/awaitility/awaitility/blob/master/changelog.txt)
- [Commits](https://github.com/awaitility/awaitility/compare/awaitility-4.2.2...awaitility-4.3.0)

---
updated-dependencies:
- dependency-name: org.awaitility:awaitility
  dependency-version: 4.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-01 20:56:54 +03:00
Ilkka Seppälä b35592ab4a deps: move junit-jupiter-migrationsupport to parent pom.xml 2025-04-01 20:55:42 +03:00
allcontributors[bot] 914e4f909a docs: add 2897robo as a contributor for code (#3237)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-03-31 21:09:22 +03:00
Kim Gi Uk 9073b781b5 fix: resolve SonarCloud issue in dirty flag / App.java #2865 (#3236) 2025-03-31 21:08:18 +03:00
Ilkka Seppälä b1b6e82cb1 docs: add missing licence headers 2025-03-30 20:28:55 +03:00
allcontributors[bot] b7b0a35b5a docs: add sanurah as a contributor for code (#3234)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-03-30 20:25:03 +03:00
Sanura HettiarachchiandSanura Hettiarachchi 418557129b feat: add publish-subscribe design pattern (#2898) (#3223)
* feat: add publisher-subscriber design pattern (#2898)

* fix: check styles on publisher-subscriber design pattern (#2898)

* fix: check styles on publisher-subscriber design pattern (#2898)

* fix: check styles on publisher-subscriber design pattern (#2898)

* fix: improve coverage on publisher-subscriber design pattern (#2898)

* fix: fix dependancy on publisher-subscriber design pattern (#2898)

* fix: fix documentation on publisher-subscriber design pattern (#2898)

* fix: apply spotless on publisher-subscriber design pattern (#2898)

* fix: changes after review on publisher-subscriber design pattern (#2898)

* fix: changes after review on publisher-subscriber design pattern (#2898)

* fix: fix sonar on publisher-subscriber design pattern (#2898)

* fix: fix sonar on publisher-subscriber design pattern (#2898)

---------

Co-authored-by: Sanura Hettiarachchi <sanura.hettiarachchi@tipico.com>
2025-03-30 20:24:15 +03:00
Ilkka Seppälä 0ca162a55c deps: Refactor dependencies (#3224)
* remove spring dep
move junit, logging, mockito under dep mgmt

* upgrade anti-corruption-layer deps

* async method invocation

* balking, bloc

* bridge to bytecode

* caching

* callback - cqrs

* component - health check

* hexagonal - metadata mapping

* rest of the patterns

* remove checkstyle, take spotless into use
2025-03-29 19:34:27 +02:00
Ilkka Seppälä 371439aeaa fix: remove mockito test 2025-03-25 21:03:05 +02:00
Ilkka Seppälä afa4518dcf fix: fix templateview mockito tests 2025-03-25 20:53:51 +02:00
Ilkka Seppälä ed4a756b62 fix: fix template-method mockito tests 2025-03-25 20:52:02 +02:00
Ilkka Seppälä 5a371a4e76 fix: remove urm-maven-plugin from the build 2025-03-25 18:49:47 +02:00
Ilkka Seppälä a6c7d3d41a feat: Java 21 update (#3213)
* update pom.xml and github actions scripts

* disable failing tests, for now
2025-03-25 18:28:33 +02:00
dependabot[bot] 51d5ef1e7c build(deps): bump logback.version from 1.5.6 to 1.5.18 (#3219)
Bumps `logback.version` from 1.5.6 to 1.5.18.

Updates `ch.qos.logback:logback-classic` from 1.5.6 to 1.5.18
- [Release notes](https://github.com/qos-ch/logback/releases)
- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.6...v_1.5.18)

Updates `ch.qos.logback:logback-core` from 1.5.6 to 1.5.18
- [Release notes](https://github.com/qos-ch/logback/releases)
- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.6...v_1.5.18)

---
updated-dependencies:
- dependency-name: ch.qos.logback:logback-classic
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: ch.qos.logback:logback-core
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-25 17:33:40 +02:00
dependabot[bot] 3a5553bf21 build(deps): bump jakarta.persistence:jakarta.persistence-api (#3218)
Bumps [jakarta.persistence:jakarta.persistence-api](https://github.com/jakartaee/persistence) from 3.1.0 to 3.2.0.
- [Release notes](https://github.com/jakartaee/persistence/releases)
- [Commits](https://github.com/jakartaee/persistence/compare/3.1-3.1.0-RELEASE...3.2-3.2.0-RELEASE)

---
updated-dependencies:
- dependency-name: jakarta.persistence:jakarta.persistence-api
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-25 17:32:58 +02:00
Ilkka Seppälä 324dad549f docs: update acyclic visitor documentation 2025-03-24 19:16:41 +02:00
Ilkka Seppälä 3dc27b25bb docs: escape angle brackets to fix html build 2025-03-24 18:40:36 +02:00
Ilkka Seppälä 0f19b475b2 docs: update active object readme 2025-03-23 21:04:37 +02:00
Ilkka Seppälä 7effd99f0d docs: update abstract factory readme 2025-03-23 10:29:30 +02:00
Ilkka Seppälä 770a85e56f docs: update abstract document readme 2025-03-23 10:05:15 +02:00
allcontributors[bot] 02ae009c32 docs: add johnklint81 as a contributor for code (#3217)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-03-23 07:38:28 +02:00
John Klint adf5b62753 feat: Add Service Stub Pattern using Sentiment Analysis example (#3215)
* Add Service Stub Pattern using Sentiment Analysis example

* Fix Checkstyle issues

* Suppress Sonar warning for Random usage in RealSentimentAnalysisServer
2025-03-23 07:37:35 +02:00
allcontributors[bot] abfb137040 docs: add DenizAltunkapan as a contributor for translation (#3216)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-03-23 07:22:19 +02:00
Deniz Altunkapan baf2efa23c translation: German Translation for abstract-document and improved Main README (#3214)
* improve german translation. See #2275

* add german (de) abstract-document. See #2275
2025-03-23 07:21:24 +02:00
Ilkka Seppälä 894ae8f10c fix: add missing property 2025-03-18 16:31:51 +02:00
Ilkka Seppälä dd8b9b377a fix: Set locale in tests to be able to run locally. Remove logging dependency fixed versions in parent pom.xml to prevent conflicts with spring boot. Update license headers. Update urm diagrams. 2025-03-18 15:56:06 +02:00
allcontributors[bot] 0b1933ece3 docs: add Duartegdm as a contributor for doc (#3211)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-03-18 10:08:16 +02:00
Gabriel Duarte a89cf9866b docs: Improve Anti-Corruption-Layer README(#3200) (#3206) 2025-03-18 10:07:33 +02:00
allcontributors[bot] 8164b97ad5 docs: add Francisco-G-P as a contributor for translation (#3210)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-03-18 09:52:34 +02:00
Francisco-G-P 66768fcc48 translation: Added and translated map-reduce README.md to Spanish. (#3204) 2025-03-18 09:51:41 +02:00
dependabot[bot] 845a42834d build(deps): bump org.projectlombok:lombok from 1.18.24 to 1.18.36 (#3205)
Bumps [org.projectlombok:lombok](https://github.com/projectlombok/lombok) from 1.18.24 to 1.18.36.
- [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown)
- [Commits](https://github.com/projectlombok/lombok/compare/v1.18.24...v1.18.36)

---
updated-dependencies:
- dependency-name: org.projectlombok:lombok
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-18 09:44:55 +02:00
allcontributors[bot] 29d1e304ff docs: add smile-ab as a contributor for code (#3209)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-03-18 09:43:36 +02:00
smile-ab 19d9d31bb7 feat: Fix Singleton typo and extend reflection handling to remaining implementations (#3203)
* fix typo

* adding Reflection handling to other Singleton implementations
2025-03-18 09:42:14 +02:00
allcontributors[bot] e403df81fc docs: add smile-ab as a contributor for translation (#3208)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-03-18 09:34:05 +02:00
smile-ab 457858cc13 translation: Translation of the Singleton pattern to Portuguese (#3201) 2025-03-18 09:33:05 +02:00
Ilkka Seppälä 17267493c6 docs: add service layer architecture diagram 2025-03-11 21:47:40 +02:00
Ilkka Seppälä fbde0090a0 docs: add presentation model architecture diagram 2025-03-11 21:42:12 +02:00
Ilkka Seppälä 8a2c779809 docs: add page controller architecture diagram 2025-03-09 19:09:46 +02:00
Ilkka Seppälä 74f5fdfea9 docs: add naked objects architecture diagram 2025-03-09 18:48:14 +02:00
Ilkka Seppälä 0904e2da3b docs: add monolithic architecture diagram 2025-03-09 18:36:08 +02:00
Ilkka Seppälä 511f0084fa docs: add mvvm architecture diagram 2025-03-07 20:01:26 +02:00
Ilkka Seppälä 4a96f2d227 docs: add mvp architecture diagram 2025-03-06 20:15:11 +02:00
Ilkka Seppälä d36eeec52c docs: add mvi architecture diagram 2025-03-05 21:47:22 +02:00
Ilkka Seppälä b9938055bc docs: add mvc architecture diagram 2025-03-04 21:14:30 +02:00
Ilkka Seppälä 30347328d6 docs: add microservices aggregator architecture diagram 2025-03-04 21:00:42 +02:00
dependabot[bot] e24739c541 build(deps): bump org.slf4j:slf4j-api from 2.0.16 to 2.0.17 (#3198)
Bumps org.slf4j:slf4j-api from 2.0.16 to 2.0.17.

---
updated-dependencies:
- dependency-name: org.slf4j:slf4j-api
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-04 20:42:57 +02:00
Ilkka Seppälä d78337e4b6 docs: add layered architecture diagram 2025-03-03 20:45:04 +02:00
Ilkka Seppälä d0701d6471 docs: add intercepting filter architecture diagram 2025-03-02 15:34:53 +02:00
Ilkka Seppälä eee75757fb docs: add hexagonal architecture diagram 2025-03-01 14:31:44 +02:00
Ilkka Seppälä 546c7ecf53 docs: add front controller architecture diagram 2025-03-01 13:45:49 +02:00
Ilkka Seppälä a10c392425 docs: add event sourcing architecture diagram 2025-02-28 14:11:48 +02:00
dependabot[bot] 609bf8e4d1 build(deps): bump org.assertj:assertj-core from 3.24.2 to 3.27.3 (#3194)
Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.24.2 to 3.27.3.
- [Release notes](https://github.com/assertj/assertj/releases)
- [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.24.2...assertj-build-3.27.3)

---
updated-dependencies:
- dependency-name: org.assertj:assertj-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-28 12:48:57 +02:00
Ilkka Seppälä f3c4a83a0a docs: add flux architecture diagram and fix #3193 duplicate content issue 2025-02-28 08:44:14 +02:00
Ilkka Seppälä 2e40cc02d3 docs: add eda architecture diagram 2025-02-23 20:46:56 +02:00
Ilkka Seppälä 4e16d4b1e7 docs: update cqrs docs 2025-02-23 20:21:05 +02:00
Ilkka Seppälä 1f44a8c84c docs: add CQRS architecture diagram 2025-02-23 20:16:05 +02:00
allcontributors[bot] 851ebba4d7 docs: add hvgh88 as a contributor for code (#3191)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-02-22 20:09:42 +02:00
Harshita Vidapanakal 6785b53b02 feat: Added Map Reduce Design Pattern (#3184)
* MapReduce design pattern added

* Updated README.md

* added module to parent pom
2025-02-22 20:08:05 +02:00
dependabot[bot] e17f138223 build(deps-dev): bump org.testng:testng from 7.7.1 to 7.11.0 (#3190)
Bumps [org.testng:testng](https://github.com/testng-team/testng) from 7.7.1 to 7.11.0.
- [Release notes](https://github.com/testng-team/testng/releases)
- [Changelog](https://github.com/testng-team/testng/blob/master/CHANGES.txt)
- [Commits](https://github.com/testng-team/testng/compare/7.7.1...7.11.0)

---
updated-dependencies:
- dependency-name: org.testng:testng
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-18 17:55:28 +02:00
allcontributors[bot] fb92682cd5 docs: add maximevtush as a contributor for code (#3188)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-02-16 09:17:48 +02:00
Maxim Evtush 2e7eef136a fix: typos in documentation files (#3186)
* Update CannotSubtractException.java

* Update CachingTest.java

* Update App.java

* Update caching.urm.puml

* Update update-method.urm.puml
2025-02-16 09:16:52 +02:00
dependabot[bot] be0815680b build(deps): bump org.apache.maven.plugins:maven-surefire-plugin (#3085)
Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.5.1 to 3.5.2.
- [Release notes](https://github.com/apache/maven-surefire/releases)
- [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.5.1...surefire-3.5.2)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-surefire-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-16 08:54:53 +02:00
allcontributors[bot] 39e4d6ab8a docs: add MohanedAtef238 as a contributor for code (#3187)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-02-15 09:55:16 +02:00
Mohaned AtefandIlkka Seppälä a25b6a003d feat: Implemented Monolithic Architecture according to the guidelines provided by issue #2664 (#3111)
* added a pom.xml file for the monolithic structure, set up MVC file structure, and added basic model files using H2 database since its light and efficient

* added a pom.xml file for the monolithic structure, set up MVC file structure, and added basic model files using H2 database since its light and efficient

* Added "controllers" and repository classes to communicate with database to maintain code cleanliness

* added application.properties file for springboot, added controller classes and used the CLI main class from the previous submission and enhanced upon it

* fixed checkstyle comments

* fixed testing class

* automatically generated puml

* Readme File

Added Detailed Readme File in the md format

* attempting to fix some debugging issues

added more test cases, and tried to fix pom.xml

* dropped change

* another attempted fix

* added more test cases

* Fixes

Renamed the main module/directory. Added more content to the readme.md file. fixed the orElseThrow statements

Fixes

Renamed the main module/directory. Added more content to the readme.md file. fixed the orElseThrow statements

* fixed naming and readme file

---------

Co-authored-by: Ilkka Seppälä <iluwatar@users.noreply.github.com>
2025-02-15 09:53:58 +02:00
allcontributors[bot] 9ad38a4f3c docs: add darkhyper24 as a contributor for code (#3181)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-01-16 16:57:40 +02:00
darkhyper24 21115f4568 feat: implemented the bloC design pattern issue #2374 (#3128)
* added bloC design pattern

* added bloC design pattern

* added Readme file

* fixed checkstyle warnings

* added tests for the ui

* fixed a test in MainTest file

* separating ui from main file and adding more tests

* added pom.xml plugins and properties and fixed readme.md

* fixed renaming problem and added context to main

* chsnged state class to record

* syncing changes for conflicts

* Revert "fixed conflicts"

* restored files

* renamed readme file and abstracted pom file
2025-01-16 16:56:53 +02:00
allcontributors[bot] 3a1a71405b docs: add clintaire as a contributor for code (#3176)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-01-13 21:06:39 +02:00
Clint Airé 2a261cd734 chore: Remove obsolete update-header.sh (#3174)
* chore: add MIT license information to update-header.sh

* chore: remove update-header.sh script
2025-01-13 21:05:51 +02:00
allcontributors[bot] 07c82e460a docs: add mehdirahimi as a contributor for code (#3175)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-01-13 18:04:49 +02:00
Mehdi Rahimi 49172dd5be fix: Minor misspelling (#3161) 2025-01-13 18:03:54 +02:00
dependabot[bot] f0f4c7d4c0 build(deps): bump com.fasterxml.jackson.core:jackson-core (#3171)
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.18.1 to 2.18.2.
- [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.18.1...jackson-core-2.18.2)

---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-12 19:06:39 +02:00
Ilkka Seppälä 03f0bee103 doc: Update PR template 2025-01-12 19:03:56 +02:00
Ilkka Seppälä fee3c43f20 fix: Update presubmit action 2025-01-12 18:26:41 +02:00
Ilkka Seppälä 1bfdf21469 ci: Add presubmit AI reviews 2025-01-12 14:19:45 +02:00
Ilkka Seppälä b419f849d9 fix: Fix stale action configuration 2025-01-12 11:39:49 +02:00
allcontributors[bot] aedbe161f3 docs: add shahdhoss as a contributor for code (#3173)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-01-11 17:45:55 +02:00
Shahd HossamandIlkka Seppälä 8cb7c9ada6 feat: Implementation of session facade design pattern #1278 (#3121)
* implementation of session facade #1278

* minor change

* readme updated

* addressed the comments regarding changing lists to maps and adding maven assembly plugin

---------

Co-authored-by: Ilkka Seppälä <iluwatar@users.noreply.github.com>
2025-01-11 17:45:01 +02:00
Ilkka Seppälä bcad5b1aa3 fix: fix filename of README.md 2025-01-06 20:58:07 +02:00
allcontributors[bot] caa51bdb22 docs: add TarunVishwakarma1 as a contributor for code (#3169)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-01-06 20:56:14 +02:00
Tarun VishwakarmaandIlkka Seppälä ab59dfe770 feat: Added Microservices UI Client side composition #2698 (#3062)
* Added Microservices client side ui composition to the repo.
Added ClientSideCompositionTest, ApiGateway, ClientSideIntegrator, FrontendComponent, CartFrontend, ProductFrontend, updated pom.xml, ReadME.md.

* Improved some checkstyle changes.

* Added Random variable to re-use the random instead of creating it everytime in FrontendComponent.

* changed the Pom.xml and upadted the ReadME.md

* Changes in the README.md File as per requirement, name of the file changed from ReadME.md to README.md

---------

Co-authored-by: Ilkka Seppälä <iluwatar@users.noreply.github.com>
2025-01-06 20:55:08 +02:00
allcontributors[bot] c06bd2c5a1 docs: add depthlending as a contributor for doc (#3168)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-01-06 19:40:42 +02:00
BiKangNing afcd964e7b fix: Fixed some typos (#3153)
Signed-off-by: depthlending <bikangning@outlook.com>
2025-01-06 19:39:54 +02:00
allcontributors[bot] 60e21294d3 docs: add malak-elbanna as a contributor for code (#3167)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-01-06 19:25:19 +02:00
Malak ElbannaandIlkka Seppälä 5ba45701bf feat: Implemented the Template View pattern (#1320) (#3110)
* pattern:implemented the Template View pattern (#1320)

* fix:added links in README and updated package name (#1320)

---------

Co-authored-by: Ilkka Seppälä <iluwatar@users.noreply.github.com>
2025-01-06 19:24:40 +02:00
allcontributors[bot] ebcc070e11 docs: add Ahmed-Taha-981 as a contributor for code (#3166)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-01-06 19:20:06 +02:00
Ahmed-Taha-981andIlkka Seppälä cdb78d7fb6 feat: Money pattern (#3109)
* Money pattern

the implementation of the money patter and the tests along with the read me file

* Update money/README.md

Co-authored-by: Ilkka Seppälä <iluwatar@users.noreply.github.com>

* added App file anf modified README file and pom.xml file

* modified README and pom.xml

* added comments

* Added a test for App.java

---------

Co-authored-by: Ilkka Seppälä <iluwatar@users.noreply.github.com>
2025-01-06 19:19:22 +02:00
dependabot[bot] ac539606b1 build(deps-dev): bump de.flapdoodle.embed:de.flapdoodle.embed.mongo (#3148)
Bumps [de.flapdoodle.embed:de.flapdoodle.embed.mongo](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo) from 4.18.0 to 4.18.1.
- [Commits](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/compare/de.flapdoodle.embed.mongo-4.18.0...de.flapdoodle.embed.mongo-4.18.1)

---
updated-dependencies:
- dependency-name: de.flapdoodle.embed:de.flapdoodle.embed.mongo
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-06 19:13:01 +02:00
allcontributors[bot] 84a18185f7 docs: add HabibaMekay as a contributor for code (#3165)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-01-06 19:04:20 +02:00
HabibaMekay c5a6862887 feat: Implemented the Table Inheritance pattern (#3105)
* sample classes and tests

* sample classes and tests

* read me addition

* fix violations

* fix quality (coverage)

* fix quality (coverage) #2

* resolved comments
2025-01-06 19:03:27 +02:00
Ilkka Seppälä eb7a0dff55 fix: Move from deprecated stale bot to stale action 2025-01-05 17:23:11 +02:00
allcontributors[bot]andIlkka Seppälä 8938054691 docs: add CodeMaverick-143 as a contributor for code (#3139)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Ilkka Seppälä <iluwatar@users.noreply.github.com>
2024-12-09 20:17:12 +02:00
allcontributors[bot] b9ff511c7a docs: add mayatarek as a contributor for translation (#3138)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-12-09 20:11:44 +02:00
Arpit Sarang f1a0ad8cc0 feat: Update index.jsp (#3066)
Title: Added a <title> element to provide a title for the page.
Enhanced Styling: Improved styling for readability and aesthetic appeal, including a background color and box shadow for the parameter section.
Expanded Descriptions: Clarified the purpose of each parameter.
Example Request: Provided an example of how to format a GET request.
Error Handling Tip: Included a note on what to do if the request fails.
2024-12-08 17:30:08 +02:00
Maya eead12d308 docs: added arabic translations to README files (#2273) (#3107) 2024-12-08 17:26:46 +02:00
dependabot[bot] adbddcb518 build(deps-dev): bump org.htmlunit:htmlunit from 4.5.0 to 4.7.0 (#3104)
Bumps [org.htmlunit:htmlunit](https://github.com/HtmlUnit/htmlunit) from 4.5.0 to 4.7.0.
- [Release notes](https://github.com/HtmlUnit/htmlunit/releases)
- [Commits](https://github.com/HtmlUnit/htmlunit/compare/4.5.0...4.7.0)

---
updated-dependencies:
- dependency-name: org.htmlunit:htmlunit
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-07 20:34:41 +02:00
allcontributors[bot] fc07a38ed6 docs: add SalmaAzeem as a contributor for code (#3132)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-12-07 20:32:50 +02:00
Salma 297e429e5a fix: Reduce High severity issues reported by SonarCloud #2865 (#3103)
* fix: add UnsupportedOperationException in KingsHand and GameLoopTest

* refactor: update DatabaseService to use constant for BINARY_DATA and remove obsolete test files

* refactor: update timePasses method in KingsHand

* refactor CandyGame.java

* refactor: simplify boundary checks in CandyGame

* feat: add getters for type and points in Candy class and initialize logger in CandyGame

* remove class and logger initialization in CandyGame

* Modify CandyGame.java

* fix Checkstyle violations

* Remove generic wildcard type in ThreatAwareSystem
2024-12-07 20:31:59 +02:00
allcontributors[bot] b375919db5 docs: add mammadyahyayev as a contributor for doc (#3102)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-12-01 18:22:21 +02:00
Mammad Yahyayev 0f27139fda fix: Fix typo (#3100) 2024-12-01 18:21:42 +02:00
dependabot[bot] b383d2ec1a build(deps): bump org.sonarsource.scanner.maven:sonar-maven-plugin (#3097)
Bumps [org.sonarsource.scanner.maven:sonar-maven-plugin](https://github.com/SonarSource/sonar-scanner-maven) from 4.0.0.4121 to 5.0.0.4389.
- [Release notes](https://github.com/SonarSource/sonar-scanner-maven/releases)
- [Commits](https://github.com/SonarSource/sonar-scanner-maven/compare/4.0.0.4121...5.0.0.4389)

---
updated-dependencies:
- dependency-name: org.sonarsource.scanner.maven:sonar-maven-plugin
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-01 18:14:59 +02:00
allcontributors[bot] f9945c9ce7 docs: add proceane as a contributor for translation (#3096)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-11-15 21:14:34 +02:00
Juyeon 8a0f433e4a docs: Translate the Factory-Method pattern to Korean (#3094)
* docs: Translate the Factory-Method pattern to Korean

* Update README.md

* Update README.md
2024-11-15 21:13:45 +02:00
dependabot[bot] 391aec449b build(deps): bump com.fasterxml.jackson.core:jackson-core (#3091)
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.17.2 to 2.18.1.
- [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.17.2...jackson-core-2.18.1)

---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-15 21:06:30 +02:00
allcontributors[bot] 0d63c95ad3 docs: add apophizzz as a contributor for code (#3095)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-11-15 21:05:28 +02:00
Patrick Kleindienst 97de002348 fix: Executable JAR: Include project version in final name (#3090) 2024-11-15 21:04:25 +02:00
allcontributors[bot] 82e30ab717 docs: add dmgodoy as a contributor for code (#3089)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-11-11 18:00:16 +02:00
David M. 2a2c5605bc feat: Idempotent Consumer Microservice Pattern #2683 (#3082)
* added idempotent consumer pattern

* updated doc

* fixed bug in RequestService

* add test converage

* Add test converage to state machine

* renamed module and added code example
2024-11-11 17:59:35 +02:00
allcontributors[bot] 25bb77eee7 docs: add jeffmorrison as a contributor for code (#3088)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-11-10 10:58:31 +02:00
jeffmorrison e761d78651 refactor: Updated switch expression (#3030) 2024-11-10 10:57:42 +02:00
dependabot[bot] 094027e0f7 build(deps-dev): bump de.flapdoodle.embed:de.flapdoodle.embed.mongo (#3083)
Bumps [de.flapdoodle.embed:de.flapdoodle.embed.mongo](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo) from 4.17.0 to 4.18.0.
- [Commits](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/compare/de.flapdoodle.embed.mongo-4.17.0...de.flapdoodle.embed.mongo-4.18.0)

---
updated-dependencies:
- dependency-name: de.flapdoodle.embed:de.flapdoodle.embed.mongo
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-10 10:32:41 +02:00
dependabot[bot] a50a45ae0d build(deps): bump org.apache.maven.plugins:maven-checkstyle-plugin (#3084)
Bumps [org.apache.maven.plugins:maven-checkstyle-plugin](https://github.com/apache/maven-checkstyle-plugin) from 3.5.0 to 3.6.0.
- [Commits](https://github.com/apache/maven-checkstyle-plugin/compare/maven-checkstyle-plugin-3.5.0...maven-checkstyle-plugin-3.6.0)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-checkstyle-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-10 10:31:56 +02:00
allcontributors[bot] f48c686f2b docs: add jasonjyu as a contributor for code (#3081)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-11-03 13:13:26 +02:00
jasonjyu 1575b56b98 feat: Added to AbstractDocumentTest verification of originalValue in document (#3070) 2024-11-03 13:12:37 +02:00
dependabot[bot] af0b901706 build(deps-dev): bump org.htmlunit:htmlunit from 4.4.0 to 4.5.0 (#3073)
Bumps [org.htmlunit:htmlunit](https://github.com/HtmlUnit/htmlunit) from 4.4.0 to 4.5.0.
- [Release notes](https://github.com/HtmlUnit/htmlunit/releases)
- [Commits](https://github.com/HtmlUnit/htmlunit/compare/4.4.0...4.5.0)

---
updated-dependencies:
- dependency-name: org.htmlunit:htmlunit
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-03 13:04:57 +02:00
dependabot[bot] 6e0df3facd build(deps): bump org.eclipse.jetty:jetty-maven-plugin (#3065)
Bumps org.eclipse.jetty:jetty-maven-plugin from 11.0.22 to 11.0.24.

---
updated-dependencies:
- dependency-name: org.eclipse.jetty:jetty-maven-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-03 12:32:14 +02:00
dependabot[bot] cb1b0b291a build(deps): bump org.apache.maven.plugins:maven-surefire-plugin (#3063)
Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.5.0 to 3.5.1.
- [Release notes](https://github.com/apache/maven-surefire/releases)
- [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.5.0...surefire-3.5.1)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-surefire-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-03 12:31:43 +02:00
allcontributors[bot] 337f0451e1 docs: add LakshyaPunyani-01 as a contributor for code (#3080)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-11-03 12:05:18 +02:00
LakshyaPunyani-01 076863b937 feat: Added Home button to composite view appllication header for easy navigation to home page (#3059) 2024-11-03 12:04:30 +02:00
Ilkka Seppälä 7c8802ef6f fix: add shortTitle to es and ko localization readmes 2024-10-20 10:22:52 +03:00
allcontributors[bot] ede0fc16ae docs: add fishandsheep as a contributor for translation (#3072)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-10-20 10:01:54 +03:00
QinShower b00b8aa365 fix: add shortTitle column to Chinese readme (#3056) 2024-10-20 10:00:37 +03:00
dependabot[bot] 0da86434ee build(deps-dev): bump de.flapdoodle.embed:de.flapdoodle.embed.mongo (#3053)
Bumps [de.flapdoodle.embed:de.flapdoodle.embed.mongo](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo) from 4.16.2 to 4.17.0.
- [Commits](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/compare/de.flapdoodle.embed.mongo-4.16.2...de.flapdoodle.embed.mongo-4.17.0)

---
updated-dependencies:
- dependency-name: de.flapdoodle.embed:de.flapdoodle.embed.mongo
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-20 09:55:21 +03:00
allcontributors[bot] 083a46ffcd docs: add antoheri as a contributor for translation (#3071)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-10-20 09:53:37 +03:00
Antoine Héritier f1a73e33f0 translattion: Translation of business-deleagate in french (#3050) 2024-10-20 09:52:53 +03:00
dependabot[bot] b82cdf7ed9 build(deps): bump com.mycila:license-maven-plugin from 4.5 to 4.6 (#3051)
Bumps [com.mycila:license-maven-plugin](https://github.com/mathieucarbou/license-maven-plugin) from 4.5 to 4.6.
- [Release notes](https://github.com/mathieucarbou/license-maven-plugin/releases)
- [Commits](https://github.com/mathieucarbou/license-maven-plugin/compare/license-maven-plugin-4.5...license-maven-plugin-4.6)

---
updated-dependencies:
- dependency-name: com.mycila:license-maven-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-13 18:40:59 +03:00
allcontributors[bot] 69eace4a49 docs: add vvanghelle as a contributor for translation (#3060)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-10-13 18:31:07 +03:00
Vincent Vanghelle 4c043e58d9 translation: Add French translation for anti-corruption-layer & Builder (#3038)
* feat(fr): Add translation for anti-corruption-layer

* feat(fr): Add translation for builder pattern
2024-10-13 18:29:47 +03:00
dependabot[bot] 7472d2f99e build(deps): bump org.apache.maven.plugins:maven-checkstyle-plugin (#3036)
Bumps [org.apache.maven.plugins:maven-checkstyle-plugin](https://github.com/apache/maven-checkstyle-plugin) from 3.4.0 to 3.5.0.
- [Commits](https://github.com/apache/maven-checkstyle-plugin/compare/maven-checkstyle-plugin-3.4.0...maven-checkstyle-plugin-3.5.0)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-checkstyle-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-13 18:25:48 +03:00
allcontributors[bot] 084817f307 docs: add trivikr as a contributor for code (#3047)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-10-06 10:20:58 +03:00
Trivikram Kamat 53b973e83f chore: bump github actions to use latest versions (#3033) 2024-10-06 10:19:48 +03:00
dependabot[bot] fcb0698b00 build(deps-dev): bump org.awaitility:awaitility from 4.2.1 to 4.2.2 (#3025)
Bumps [org.awaitility:awaitility](https://github.com/awaitility/awaitility) from 4.2.1 to 4.2.2.
- [Changelog](https://github.com/awaitility/awaitility/blob/master/changelog.txt)
- [Commits](https://github.com/awaitility/awaitility/compare/awaitility-4.2.1...awaitility-4.2.2)

---
updated-dependencies:
- dependency-name: org.awaitility:awaitility
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-06 10:07:24 +03:00
dependabot[bot] ace3c4d015 build(deps): bump org.slf4j:slf4j-api from 2.0.13 to 2.0.16 (#3026)
Bumps org.slf4j:slf4j-api from 2.0.13 to 2.0.16.

---
updated-dependencies:
- dependency-name: org.slf4j:slf4j-api
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-06 10:05:40 +03:00
allcontributors[bot] 57baf1334e docs: add Ritabrata1080 as a contributor for review (#3046)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-10-06 09:56:35 +03:00
allcontributors[bot] 539fda29ac docs: add Xcyq as a contributor for code (#3045)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-10-06 09:55:44 +03:00
Xcyq 24b4586944 fix: Video.toString() outputs an illegal json string (#3032)
refactor: json string concat

add an extra line at EOF
2024-10-06 09:54:41 +03:00
dependabot[bot] 8bd31758b9 build(deps): bump org.apache.maven.plugins:maven-surefire-plugin (#3031)
Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.3.1 to 3.5.0.
- [Release notes](https://github.com/apache/maven-surefire/releases)
- [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.3.1...surefire-3.5.0)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-surefire-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-22 11:15:02 +03:00
dependabot[bot] 007dcb15bf build(deps-dev): bump de.flapdoodle.embed:de.flapdoodle.embed.mongo (#3022)
Bumps [de.flapdoodle.embed:de.flapdoodle.embed.mongo](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo) from 4.16.1 to 4.16.2.
- [Commits](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/compare/de.flapdoodle.embed.mongo-4.16.1...de.flapdoodle.embed.mongo-4.16.2)

---
updated-dependencies:
- dependency-name: de.flapdoodle.embed:de.flapdoodle.embed.mongo
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-01 08:18:08 +03:00
dependabot[bot] 4cb8eed9b7 build(deps-dev): bump org.htmlunit:htmlunit from 4.3.0 to 4.4.0 (#3023)
Bumps [org.htmlunit:htmlunit](https://github.com/HtmlUnit/htmlunit) from 4.3.0 to 4.4.0.
- [Release notes](https://github.com/HtmlUnit/htmlunit/releases)
- [Commits](https://github.com/HtmlUnit/htmlunit/compare/4.3.0...4.4.0)

---
updated-dependencies:
- dependency-name: org.htmlunit:htmlunit
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-01 08:17:37 +03:00
dependabot[bot] 186b28f262 build(deps-dev): bump de.flapdoodle.embed:de.flapdoodle.embed.mongo (#3021)
Bumps [de.flapdoodle.embed:de.flapdoodle.embed.mongo](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo) from 4.16.0 to 4.16.1.
- [Commits](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/compare/de.flapdoodle.embed.mongo-4.16.0...de.flapdoodle.embed.mongo-4.16.1)

---
updated-dependencies:
- dependency-name: de.flapdoodle.embed:de.flapdoodle.embed.mongo
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-23 08:36:48 +03:00
Ilkka Seppälä 836542e5d6 deps: Use the latest h2 version in serialized lob (#3018) 2024-07-20 18:51:31 +03:00
dependabot[bot] 6ab6c3c3df build(deps-dev): bump org.assertj:assertj-core from 3.26.0 to 3.26.3 (#3011)
Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.26.0 to 3.26.3.
- [Release notes](https://github.com/assertj/assertj/releases)
- [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.26.0...assertj-build-3.26.3)

---
updated-dependencies:
- dependency-name: org.assertj:assertj-core
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-20 14:09:08 +03:00
dependabot[bot] 61e767dbe5 build(deps): bump org.apache.maven.plugins:maven-surefire-plugin (#3013)
Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.3.0 to 3.3.1.
- [Release notes](https://github.com/apache/maven-surefire/releases)
- [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.3.0...surefire-3.3.1)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-surefire-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-20 14:08:41 +03:00
dependabot[bot] 572011665a build(deps-dev): bump de.flapdoodle.embed:de.flapdoodle.embed.mongo (#3012)
Bumps [de.flapdoodle.embed:de.flapdoodle.embed.mongo](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo) from 4.15.0 to 4.16.0.
- [Commits](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/compare/de.flapdoodle.embed.mongo-4.15.0...de.flapdoodle.embed.mongo-4.16.0)

---
updated-dependencies:
- dependency-name: de.flapdoodle.embed:de.flapdoodle.embed.mongo
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-20 14:02:52 +03:00
allcontributors[bot] 7812bf62bb docs: add 244Walyson as a contributor for code (#3017)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-07-20 13:42:34 +03:00
Walyson Moises 9c43d85f36 feat: Distributed tracing (#3006)
* added microservices distributed tracing pattern

* feat: Implement Microservice pattern: Distributed tracing #2693
2024-07-20 13:42:12 +03:00
dependabot[bot] 1d454f7721 build(deps): bump com.fasterxml.jackson.core:jackson-core (#3008)
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.17.1 to 2.17.2.
- [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.17.1...jackson-core-2.17.2)

---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-11 08:51:14 +03:00
dependabot[bot] f22eda8d44 build(deps): bump com.fasterxml.jackson.core:jackson-databind (#3010)
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.17.1 to 2.17.2.
- [Commits](https://github.com/FasterXML/jackson/commits)

---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-11 08:50:51 +03:00
dependabot[bot] 8e51bd49f5 build(deps-dev): bump de.flapdoodle.embed:de.flapdoodle.embed.mongo (#3007)
Bumps [de.flapdoodle.embed:de.flapdoodle.embed.mongo](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo) from 4.14.0 to 4.15.0.
- [Commits](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/compare/de.flapdoodle.embed.mongo-4.14.0...de.flapdoodle.embed.mongo-4.15.0)

---
updated-dependencies:
- dependency-name: de.flapdoodle.embed:de.flapdoodle.embed.mongo
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-11 08:50:33 +03:00
dependabot[bot] 990cfbf812 build(deps): bump org.eclipse.jetty:jetty-maven-plugin (#3009)
Bumps org.eclipse.jetty:jetty-maven-plugin from 11.0.21 to 11.0.22.

---
updated-dependencies:
- dependency-name: org.eclipse.jetty:jetty-maven-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-11 08:50:13 +03:00
dependabot[bot] d1c58cd86e build(deps-dev): bump org.htmlunit:htmlunit from 4.2.0 to 4.3.0 (#3004)
Bumps [org.htmlunit:htmlunit](https://github.com/HtmlUnit/htmlunit) from 4.2.0 to 4.3.0.
- [Release notes](https://github.com/HtmlUnit/htmlunit/releases)
- [Commits](https://github.com/HtmlUnit/htmlunit/compare/4.2.0...4.3.0)

---
updated-dependencies:
- dependency-name: org.htmlunit:htmlunit
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-07 08:27:25 +03:00
allcontributors[bot] d6f2cf2973 docs: add Joel-Dandin as a contributor for code (#3003)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-06-30 06:48:21 +03:00
Joel 823d0572dc fix: Issue 2975 Refactored Visitor (#3001) 2024-06-30 06:47:40 +03:00
dependabot[bot] fab64a2622 build(deps): bump org.apache.maven.plugins:maven-surefire-plugin (#2998)
Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.2.5 to 3.3.0.
- [Release notes](https://github.com/apache/maven-surefire/releases)
- [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.2.5...surefire-3.3.0)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-surefire-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-19 20:47:20 +03:00
dependabot[bot] e65f4d6038 build(deps): bump jakarta.servlet:jakarta.servlet-api (#2997)
Bumps [jakarta.servlet:jakarta.servlet-api](https://github.com/eclipse-ee4j/servlet-api) from 6.0.0 to 6.1.0.
- [Commits](https://github.com/eclipse-ee4j/servlet-api/commits)

---
updated-dependencies:
- dependency-name: jakarta.servlet:jakarta.servlet-api
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-19 20:46:57 +03:00
dependabot[bot] 5dce3d8231 build(deps): bump org.apache.maven.plugins:maven-compiler-plugin (#2992)
Bumps [org.apache.maven.plugins:maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 3.8.1 to 3.13.0.
- [Release notes](https://github.com/apache/maven-compiler-plugin/releases)
- [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.8.1...maven-compiler-plugin-3.13.0)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-compiler-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-15 07:53:15 +03:00
dependabot[bot] c9e29aceec build(deps): bump org.apache.maven.plugins:maven-checkstyle-plugin (#2994)
Bumps [org.apache.maven.plugins:maven-checkstyle-plugin](https://github.com/apache/maven-checkstyle-plugin) from 3.3.0 to 3.4.0.
- [Commits](https://github.com/apache/maven-checkstyle-plugin/compare/maven-checkstyle-plugin-3.3.0...maven-checkstyle-plugin-3.4.0)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-checkstyle-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-15 07:52:35 +03:00
dependabot[bot] 1990dbec05 build(deps-dev): bump de.flapdoodle.embed:de.flapdoodle.embed.mongo (#2991)
Bumps [de.flapdoodle.embed:de.flapdoodle.embed.mongo](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo) from 4.13.1 to 4.14.0.
- [Commits](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/compare/de.flapdoodle.embed.mongo-4.13.1...de.flapdoodle.embed.mongo-4.14.0)

---
updated-dependencies:
- dependency-name: de.flapdoodle.embed:de.flapdoodle.embed.mongo
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-15 07:51:16 +03:00
dependabot[bot] 589c6d7688 build(deps-dev): bump org.htmlunit:htmlunit from 4.1.0 to 4.2.0 (#2993)
Bumps [org.htmlunit:htmlunit](https://github.com/HtmlUnit/htmlunit) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/HtmlUnit/htmlunit/releases)
- [Commits](https://github.com/HtmlUnit/htmlunit/compare/4.1.0...4.2.0)

---
updated-dependencies:
- dependency-name: org.htmlunit:htmlunit
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-15 07:50:47 +03:00
Ilkka Seppälä 3ce7c33df6 docs: update layered architecture 2024-06-15 07:47:46 +03:00
allcontributors[bot] 87348908e3 docs: add romannimets as a contributor for code (#2996)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-06-15 07:44:14 +03:00
romannimets a27e0923b0 refactor: Refactor Layered Architecture pattern #2936 (#2938) 2024-06-15 07:43:36 +03:00
Ilkka Seppälä aa2b190a8c docs: fix poison pill yaml 2024-06-08 20:34:07 +03:00
Ilkka Seppälä f9946debca docs: fix yaml 2024-06-08 20:27:59 +03:00
Ilkka Seppälä 6cd2d0353a docs: Content SEO updates (#2990)
* update yaml frontmatter format

* update abstract document

* update abstract factory

* use the new pattern template

* acyclic visitor seo

* adapter seo

* ambassador seo

* acl seo

* aaa seo

* async method invocation seo

* balking seo

* bridge seo

* builder seo

* business delegate and bytecode seo

* caching seo

* callback seo

* chain seo

* update headings

* circuit breaker seo

* client session + collecting parameter seo

* collection pipeline seo

* combinator SEO

* command seo

* cqrs seo

* commander seo

* component seo

* composite seo

* composite entity seo

* composite view seo

* context object seo

* converter seo

* crtp seo

* currying seo

* dao seo

* data bus seo

* data locality seo

* data mapper seo

* dto seo

* decorator seo

* delegation seo

* di seo

* dirty flag seo

* domain model seo

* double buffer seo

* double checked locking seo

* double dispatch seo

* dynamic proxy seo

* event aggregator seo

* event-based asynchronous seo

* eda seo

* event queue seo

* event sourcing seo

* execute around seo

* extension objects seo

* facade seo

* factory seo

* factory kit seo

* factory method seo

* fanout/fanin seo

* feature toggle seo

* filterer seo

* fluent interface seo

* flux seo

* flyweight seo

* front controller seo

* function composition seo

* game loop seo

* gateway seo

* guarded suspension seo

* half-sync/half-async seo

* health check seo

* hexagonal seo

* identity map seo

* intercepting filter seo

* interpreter seo

* iterator seo

* layers seo

* lazy loading seo

* leader election seo

* leader/followers seo

* lockable object seo

* rename and add seo for marker interface

* master-worker seo

* mediator seo

* memento seo

* metadata mapping seo

* microservice aggregator seo

* api gw seo

* microservices log aggregration seo

* mvc seo

* mvi seo

* mvp seo

* mvvm seo

* monad seo

* monitor seo

* monostate seo

* multiton seo

* mute idiom seo

* naked objects & notification seo

* null object seo

* object mother seo

* object pool seo

* observer seo

* optimistic locking seo

* page controller seo

* page object seo

* parameter object seo

* partial response seo

* pipeline seo

* poison pill seo

* presentation model seo

* private class data seo

* producer-consumer seo

* promise seo

* property seo

* prototype seo

* proxy seo

* queue-based load leveling seo

* reactor seo

* registry seo

* repository seo

* RAII seo

* retry seo

* role object seo

* saga seo

* separated interface seo

* serialized entity seo

* serialized lob seo

* servant seo

* server session seo

* service layer seo

* service locator seo

* service to worker seo

* sharding seo

* single table inheritance seo

* singleton seo

* spatial partition seo

* special case seo

* specification seo

* state seo

* step builder seo

* strangler seo

* strategy seo

* subclass sandbox seo

* table module seo

* template method seo

* throttling seo

* tolerant reader seo

* trampoline seo

* transaction script seo

* twin seo

* type object seo

* unit of work seo

* update method seo

* value object seo

* version number seo

* virtual proxy seo

* visitor seo

* seo enhancements

* seo improvements

* SEO enhancements

* SEO improvements

* SEO additions

* SEO improvements

* more SEO improvements

* rename hexagonal + SEO improvements

* SEO improvements

* more SEO stuff

* SEO improvements

* SEO optimizations

* SEO enhancements

* enchance SEO

* improve SEO

* SEO improvements

* update headers
2024-06-08 19:54:44 +03:00
Mayank ChoudharyandMayankchoudhary294 cb946c0cdc deps: Upgraded Guice dependency to 6.0.0 (#2989)
Co-authored-by: Mayankchoudhary294 <mayankchoudhary4302@example.com>
2024-06-07 06:50:29 +03:00
dependabot[bot] f8c7c040a6 build(deps): bump com.fasterxml.jackson.core:jackson-core (#2941)
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.17.0 to 2.17.1.
- [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.17.0...jackson-core-2.17.1)

---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-06 08:28:23 +03:00
Mayank ChoudharyandMayankchoudhary294 f42e60ce47 refactor: Resolved issue #2979 Refactor Front Controller (#2986)
Co-authored-by: Mayankchoudhary294 <mayankchoudhary4302@example.com>
2024-06-06 08:02:53 +03:00
Ilkka Seppälä f0611bcb10 docs: update Commander 2024-06-04 09:22:06 +03:00
dependabot[bot] 205dc1f99f build(deps): bump org.sonarsource.scanner.maven:sonar-maven-plugin (#2984)
Bumps [org.sonarsource.scanner.maven:sonar-maven-plugin](https://github.com/SonarSource/sonar-scanner-maven) from 3.11.0.3922 to 4.0.0.4121.
- [Release notes](https://github.com/SonarSource/sonar-scanner-maven/releases)
- [Commits](https://github.com/SonarSource/sonar-scanner-maven/compare/3.11.0.3922...4.0.0.4121)

---
updated-dependencies:
- dependency-name: org.sonarsource.scanner.maven:sonar-maven-plugin
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-04 06:47:53 +03:00
allcontributors[bot] f25bd1137a docs: add Mayankchoudhary294 as a contributor for code (#2985)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-06-04 06:43:18 +03:00
Mayank ChoudharyandMayankchoudhary294 ed90c41083 refactor: Refactor commander (#2983)
* Resolved issue #2978 Refactor Commander

* Fixed checkstyle issues

---------

Co-authored-by: Mayankchoudhary294 <mayankchoudhary4302@example.com>
2024-06-04 06:42:26 +03:00
Ilkka Seppälä d872bf97c9 docs: update function composition 2024-06-03 16:11:33 +03:00
Ilkka Seppälä c5de9f637e docs: update delegation 2024-06-02 22:22:44 +03:00
allcontributors[bot] 1c478a52a9 docs: add Avinash2110 as a contributor for code (#2981)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-06-02 16:54:03 +03:00
Avinash Shukla dd38bd3ffb fix: Version number pattern update overwritten #2968 (#2980)
* Fix bug #2968

* Fix bug #2968
2024-06-02 16:53:15 +03:00
Ilkka Seppälä d4b0f3db8d refactor: update microservice pattern names & fix links 2024-06-02 08:46:04 +03:00
Ilkka Seppälä acb2eae078 docs: update function composition 2024-06-02 07:38:10 +03:00
Ilkka Seppälä ec5d08e982 refactor: rename microservices patterns 2024-06-01 06:17:32 +03:00
Ilkka Seppälä bf8388837a docs: update aggregator microservices 2024-06-01 06:03:33 +03:00
Adelya 684b2e219e feat: Function composition (#2954)
* feature: Implement Virtual Proxy pattern #2940

* feature: Implement Virtual Proxy pattern #2940

* feature: Implement Virtual Proxy pattern #2940

* feature: Implement Virtual Proxy pattern #2940

* feature: Implement Virtual Proxy pattern #2940

* feature: Implement Virtual Proxy pattern, tests added

* feature: Implement Virtual Proxy pattern, tests added

* feature: Implement Virtual Proxy pattern, tests added

* feature: Implement Virtual Proxy pattern, tests added

* feature: Implement Virtual Proxy pattern, tests added

* feature: Implement function composition pattern #2897

* task: isolate virtual proxy pattern

* task: isolate virtual proxy pattern

* refactoring: readme.md
2024-06-01 05:26:46 +03:00
Ilkka Seppälä 68ef414e19 docs: update README.md 2024-05-29 11:04:16 +03:00
Ilkka Seppälä 584e949714 docs: updates to several patterns 2024-05-28 19:46:39 +03:00
dependabot[bot] 4652842c94 build(deps-dev): bump org.assertj:assertj-core from 3.25.3 to 3.26.0 (#2971)
Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.0.
- [Release notes](https://github.com/assertj/assertj/releases)
- [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.0)

---
updated-dependencies:
- dependency-name: org.assertj:assertj-core
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-28 07:49:25 +03:00
Ilkka Seppälä 26579fea49 docs: update active object 2024-05-27 19:09:12 +03:00
Ilkka Seppälä 2bbf893133 docs: update visitor 2024-05-27 14:59:50 +03:00
Ilkka Seppälä cca57bfa5e docs: update virtual proxy 2024-05-27 14:55:38 +03:00
Ilkka Seppälä 3eb5813133 docs: update version number 2024-05-27 14:53:20 +03:00
Ilkka Seppälä 5d44152bbc docs: update value object 2024-05-27 14:49:28 +03:00
Ilkka Seppälä 723b1bf311 docs: update method 2024-05-27 14:47:54 +03:00
Ilkka Seppälä 790d2d6916 docs: update unit of work 2024-05-27 14:44:11 +03:00
Ilkka Seppälä 0abb75a20d docs: update type object 2024-05-27 14:40:32 +03:00
Ilkka Seppälä d26454af88 docs: update twin 2024-05-27 14:31:29 +03:00
Ilkka Seppälä 4b5f34ebea docs: update transaction script 2024-05-27 14:24:29 +03:00
Ilkka Seppälä 2d1b75644f docs: update trampoline 2024-05-27 14:17:46 +03:00
Ilkka Seppälä f4e2c7f3e2 docs: update tolerant reader 2024-05-27 14:11:36 +03:00
Ilkka Seppälä a6458c469d docs: update throttling 2024-05-27 14:09:08 +03:00
Ilkka Seppälä 8372d925f5 docs: update template method 2024-05-27 14:04:58 +03:00
Ilkka Seppälä 13d35ec474 docs: update table module 2024-05-27 14:02:13 +03:00
Ilkka Seppälä d4f80630aa docs: update subclass sandbox 2024-05-27 13:11:37 +03:00
Ilkka Seppälä 201675d7fc docs: update strategy 2024-05-27 13:08:56 +03:00
Ilkka Seppälä aed840d72c docs: update strangler 2024-05-27 13:04:33 +03:00
Ilkka Seppälä 10f37987d2 docs: update step builder 2024-05-27 13:00:41 +03:00
Ilkka Seppälä f7f318ad37 docs: update state 2024-05-27 12:54:23 +03:00
Ilkka Seppälä 07d56c77cf docs: update specification 2024-05-27 12:51:54 +03:00
Ilkka Seppälä 42ea1462b7 docs: update special case 2024-05-27 12:46:08 +03:00
Ilkka Seppälä 822bcd0d16 docs: update spatial partitition 2024-05-27 12:37:09 +03:00
Ilkka Seppälä 4efd714aa5 docs: update singleton 2024-05-27 12:34:19 +03:00
Ilkka Seppälä e8f36363e9 docs: update single table inheritance 2024-05-27 12:33:07 +03:00
Ilkka Seppälä 26d7d55eb6 docs: update sharding 2024-05-27 12:27:59 +03:00
Ilkka Seppälä 1e93895ec6 docs: update service to worker 2024-05-27 12:25:06 +03:00
Ilkka Seppälä b4c3ddfec1 docs: update service locator 2024-05-27 12:22:10 +03:00
Ilkka Seppälä 0918074667 docs: update service layer 2024-05-27 12:19:29 +03:00
Ilkka Seppälä 13dcb949b7 docs: update server session 2024-05-27 12:11:49 +03:00
Ilkka Seppälä 216428eb5c docs: update servant 2024-05-27 12:08:46 +03:00
Ilkka Seppälä 6bf960a636 docs: update serialized lob 2024-05-27 12:05:37 +03:00
Ilkka Seppälä 1af54aba49 docs: update serialized entity 2024-05-27 11:57:50 +03:00
Ilkka Seppälä a4cf4cdfc6 docs: update separated interface 2024-05-27 11:42:00 +03:00
Ilkka Seppälä 37f4758033 docs: update saga 2024-05-27 11:36:31 +03:00
Ilkka Seppälä 6f52cc1d00 docs: update role object 2024-05-27 10:26:22 +03:00
Ilkka Seppälä 2411c9caac docs: update retry 2024-05-27 10:16:09 +03:00
Ilkka Seppälä 42a73e5a22 docs: update raii 2024-05-27 10:09:19 +03:00
Ilkka Seppälä 7d69275db8 docs: update repository 2024-05-27 10:04:48 +03:00
Ilkka Seppälä 90bc1cf32c docs: update registry 2024-05-27 09:57:34 +03:00
Ilkka Seppälä 3824effab2 docs: update reactor 2024-05-27 09:52:52 +03:00
Ilkka Seppälä 0d35b4a1a9 refactor: rename queue based load leveling 2024-05-27 08:50:32 +03:00
Ilkka Seppälä f71aa867ac docs: update proxy 2024-05-27 08:45:45 +03:00
Ilkka Seppälä 94b90229b4 docs: update prototype 2024-05-27 08:40:04 +03:00
Ilkka Seppälä 839beb29da docs: update property 2024-05-27 08:29:58 +03:00
Ilkka Seppälä 8e881551cf docs: update promise 2024-05-27 08:25:40 +03:00
Ilkka Seppälä 188fff282b docs: update producer-consumer 2024-05-27 08:14:10 +03:00
Ilkka Seppälä 562e4cd9ec docs: update private class data 2024-05-27 08:02:06 +03:00
Ilkka Seppälä bfff01d556 docs: update presentation-model 2024-05-27 07:54:17 +03:00
Ilkka Seppälä f8fef0288d docs: update poison pill 2024-05-27 07:44:45 +03:00
Ilkka Seppälä 78ce689a30 docs: update pipeline 2024-05-27 07:39:17 +03:00
Ilkka Seppälä 3cd86ab135 docs: update partial response 2024-05-27 07:25:46 +03:00
Ilkka Seppälä 3a569a691d docs: update parameter object 2024-05-27 07:23:04 +03:00
Ilkka Seppälä 15b916a838 docs: update page object 2024-05-26 21:42:53 +03:00
Ilkka Seppälä eb6da7397d docs: update page controller 2024-05-26 21:40:11 +03:00
Ilkka Seppälä e1e5a15720 docs: update optimistic locking 2024-05-26 21:36:44 +03:00
Ilkka Seppälä f655cee274 docs: update observer 2024-05-26 21:32:06 +03:00
Ilkka Seppälä 5e133822ad docs: update object pool 2024-05-26 21:24:51 +03:00
Ilkka Seppälä 6f46fbb208 docs: update object mother 2024-05-26 21:18:48 +03:00
Ilkka Seppälä 42db186033 docs: update null object 2024-05-26 15:38:04 +03:00
Ilkka Seppälä 1e2dbf2b9b docs: update notification 2024-05-26 15:30:54 +03:00
Ilkka Seppälä 27ef340e68 docs: update naked objects 2024-05-26 15:27:41 +03:00
Ilkka Seppälä cc232ee446 docs: update mute idiom 2024-05-26 15:23:15 +03:00
Ilkka Seppälä 533ca0df6a docs: update multiton 2024-05-26 15:17:22 +03:00
Ilkka Seppälä a0f90fa75e docs: update monitor & monostate 2024-05-26 15:13:29 +03:00
Ilkka Seppälä 6ff2009f61 docs: update monad 2024-05-26 15:08:58 +03:00
Ilkka Seppälä fe49ea8dfa docs: update mvvm 2024-05-26 15:04:22 +03:00
Ilkka Seppälä 1786a78d83 docs: update mvi 2024-05-26 14:56:47 +03:00
Ilkka Seppälä cee255e63d docs: update mvc 2024-05-26 14:52:34 +03:00
Ilkka Seppälä d03b2362db docs: update metadata mapping 2024-05-26 14:46:07 +03:00
Ilkka Seppälä 6d961b54d7 docs: update memento 2024-05-26 14:11:14 +03:00
Ilkka Seppälä 093781b312 docs: update mediator 2024-05-26 14:06:27 +03:00
Ilkka Seppälä 630b054554 docs: update master-worker 2024-05-26 14:04:01 +03:00
Ilkka Seppälä 64443afcb9 docs: update marker 2024-05-26 13:59:30 +03:00
Ilkka Seppälä a868f4d80e docs: update log aggregation 2024-05-26 13:58:05 +03:00
Ilkka Seppälä 79fc4f2c0d docs: update leader/followers and lockable object 2024-05-26 13:53:27 +03:00
Ilkka Seppälä 275dad5572 docs: update leader election 2024-05-26 13:49:57 +03:00
Ilkka Seppälä fa76981011 docs: update lazy loading 2024-05-26 13:46:45 +03:00
Ilkka Seppälä f91d35299f docs: update layers 2024-05-26 13:44:59 +03:00
Ilkka Seppälä 4d8b4c4873 docs: update iterator 2024-05-26 13:39:47 +03:00
Ilkka Seppälä b5d280e4f5 docs: update interpreter 2024-05-26 13:34:46 +03:00
Ilkka Seppälä d991970439 docs: update intercepting filter 2024-05-26 11:32:24 +03:00
Ilkka Seppälä a3080c00f9 docs: update identity map 2024-05-26 11:24:10 +03:00
Ilkka Seppälä e12085f158 refactor: rename layers 2024-05-26 11:13:13 +03:00
Ilkka Seppälä 88101fc4eb docs: update hexagonal architecture 2024-05-26 11:12:00 +03:00
Ilkka Seppälä fe9e7f9d7d docs: update health check 2024-05-26 11:04:54 +03:00
Ilkka Seppälä 5a86b75ffc docs: update half-sync/half-async 2024-05-26 10:59:40 +03:00
Ilkka Seppälä 9c796135b5 docs: update guarded suspension 2024-05-26 09:39:04 +03:00
Ilkka Seppälä fe779cc93b docs: update gateway 2024-05-26 09:29:54 +03:00
Ilkka Seppälä b5391c9b2d docs: update game loop 2024-05-26 09:16:59 +03:00
Ilkka Seppälä 9e25711bad docs: update front controller 2024-05-26 09:08:59 +03:00
Ilkka Seppälä 774d6820a2 docs: update flyweight 2024-05-26 09:04:54 +03:00
Ilkka Seppälä 248f955f16 docs: update flux 2024-05-26 09:00:07 +03:00
Ilkka Seppälä bd5ff136c2 refactor: rename fluent interface module 2024-05-26 08:55:06 +03:00
Ilkka Seppälä 506d64cf40 docs: update fluent interface 2024-05-26 08:54:11 +03:00
Ilkka Seppälä 8985c33df2 docs: update filterer 2024-05-26 08:44:17 +03:00
Ilkka Seppälä 3035f40334 docs: update feature toggle 2024-05-26 07:35:00 +03:00
Ilkka Seppälä cbf1c77008 docs: update fanout-fanin 2024-05-26 06:56:56 +03:00
Ilkka Seppälä 9857897eda docs: update factory method 2024-05-26 06:41:34 +03:00
Ilkka Seppälä a4ded4b57a docs: update factory kit 2024-05-26 06:34:46 +03:00
Ilkka Seppälä 926e0b31b0 docs: update factory 2024-05-26 06:22:36 +03:00
Ilkka Seppälä 325b580ccc docs: update facade 2024-05-26 06:14:59 +03:00
Ilkka Seppälä d6bb988e42 docs: update extension objects 2024-05-25 23:03:45 +03:00
Ilkka Seppälä b901e51c50 docs: update execute around 2024-05-25 22:52:59 +03:00
Ilkka Seppälä 74f039f1cd docs: update event sourcing 2024-05-25 22:46:05 +03:00
Ilkka Seppälä 865d98cbec docs: update event queue 2024-05-25 22:26:24 +03:00
Ilkka Seppälä 9c30eaa5ed docs: update eda 2024-05-25 22:16:54 +03:00
Ilkka Seppälä ff7594465c docs: update event-based asynchronous 2024-05-25 22:01:09 +03:00
Ilkka Seppälä 784554e302 docs: update event aggregator 2024-05-25 21:40:13 +03:00
Ilkka Seppälä 8eb00a45d1 docs: update value object 2024-05-25 16:44:52 +03:00
Ilkka Seppälä 52eb5c7d69 docs: combine embedded value to value object 2024-05-25 16:44:08 +03:00
Ilkka Seppälä e3c3b055f5 docs: update dynamic proxy 2024-05-25 16:24:36 +03:00
Ilkka Seppälä 30cb525c04 docs: update double dispatch 2024-05-25 15:51:33 +03:00
Ilkka Seppälä 4e0382ca9f docs: update double-checked locking 2024-05-25 15:36:05 +03:00
Ilkka Seppälä bf06bfc22a docs: update double buffer 2024-05-25 12:36:10 +03:00
Ilkka Seppälä 6620e15075 docs: update domain model 2024-05-25 12:23:18 +03:00
Ilkka Seppälä fbaed48f06 docs: update dirty flag 2024-05-25 12:10:09 +03:00
Ilkka Seppälä 00c303e259 docs: update dependency injection 2024-05-25 11:59:58 +03:00
Ilkka Seppälä f9cb2b6ebe docs: update delegation 2024-05-25 11:46:51 +03:00
Ilkka Seppälä 410c0c69a3 docs: update decorator 2024-05-25 11:41:51 +03:00
Ilkka Seppälä b855476315 docs: update dto 2024-05-25 11:29:35 +03:00
Ilkka Seppälä 08aafce66d docs: update data mapper 2024-05-25 11:02:41 +03:00
Ilkka Seppälä c369b35f43 docs: update data locality 2024-05-25 10:21:47 +03:00
Ilkka Seppälä 92190a740c docs: update data bus 2024-05-25 10:16:55 +03:00
Ilkka Seppälä 4f6e14767d docs: update dao 2024-05-25 10:06:04 +03:00
Ilkka Seppälä 6cbcf0fe4a docs: update currying 2024-05-25 09:10:10 +03:00
Ilkka Seppälä 0c31312510 docs: update crtp 2024-05-25 08:52:39 +03:00
Ilkka Seppälä 9890579de4 docs: update converter 2024-05-25 08:34:50 +03:00
Ilkka Seppälä a4f3f8ace9 docs: context object 2024-05-25 08:23:10 +03:00
Ilkka Seppälä f6e1518d20 docs: update composite view 2024-05-25 08:09:28 +03:00
Ilkka Seppälä 8189457187 docs: update chain 2024-05-24 21:05:40 +03:00
Ilkka Seppälä 3812d22392 docs: update business delegate 2024-05-24 21:03:49 +03:00
Ilkka Seppälä 3a38e2be6b refactor: remove tls and thread pool 2024-05-24 20:56:06 +03:00
Ilkka Seppälä 518ffa4d4d docs: update composite entity 2024-05-24 20:53:29 +03:00
Ilkka Seppälä 1029c02993 docs: update composite 2024-05-24 20:46:04 +03:00
Ilkka Seppälä 19c6548a20 docs: update component 2024-05-24 20:40:34 +03:00
Ilkka Seppälä a0d4729a85 docs: update commander 2024-05-24 20:30:33 +03:00
Ilkka Seppälä d58eeab8cb docs: update cqrs 2024-05-24 20:26:32 +03:00
Ilkka Seppälä 47ee0b3a70 docs: update command 2024-05-24 20:19:39 +03:00
Ilkka Seppälä 98268a11d0 docs: update combinator 2024-05-24 20:09:39 +03:00
Ilkka Seppälä b483bd8e63 docs: collection pipeline 2024-05-24 19:55:57 +03:00
Ilkka Seppälä 80ae1a9bca docs: update collecting parameter 2024-05-24 19:45:54 +03:00
Ilkka Seppälä a33b324f18 docs: update client session 2024-05-24 19:31:12 +03:00
Ilkka Seppälä f2753b9460 docs: update circuit breaker 2024-05-24 19:20:14 +03:00
Ilkka Seppälä ccad122750 docs: update chain 2024-05-24 18:57:17 +03:00
Ilkka Seppälä 8162dc19fb docs: update callback 2024-05-24 17:15:38 +03:00
Ilkka Seppälä c506d5d8c3 docs: update caching 2024-05-24 17:09:04 +03:00
Ilkka Seppälä 4082742ae2 docs: update bytecode 2024-05-24 16:52:35 +03:00
Ilkka Seppälä d224b8dfa0 docs: update business delegate 2024-05-24 16:43:20 +03:00
Ilkka Seppälä c20ee75910 docs: update builder 2024-05-24 16:36:03 +03:00
Ilkka Seppälä 4839e09034 docs: update bridge 2024-05-24 14:20:18 +03:00
Ilkka Seppälä 29ab8eb4d7 docs: update balking 2024-05-24 14:10:31 +03:00
Ilkka Seppälä 8ed3cc99f7 docs: update async method invocation 2024-05-24 13:27:57 +03:00
Ilkka Seppälä cad9374077 docs: update aaa 2024-05-24 13:20:50 +03:00
Ilkka Seppälä 8f79088989 docs: update api gateway 2024-05-24 12:34:09 +03:00
Ilkka Seppälä 374cb4c0df docs: update acl 2024-05-24 12:20:18 +03:00
Ilkka Seppälä 386c67941d docs: update acl 2024-05-24 12:17:32 +03:00
Ilkka Seppälä 04a572f7c1 docs: update ambassador 2024-05-24 12:04:04 +03:00
Ilkka Seppälä f0ae9f545a docs: update aggregator microservices 2024-05-24 11:49:39 +03:00
Ilkka Seppälä 296a0cd7e9 docs: update adapter 2024-05-24 10:43:34 +03:00
Ilkka Seppälä 1baf6dd722 docs: update acyclic visitor 2024-05-24 09:33:02 +03:00
Ilkka Seppälä 6ccf6104ac docs: update abstract document 2024-05-24 09:32:51 +03:00
Ilkka Seppälä 31f0f5a904 docs: update active object 2024-05-24 09:06:42 +03:00
Ilkka Seppälä 3b90a051e6 docs: update abstract factory 2024-05-24 07:49:35 +03:00
Ilkka Seppälä 6e123be3bd docs: update abstract document 2024-05-24 07:26:08 +03:00
Ilkka Seppälä 8389456532 refactor: sanitize javadoc 2024-05-23 18:40:52 +03:00
Ilkka Seppälä 7273c242b6 refactor: active object comments 2024-05-23 18:03:48 +03:00
Ilkka Seppälä 962e8898e0 refactor: rename and delete some patterns (#2970) 2024-05-23 17:57:46 +03:00
Ilkka Seppälä 399970f8d1 docs: update visitor 2024-05-23 13:36:59 +03:00
Ilkka Seppälä 33df05a516 docs: update virtual proxy 2024-05-23 13:13:52 +03:00
Ilkka Seppälä c9c73490c8 docs: update version number 2024-05-23 12:44:12 +03:00
Ilkka Seppälä d6d2a76c1f docs: update value object 2024-05-23 12:21:54 +03:00
Ilkka Seppälä 8dd3e3ed89 docs: update method docs 2024-05-23 10:05:40 +03:00
Ilkka Seppälä e5e406a71f docs: update unit of work 2024-05-23 09:27:34 +03:00
Ilkka Seppälä 84df9ad48a docs: update type object 2024-05-22 19:17:57 +03:00
Ilkka Seppälä e87b18edf3 docs: update twin 2024-05-22 18:49:36 +03:00
Ilkka Seppälä 8ed580018c docs: update transaction script 2024-05-22 18:24:00 +03:00
Ilkka Seppälä b3abdb3341 docs: update trampoline 2024-05-22 16:01:38 +03:00
Ilkka Seppälä 6ed6b1c0f0 docs: update tolerant reader 2024-05-22 15:40:55 +03:00
Ilkka Seppälä 628ec1548c docs: update throttling 2024-05-22 15:17:05 +03:00
Ilkka Seppälä 16fbd26a42 docs: update thread pool 2024-05-22 13:48:48 +03:00
Ilkka Seppälä 49dab27c85 docs: update thread local storage 2024-05-22 13:22:01 +03:00
Ilkka Seppälä 45052c65f5 docs: update template method 2024-05-22 11:20:04 +03:00
Ilkka Seppälä 3b70f7168c docs: fix table module links 2024-05-22 11:19:49 +03:00
Ilkka Seppälä 16d8395c81 docs: update table module 2024-05-22 10:02:16 +03:00
Ilkka Seppälä 7ca0445110 docs: update subclass sandbox 2024-05-21 19:23:05 +03:00
Ilkka Seppälä f3bde28d01 docs: update strategy 2024-05-21 17:38:03 +03:00
Ilkka Seppälä 7bf1e36e5d docs: Strangler explanation (#2969)
* fix step builder docs

* add strangler docs
2024-05-21 16:40:28 +03:00
Ilkka Seppälä 0b79e5a9b9 docs: update step builder 2024-05-21 15:55:48 +03:00
Ilkka Seppälä 9f61b7858c docs: update state 2024-05-21 15:26:34 +03:00
Ilkka Seppälä 74f53eddd4 docs: update specification 2024-05-21 12:27:59 +03:00
Ilkka Seppälä 3703aa6e64 docs: update special case 2024-05-21 11:43:30 +03:00
Ilkka Seppälä dde2a78a46 docs: update spatial partition 2024-05-21 09:29:56 +03:00
dependabot[bot] e9ce201b6f deps: bump org.eclipse.jetty:jetty-maven-plugin
updated-dependencies:
- dependency-name: org.eclipse.jetty:jetty-maven-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-21 08:56:46 +03:00
dependabot[bot] 3ee5ed8716 deps: bump com.google.code.gson:gson
updated-dependencies:
- dependency-name: com.google.code.gson:gson
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-21 08:56:01 +03:00
allcontributors[bot] 593957094f docs: add samuelpsouza as a contributor for doc (#2967)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-05-21 08:54:32 +03:00
Samuel Souza 3b2098b80d docs: #2546 Remove code repetition from flyweight README (#2926) 2024-05-21 08:53:50 +03:00
Ilkka Seppälä 547cf20140 docs: update singleton 2024-05-20 20:58:05 +03:00
Ilkka Seppälä e76bdffab4 docs: update single table inheritance 2024-05-20 20:42:17 +03:00
Ilkka Seppälä 882bcbf385 docs: update sharding (#2964) 2024-05-20 18:42:32 +03:00
Ilkka Seppälä cd6c72548c docs: update service to worker 2024-05-20 17:47:12 +03:00
Ilkka Seppälä 1c421b27ad docs: update service locator (#2963) 2024-05-20 15:42:46 +03:00
Ilkka Seppälä d656295d3c docs: update service layer 2024-05-20 13:03:23 +03:00
Ilkka Seppälä 2a789cf65a docs: update server session 2024-05-20 11:43:27 +03:00
Ilkka Seppälä 292554e76e docs: update slob 2024-05-20 10:57:38 +03:00
Ilkka Seppälä cfb09c1358 docs: update servant 2024-05-20 09:12:19 +03:00
Ilkka Seppälä 378c814bb7 docs: update .all-contributorsrc config 2024-05-19 21:02:57 +03:00
Ilkka Seppälä d798a53b03 docs: serialized entity 2024-05-19 20:50:49 +03:00
Ilkka Seppälä ddf20b8262 docs: separated interface 2024-05-19 18:46:49 +03:00
Ilkka Seppälä 25d12fdc06 docs: Saga explanation (#2962)
* docs: update cqrs pattern name

* docs: add saga docs
2024-05-19 16:04:44 +03:00
Ilkka Seppälä 3297eb42a0 docs: update role object (#2961) 2024-05-19 13:33:42 +03:00
Ilkka Seppälä f7c00f2b16 docs: update retry 2024-05-19 11:39:39 +03:00
Ilkka Seppälä a8433cc634 docs: update raii 2024-05-19 10:49:08 +03:00
Ilkka Seppälä f6d77a684e docs: update repository 2024-05-18 18:28:10 +03:00
Ilkka Seppälä e731bdb998 docs: update registry 2024-05-18 16:49:36 +03:00
Ilkka Seppälä cfbb5af821 docs: update reader-writer lock 2024-05-18 15:52:37 +03:00
Ilkka Seppälä a766f188a8 docs: explanation for reactor (#2960) 2024-05-18 12:05:33 +03:00
Ilkka Seppälä 1da0f41381 docs: update queue-based load leveling 2024-05-18 08:54:56 +03:00
Ilkka Seppälä 551e3548d0 docs: update proxy 2024-05-18 08:28:19 +03:00
Ilkka Seppälä 57f7c392e8 docs: update prototype 2024-05-18 08:12:18 +03:00
Ilkka Seppälä a0abbf09d9 docs: update property 2024-05-17 18:52:51 +03:00
Ilkka Seppälä 6e22be370f docs: update promise 2024-05-17 17:33:56 +03:00
Ilkka Seppälä 279d227fd4 docs: update producer-consumer 2024-05-17 12:47:08 +03:00
Ilkka Seppälä ed7d912cc2 docs: update private class data 2024-05-17 11:58:53 +03:00
Ilkka Seppälä 0dd466cb38 docs: update priority queue 2024-05-17 11:41:31 +03:00
Ilkka Seppälä 9665381a85 docs: update presentation model 2024-05-16 16:00:11 +03:00
Ilkka Seppälä 5e8e566a34 docs: update poison pill 2024-05-16 14:25:37 +03:00
Ilkka Seppälä f485c3d603 docs: update pipeline 2024-05-16 12:54:39 +03:00
Ilkka Seppälä 51716824ee docs: update partial response (#2959) 2024-05-16 09:59:28 +03:00
Ilkka Seppälä 1d2b61e6ed docs: update parameter object 2024-05-15 19:10:28 +03:00
allcontributors[bot] bb8ca34115 docs: add gatlanagaprasanna as a contributor for doc (#2958)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-05-15 18:44:08 +03:00
gatlanagaprasanna ffd3440d1f docs: added_documentation_for_game_loop_implementations (#2957) 2024-05-15 18:43:01 +03:00
Ilkka Seppälä e51522ed73 docs: update page object 2024-05-15 16:30:03 +03:00
Ilkka Seppälä a878938544 docs: update page controller 2024-05-15 11:13:49 +03:00
Ilkka Seppälä 876dce43f8 docs: update optimistic offline lock 2024-05-15 10:45:49 +03:00
allcontributors[bot] 74316d302c docs: add Adelechka as a contributor for code (#2956)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-05-15 09:54:39 +03:00
Adelya abbc33295d feat: Feature/virtual proxy (#2955)
* feature: Implement Virtual Proxy pattern #2940

* feature: Implement Virtual Proxy pattern #2940

* feature: Implement Virtual Proxy pattern #2940

* feature: Implement Virtual Proxy pattern #2940

* feature: Implement Virtual Proxy pattern #2940

* feature: Implement Virtual Proxy pattern, tests added

* feature: Implement Virtual Proxy pattern, tests added

* feature: Implement Virtual Proxy pattern, tests added

* feature: Implement Virtual Proxy pattern, tests added

* feature: Implement Virtual Proxy pattern, tests added

* feature: Implement Virtual Proxy pattern iluwatar#2940

* feature: Implement Virtual Proxy pattern iluwatar#2940

* refactoring: proxy/pom.xml
2024-05-15 09:53:36 +03:00
Ilkka Seppälä 1f7aaef392 fix: fix checkstyle errors in build 2024-05-14 18:02:47 +03:00
Ilkka Seppälä 86b0520f9d docs: update observer 2024-05-14 17:57:11 +03:00
Ilkka Seppälä cf3282149b docs: update object pool 2024-05-14 17:44:17 +03:00
Ilkka Seppälä a26f4aa209 docs: update object mother 2024-05-14 11:33:00 +03:00
Ilkka Seppälä 164feff49e docs: update null object 2024-05-14 11:02:19 +03:00
dependabot[bot] 30437d324b build(deps-dev): bump de.flapdoodle.embed:de.flapdoodle.embed.mongo (#2953)
Bumps [de.flapdoodle.embed:de.flapdoodle.embed.mongo](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo) from 4.13.0 to 4.13.1.
- [Commits](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/compare/de.flapdoodle.embed.mongo-4.13.0...de.flapdoodle.embed.mongo-4.13.1)

---
updated-dependencies:
- dependency-name: de.flapdoodle.embed:de.flapdoodle.embed.mongo
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-14 09:05:00 +03:00
dependabot[bot] ecd77ac108 build(deps-dev): bump org.awaitility:awaitility from 4.2.0 to 4.2.1 (#2952)
Bumps [org.awaitility:awaitility](https://github.com/awaitility/awaitility) from 4.2.0 to 4.2.1.
- [Changelog](https://github.com/awaitility/awaitility/blob/master/changelog.txt)
- [Commits](https://github.com/awaitility/awaitility/compare/awaitility-4.2.0...awaitility-4.2.1)

---
updated-dependencies:
- dependency-name: org.awaitility:awaitility
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-14 09:04:34 +03:00
dependabot[bot] 3eef30b115 build(deps): bump com.mycila:license-maven-plugin from 4.3 to 4.5 (#2951)
Bumps [com.mycila:license-maven-plugin](https://github.com/mathieucarbou/license-maven-plugin) from 4.3 to 4.5.
- [Commits](https://github.com/mathieucarbou/license-maven-plugin/compare/license-maven-plugin-4.3...license-maven-plugin-4.5)

---
updated-dependencies:
- dependency-name: com.mycila:license-maven-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-14 09:04:07 +03:00
Ilkka Seppälä d27466a542 docs: update notification 2024-05-13 21:01:54 +03:00
Ilkka Seppälä e75fd3743e docs: update naked objects 2024-05-13 12:25:03 +03:00
Tien Nguyen Minh 6cbb8aca02 translation: VI translation of game-loop #2288 (#2949)
* [Change] my link in README

Due to the old link will expire soon

* [Localization] (Add) vi translation of game-loop
2024-05-13 11:13:51 +03:00
Tien Nguyen Minh a1c4447615 translation: (Add) Vietnamese translation of Builder pattern #2288 (#2948)
* [Localization] (Add) Vietnamese translation of Builder pattern

* [Contributors] (Change) my link

Change my link in contributors list because it will expire soon
2024-05-12 18:34:53 +03:00
Ilkka Seppälä fd7677931c fix: syntax error website build 2024-05-10 06:18:43 +03:00
Ilkka Seppälä 10cb8c0c09 docs: update mute idiom 2024-05-09 14:03:39 +03:00
Ilkka Seppälä 6cc4525bc1 docs: update multiton 2024-05-09 13:42:25 +03:00
Ilkka Seppälä de1dd7f82a docs: update monostate 2024-05-09 13:27:17 +03:00
Ilkka Seppälä 36a9eea769 docs: update monitor 2024-05-09 12:34:07 +03:00
Ilkka Seppälä bf6456ba69 docs: update monad 2024-05-09 11:33:40 +03:00
Ilkka Seppälä 0810b5531c docs: update module 2024-05-09 11:04:01 +03:00
Ilkka Seppälä b6a1f18acf docs: update model-view-viewmodel 2024-05-08 14:12:27 +03:00
Ilkka Seppälä 2ad022053d docs: update model-view-presenter 2024-05-08 13:46:53 +03:00
Ilkka Seppälä 66c01d3431 docs: update model-view-intent 2024-05-08 13:18:26 +03:00
Ilkka Seppälä ff8ad83ef6 docs: update mvc 2024-05-08 10:45:06 +03:00
Ilkka Seppälä 2faa45aa80 docs: update metadata mapping 2024-05-08 10:26:37 +03:00
Ilkka Seppälä 1b04adadb8 docs: update memento 2024-05-07 16:23:10 +03:00
Ilkka Seppälä df578ce58d docs: update mediator 2024-05-07 16:10:56 +03:00
Ilkka Seppälä 9dbffa269a docs: update master-worker 2024-05-07 15:54:49 +03:00
Ilkka Seppälä a3b582f993 docs: add marker explanation (#2945) 2024-05-07 14:23:06 +03:00
Ilkka Seppälä 3c7b3d99cc docs: update log aggregation 2024-05-07 13:49:52 +03:00
dependabot[bot] fa557ae52e build(deps-dev): bump de.flapdoodle.embed:de.flapdoodle.embed.mongo (#2943)
Bumps [de.flapdoodle.embed:de.flapdoodle.embed.mongo](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo) from 4.12.6 to 4.13.0.
- [Commits](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/compare/de.flapdoodle.embed.mongo-4.12.6...de.flapdoodle.embed.mongo-4.13.0)

---
updated-dependencies:
- dependency-name: de.flapdoodle.embed:de.flapdoodle.embed.mongo
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-07 12:26:42 +03:00
dependabot[bot] 24d5961a20 build(deps): bump org.jacoco:jacoco-maven-plugin from 0.8.11 to 0.8.12 (#2942)
Bumps [org.jacoco:jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.11 to 0.8.12.
- [Release notes](https://github.com/jacoco/jacoco/releases)
- [Commits](https://github.com/jacoco/jacoco/compare/v0.8.11...v0.8.12)

---
updated-dependencies:
- dependency-name: org.jacoco:jacoco-maven-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-07 12:26:16 +03:00
dependabot[bot] 176a8db87f build(deps): bump com.fasterxml.jackson.core:jackson-databind (#2944)
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.17.0 to 2.17.1.
- [Commits](https://github.com/FasterXML/jackson/commits)

---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-07 12:25:02 +03:00
Ilkka Seppälä 92ae818fe2 docs: improve lockable object 2024-05-06 19:36:56 +03:00
Ilkka Seppälä 30cb9af12b docs: improve leader/followers 2024-05-06 18:55:50 +03:00
Ilkka Seppälä c93f894814 docs: improve leader election 2024-05-06 13:25:09 +03:00
Ilkka Seppälä cb1872a7a4 docs: add lazy loading docs + refactor (#2939) 2024-05-06 10:16:02 +03:00
Ilkka Seppälä 7460e46f9c docs: update layers 2024-05-04 09:11:27 +03:00
k1w1dev ef42e169b9 fix: Fix sonar issues (#2925)
* Remove unused member which was also causing a false positive sonar issue.
Fixes sonar issue https://sonarcloud.io/project/issues?open=AY3gHwu5DIZTZkppqVEG&id=iluwatar_java-design-patterns

* Fixes sonar issue https://sonarcloud.io/project/issues?open=AXK0OzDA-CiGJS70dLki&id=iluwatar_java-design-patterns
related to "Refactor the code of the lambda to not have multiple invocations throwing the same checked exception."

Also, updated the code to use Instant and Duration to deal with time instead of int. Added the awaitility
library to perform assertions in test which is more reliable than using Thread.sleep directly to wait for events to happen.

* checkstyle fix

* Add sneaky throws to fix sonar lint issue. This is fine as the newFile method is not being tested but instead the new SimpleFileWriter(...) is.

* The first booking needs to happen outside the assertions. Fixed other warnings

* Use records to pass around related objects instead of using a large number of
individual params, which sonar did not like.

* Checkstyle fixes

* checkstyle fixes

* Remove complexity to keep sonar happy.

* Split into different methods to reduce complexity. Could be broken down even further but currently Sonar is happy.

* Move files to correct package

* Add valid assertions to tests

* rename constants to avoid confusion

* Sonar warning related to cognitive complexity can be suppressed as the methods are quite generic and not functional enough to be separated out.

* Use constants to keep Sonar happy

* Use correct constant naming conventions

* Use correct constant naming conventions

* Use lombok to define noargsconstructor

* Use a single method to do the logging

* Remove unused constructor and redundant method

* Use a reusable method for logging
2024-05-04 08:20:01 +03:00
Ilkka Seppälä 5e12bc588a docs: improve iterator 2024-05-01 11:17:06 +03:00
Ilkka Seppälä 58ec27de87 docs: improve interpreter 2024-05-01 11:01:49 +03:00
Ilkka Seppälä 943f3fbb26 docs: improve intercepting filter 2024-05-01 10:47:14 +03:00
Ilkka Seppälä 1430735db5 docs: update identity map 2024-05-01 10:23:49 +03:00
dependabot[bot] 167aa5afdb build(deps-dev): bump org.htmlunit:htmlunit from 3.11.0 to 4.1.0 (#2933)
Bumps [org.htmlunit:htmlunit](https://github.com/HtmlUnit/htmlunit) from 3.11.0 to 4.1.0.
- [Release notes](https://github.com/HtmlUnit/htmlunit/releases)
- [Commits](https://github.com/HtmlUnit/htmlunit/compare/3.11.0...4.1.0)

---
updated-dependencies:
- dependency-name: org.htmlunit:htmlunit
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-30 13:11:19 +03:00
dependabot[bot] 4451ffbe64 build(deps): bump logback.version from 1.5.5 to 1.5.6 (#2935)
Bumps `logback.version` from 1.5.5 to 1.5.6.

Updates `ch.qos.logback:logback-classic` from 1.5.5 to 1.5.6
- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.5...v_1.5.6)

Updates `ch.qos.logback:logback-core` from 1.5.5 to 1.5.6
- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.5...v_1.5.6)

---
updated-dependencies:
- dependency-name: ch.qos.logback:logback-classic
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: ch.qos.logback:logback-core
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-30 13:09:06 +03:00
dependabot[bot] 8d1f81b38f build(deps): bump org.zkoss.zk:zkbind from 9.0.0 to 10.0.0-jakarta (#2934)
Bumps org.zkoss.zk:zkbind from 9.0.0 to 10.0.0-jakarta.

---
updated-dependencies:
- dependency-name: org.zkoss.zk:zkbind
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-30 13:08:38 +03:00
Ilkka Seppälä 3f697fe4c7 docs: update Hexagonal docs (#2932) 2024-04-29 21:59:24 +03:00
Ilkka Seppälä a2e4307044 refactor: health check 2024-04-25 20:18:07 +03:00
Ilkka Seppälä 63a2740210 docs: improve health check 2024-04-25 20:16:37 +03:00
Ilkka Seppälä ec88a8a0ea fix: typo in half-sync/half-async tags 2024-04-24 21:46:52 +03:00
Ilkka Seppälä ad3aef7b71 docs: improve half-sync/half-async 2024-04-24 21:45:00 +03:00
Ilkka Seppälä c0e20ec570 fix: guarded suspension checkstyle 2024-04-23 20:11:10 +03:00
Ilkka Seppälä 3d48f06980 docs: improve guarded suspension 2024-04-23 19:29:51 +03:00
Ilkka Seppälä 78e57a5490 docs: update gateway 2024-04-23 18:55:49 +03:00
dependabot[bot] b00d79a79e build(deps): bump org.slf4j:slf4j-api from 2.0.12 to 2.0.13 (#2930)
Bumps org.slf4j:slf4j-api from 2.0.12 to 2.0.13.

---
updated-dependencies:
- dependency-name: org.slf4j:slf4j-api
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-23 18:34:09 +03:00
Ilkka Seppälä b55e85f8de docs: improve game loop 2024-04-22 20:42:57 +03:00
Ilkka Seppälä d6133e3bb0 docs: add explanation for front controller (#2929) 2024-04-21 18:38:49 +03:00
Ilkka Seppälä 596f429aa0 docs: improve flyweight 2024-04-21 18:23:22 +03:00
Ilkka Seppälä dabf40e1bb docs: improve docs and add explanation for flux (#2928) 2024-04-21 18:07:52 +03:00
Ilkka Seppälä ab1a30ba69 docs: improve fluent interface 2024-04-21 10:38:52 +03:00
Ilkka Seppälä 6d385349cb docs: update filterer 2024-04-20 16:05:46 +03:00
Ilkka Seppälä 6a97047aaa docs: update feature toggle 2024-04-20 15:43:09 +03:00
Ilkka Seppälä 2b58233080 docs: improve fan-out/fan-in 2024-04-20 15:21:02 +03:00
Ilkka Seppälä a251032768 docs: update factory method 2024-04-19 21:30:36 +03:00
Ilkka Seppälä 4a558bb956 docs: update factory-kit 2024-04-19 21:13:42 +03:00
Ilkka Seppälä 11289b8cfc docs: improve factory 2024-04-19 21:03:21 +03:00
Ilkka Seppälä 19f99a7a07 docs: improve facade 2024-04-19 20:49:01 +03:00
Ilkka Seppälä b35494af9a docs: extension objects 2024-04-18 21:33:18 +03:00
Ilkka Seppälä 59d3e52434 docs: improve execute around 2024-04-17 21:21:37 +03:00
allcontributors[bot] 9615fd9e72 docs: add dev-yugantar as a contributor for code (#2923)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-04-17 21:00:42 +03:00
dev-yugantarandYugantar Arya fe6841e8c6 fix: Subclass Sandbox tests fixed and re-enabled (#2860) (#2921)
Co-authored-by: Yugantar Arya <yugantararya@Yugantars-MacBook-Air.local>
2024-04-17 20:59:55 +03:00
nooynayr bcf88a61fa docs: #2257 Added Explanation to Resource Acquisition is Initialisation README.md (#2727) 2024-04-17 20:55:59 +03:00
allcontributors[bot] 2395ac2a8d docs: add k1w1dev as a contributor for code (#2922)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-04-17 20:53:07 +03:00
k1w1dev a6c2e4ad91 deps: Upgrade mongodb to latest and fix tests. (#2920) 2024-04-17 20:52:13 +03:00
dependabot[bot] 43db34a394 build(deps): bump logback.version from 1.5.3 to 1.5.5 (#2918)
Bumps `logback.version` from 1.5.3 to 1.5.5.

Updates `ch.qos.logback:logback-classic` from 1.5.3 to 1.5.5
- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.3...v_1.5.5)

Updates `ch.qos.logback:logback-core` from 1.5.3 to 1.5.5
- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.3...v_1.5.5)

---
updated-dependencies:
- dependency-name: ch.qos.logback:logback-classic
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: ch.qos.logback:logback-core
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-17 20:50:07 +03:00
Ilkka Seppälä 7cebde007b docs: add event sourcing explanation (#2919) 2024-04-16 07:57:48 +03:00
Ilkka Seppälä 1c801da4a7 docs: improve event queue docs 2024-04-15 21:55:05 +03:00
Ilkka Seppälä f52f71cba2 docs: Event-driven architecture explanation (#2917)
* update readme

* convert to record
2024-04-14 13:14:22 +03:00
Ilkka Seppälä 730907d0d3 docs: Event-Based Asynchronous explanation + refactor (#2916)
* explation + refactor

* update logging
2024-04-14 13:10:39 +03:00
Ilkka Seppälä 8a3bed0e95 docs: update event aggregator docs 2024-04-14 11:52:52 +03:00
Ilkka Seppälä 4f69dea978 fix: fix dynamic proxy front-matter 2024-04-14 11:23:51 +03:00
Ilkka Seppälä 75409a9d0d docs: embedded value + refactor 2024-04-13 16:18:43 +03:00
Ilkka Seppälä ffffab40ec docs: update dynamic proxy docs 2024-04-13 15:53:36 +03:00
Ilkka Seppälä 825d45b086 docs: double dispatch explanation + refactor (#2915) 2024-04-13 08:30:48 +03:00
Ilkka Seppälä 9240d80ef2 docs: add explanation for Double-Checked Locking (#2914) 2024-04-13 08:02:29 +03:00
Ilkka Seppälä 2807f1f976 fix: fix missing server session class diagram 2024-04-12 19:54:20 +03:00
Ilkka Seppälä 56dfd8c2d7 fix: Fix server session (#2913)
* fix server session

* fix version
2024-04-11 22:11:42 +03:00
allcontributors[bot] 44071ab497 docs: add Ehspresso as a contributor for code (#2912)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-04-11 18:56:33 +03:00
Riley 943d233120 feat: #2848 Server Session pattern (#2909)
* #2848 Moved project from private project directory to forked repo

* #2848 Requested changes implemented
2024-04-11 18:55:47 +03:00
Ilkka Seppälä 70fc5736f6 docs: update domain model 2024-04-10 21:43:23 +03:00
allcontributors[bot] 14dc7af72c docs: add Romo4ka-bot as a contributor for code (#2911)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-04-10 21:14:12 +03:00
Roman Leontevandrleontiev f945ba50c2 refactor : Update api-gateway pattern (#2910)
Co-authored-by: rleontiev <rleontiev@i-novus.ru>
2024-04-10 21:13:35 +03:00
Ilkka Seppälä 6401b0fd11 docs: fix image path 2024-04-10 21:08:04 +03:00
Ilkka Seppälä 66538ddcda docs: update Dirty Flag docs (#2908) 2024-04-09 21:02:36 +03:00
allcontributors[bot] 317f9c3920 docs: add DavidMedinaO as a contributor for review (#2907)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-04-09 20:20:20 +03:00
Luis Mateo Hincapié Martinezandluis.hincapie 1e4edc80d0 translation: Translated missing behavioral patterns category to Spanish (Task of issue #2277) (#2895)
* Translate behavioral patterns to Spanish

* Translate behavioral patterns to Spanish

* Translate behavioral patterns to Spanish

* Update bytecode.urm.png image in spanish translation

* Update translations

---------

Co-authored-by: luis.hincapie <luis.hincapie@blankfactor.com>
2024-04-09 20:19:21 +03:00
allcontributors[bot] 63dd063372 docs: add luismateoh as a contributor for review (#2906)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-04-09 20:17:31 +03:00
David Medina Orozco d45dcb1a63 translation: Translate to Spanish (#2894)
* Translate Iterator pattern to Spanish

* Translate to Spanish:
Servant pattern
Sharding pattern
Spatial-partition pattern
Special-case pattern
specification pattern
State pattern
Strategy pattern
Subclass-case pattern

* Update language to es

* Fixing Missing translation

* Translate to Spanish:
template method pattern
throttling pattern
trampoline pattern
transaction-script pattern
type object pattern
Update method pattern
visitor pattern

* Fixing Missing translation
2024-04-09 20:16:21 +03:00
dependabot[bot] 1a50353b49 build(deps): bump com.h2database:h2 from 2.2.220 to 2.2.224 (#2901)
Bumps [com.h2database:h2](https://github.com/h2database/h2database) from 2.2.220 to 2.2.224.
- [Release notes](https://github.com/h2database/h2database/releases)
- [Commits](https://github.com/h2database/h2database/compare/version-2.2.220...version-2.2.224)

---
updated-dependencies:
- dependency-name: com.h2database:h2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-09 20:03:41 +03:00
Ilkka Seppälä fc5b8c3d56 docs: update contributing.md 2024-04-08 21:27:11 +03:00
Ilkka Seppälä 0b850aa764 docs: update dependency injection 2024-04-08 21:20:50 +03:00
Ilkka Seppälä c1466eb66e dcos: update license years 2024-04-08 21:01:38 +03:00
Ilkka Seppälä e09cada960 docs: improve decorator 2024-04-07 18:59:47 +03:00
Ilkka Seppälä 99f77f8119 docs: data transfer object + refactor 2024-04-07 18:44:04 +03:00
Ilkka Seppälä b8f5d46ba7 docs: update delegation 2024-04-07 18:06:46 +03:00
Ilkka Seppälä 39acd1d0fb docs: data mapper docs (#2900) 2024-04-07 13:59:26 +03:00
Ilkka Seppälä ea55eb4e58 docs: data locality docs (#2899) 2024-04-07 12:15:09 +03:00
Ilkka Seppälä 356ba27272 docs: update data bus 2024-04-07 11:29:35 +03:00
Ilkka Seppälä b376f1de9a docs: update dao 2024-04-07 10:37:05 +03:00
Ilkka Seppälä b1f8a16b9c docs: update currying 2024-04-06 20:31:19 +03:00
Ilkka Seppälä 85823b4732 docs: improve crtp documentation 2024-04-06 19:57:54 +03:00
Ilkka Seppälä faac96b21b docs: Explanation for CQRS (#2896)
* refactor

* fix run app

* remove apptest
2024-04-06 13:35:40 +03:00
Ilkka Seppälä 8f777cdc98 refactor: converter pattern docs and refactoring 2024-04-06 10:43:40 +03:00
Ilkka Seppälä 20e804ba95 docs: improvements to the Context Object docs 2024-04-06 10:14:46 +03:00
David Medina Orozco 982526f286 translation: Translate to Spanish (#2893)
* Translate Iterator pattern to Spanish

* Translate to Spanish:
Servant pattern
Sharding pattern
Spatial-partition pattern
Special-case pattern
specification pattern
State pattern
Strategy pattern
Subclass-case pattern

* Update language to es

* Fixing Missing translation
2024-04-05 23:12:59 +03:00
allcontributors[bot] 423efcf84e docs: add DavidMedinaO as a contributor for translation (#2892)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-04-04 20:27:00 +03:00
David Medina Orozco 9f8829c8c4 translation: Translate Iterator pattern to Spanish (#2891) 2024-04-04 20:26:16 +03:00
ead6373765 translation: Translated all structural patterns category to Spanish (Task of issue #2277) (#2890)
* Typo corrections

* bridge pattern translated to spanish

* builder pattern translated to spanish

* context-object pattern translated to spanish

* converter pattern translated to spanish

* dependency injection pattern translated to spanish

* factory pattern translated to spanish

* factory-kit pattern translated to spanish

* factory-method pattern translated to spanish

* monostate pattern translated to spanish

* multiton pattern translated to spanish

* object mother pattern translated to spanish

* object pool pattern translated to spanish

* property pattern translated to spanish

* prototype pattern translated to spanish

* registry pattern translated to spanish

* step builder pattern translated to spanish

* value object pattern translated to spanish

* typo corrections and resources urls refactor

* grammar corrections

* Add image to each pattern

* translate all structural patterns to Spanish

---------

Co-authored-by: luismateoh <luismateohm@gmail.com>
Co-authored-by: luis.hincapie <luis.hincapie@blankfactor.com>
2024-04-04 19:54:16 +03:00
dependabot[bot] dd9beebd75 build(deps): bump jakarta.servlet:jakarta.servlet-api (#2888)
Bumps [jakarta.servlet:jakarta.servlet-api](https://github.com/eclipse-ee4j/servlet-api) from 5.0.0 to 6.0.0.
- [Commits](https://github.com/eclipse-ee4j/servlet-api/commits)

---
updated-dependencies:
- dependency-name: jakarta.servlet:jakarta.servlet-api
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-02 20:47:05 +03:00
dependabot[bot] 74be3a537c build(deps): bump org.joda:joda-money from 1.0.1 to 1.0.4 (#2887)
Bumps [org.joda:joda-money](https://github.com/JodaOrg/joda-money) from 1.0.1 to 1.0.4.
- [Release notes](https://github.com/JodaOrg/joda-money/releases)
- [Changelog](https://github.com/JodaOrg/joda-money/blob/main/RELEASE-NOTES.txt)
- [Commits](https://github.com/JodaOrg/joda-money/compare/v1.0.1...v1.0.4)

---
updated-dependencies:
- dependency-name: org.joda:joda-money
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-02 20:40:38 +03:00
Surjendu 3ac7cc3268 refactor: Composite View (#2886)
* chore : upgrade the jackson-databind to latest version(2.17.0)

* refactor: refactor Composite View

* refactor: remove unnecessary chnges related to this PR(#2853)

* fix: checkstyle error in AppServlet.java
2024-04-02 20:39:29 +03:00
allcontributors[bot] e0b1250019 docs: add surjendu104 as a contributor for code (#2889)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-04-02 20:37:17 +03:00
Surjendu 9f97c1505d deps : upgrade the jackson-databind to latest version(2.17.0) (#2885) 2024-04-02 20:36:39 +03:00
Jun Kang 74cce87c70 fix: Thread local storage test change (#2884)
* Updated the imports in code of the single table inheritance pattern for Spring Boot 3.x

#2825
Change javax library to jakarta

* add pom.xml

* Updated the imports in code of the healthcheck pattern for SpringBoot 3.x

Change javax library to jakarta and update maven dependency versions

* change order of imports to pass Checkstyle violations

* change import order to pass lexicographical order test

* change import order to pass CustomImportOrder warning

* Updated the maven imports of layers pattern for SpringBoot 3.2.4

* remove unused maven import

* Updated the maven imports of api-gateway pattern for SpringBoot 3.2.4

#2822

* Flaky test in Thread Local Storage #2880

* Rollback testing changes

* Flaky test in Thread Local Storage #2880

Create independent threadLocal to make values unsharable and unchangable by other thread

* rollback branch conflict
2024-04-01 17:54:49 +03:00
Jun Kang 9258cc854b deps: Updated the maven imports of api-gateway pattern for SpringBoot 3.2.4 (#2882)
* Updated the imports in code of the single table inheritance pattern for Spring Boot 3.x

#2825
Change javax library to jakarta

* add pom.xml

* Updated the imports in code of the healthcheck pattern for SpringBoot 3.x

Change javax library to jakarta and update maven dependency versions

* change order of imports to pass Checkstyle violations

* change import order to pass lexicographical order test

* change import order to pass CustomImportOrder warning

* Updated the maven imports of layers pattern for SpringBoot 3.2.4

* remove unused maven import

* Updated the maven imports of api-gateway pattern for SpringBoot 3.2.4

#2822

* Flaky test in Thread Local Storage #2880

* Rollback testing changes
2024-04-01 17:51:43 +03:00
Jun Kang a155ee2433 deps: Aggregatormicroservice patterns spring version up (#2883)
* Updated the imports in code of the single table inheritance pattern for Spring Boot 3.x

#2825
Change javax library to jakarta

* add pom.xml

* Updated the imports in code of the healthcheck pattern for SpringBoot 3.x

Change javax library to jakarta and update maven dependency versions

* change order of imports to pass Checkstyle violations

* change import order to pass lexicographical order test

* change import order to pass CustomImportOrder warning

* Updated the maven imports of layers pattern for SpringBoot 3.2.4

* remove unused maven import

* Updated the maven imports of api-gateway pattern for SpringBoot 3.2.4

#2822

* Updated the maven imports of Aggregator Microservices pattern for SpringBoot 3.2.4

#2821
2024-04-01 17:50:28 +03:00
Ilkka Seppälä de5a93c499 docs: update .editorconfig and reformat readmes 2024-03-31 18:01:06 +03:00
allcontributors[bot] dfd34d890b docs: add drishtii7 as a contributor for code (#2879)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-31 10:48:12 +03:00
drishtii7 44a9766656 refactor: Changes to make Abstract-Document and Adapter better. (#2872)
* Added new test case for error handling

* Added new test cases for error handling

* Refactored Abstract Document

* Changes updated
2024-03-31 10:47:04 +03:00
Ilkka Seppälä d3e7401f70 docs: update composite view 2024-03-30 22:06:41 +02:00
Ilkka Seppälä fd109955dc docs: composite entity 2024-03-30 21:51:17 +02:00
Ilkka Seppälä e00e67c9a6 docs: update Composite docs 2024-03-30 21:30:52 +02:00
Ilkka Seppälä 48a5edef0e docs: update Component documentation 2024-03-30 21:21:06 +02:00
Ilkka Seppälä 81ebcf0a79 docs: commander docs + refactoring (#2878) 2024-03-30 17:37:02 +02:00
Ilkka Seppälä 2228212c23 docs: explanation for combinator (#2877) 2024-03-30 14:44:43 +02:00
Ilkka Seppälä 30ac97fe59 docs: update Command documentation 2024-03-30 14:44:22 +02:00
Jun Kang 8471c93035 deps: Updated the maven imports of page-controller pattern for SpringBoot 3.2.4 (#2862)
* Updated the imports in code of the single table inheritance pattern for Spring Boot 3.x

#2825
Change javax library to jakarta

* add pom.xml

* Updated the imports in code of the healthcheck pattern for SpringBoot 3.x

Change javax library to jakarta and update maven dependency versions

* change order of imports to pass Checkstyle violations

* change import order to pass lexicographical order test

* change import order to pass CustomImportOrder warning

* Updated the maven imports of layers pattern for SpringBoot 3.2.4

* remove unused maven import

* Updated the maven imports of page-controller pattern for SpringBoot 3.2.4

- add page-controller module on parent pom.xml
- add artifact information on page-controller pom.xml
- add Springboot3, proper test dependencies on page-controller pom.xml
2024-03-30 13:58:18 +02:00
Ilkka Seppälä 9538c7820c docs: Collection pipeline explanation (#2875)
* collection pipeline docs + refactoring

* restore imperative programming code
2024-03-30 13:54:59 +02:00
Ilkka Seppälä 7c1889b8e5 refactor: update layers parent, reformat code, update license headers 2024-03-30 08:34:54 +02:00
Ilkka Seppälä 6322d538cd docs: add editorconfig + formatting 2024-03-29 14:30:50 +02:00
Ilkka Seppälä f80cc468b2 docs: collecting parameter docs + formatting 2024-03-29 14:13:26 +02:00
Ilkka Seppälä ea7bc2a4eb docs: update PR template 2024-03-29 13:31:42 +02:00
dependabot[bot] 254504e52e build(deps): bump org.eclipse.jetty:jetty-maven-plugin (#2868)
Bumps org.eclipse.jetty:jetty-maven-plugin from 9.4.28.v20200408 to 11.0.20.

---
updated-dependencies:
- dependency-name: org.eclipse.jetty:jetty-maven-plugin
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-29 13:12:37 +02:00
allcontributors[bot] 5bba35aad2 docs: add MaverickWingman as a contributor for code (#2866)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-29 11:03:31 +02:00
Aditya baa7793f3c deps: htmlunit #2852: MaverickWingman (#2864)
* #2852 Upgrade Htmlunit

* #2852 Upgrade Htmlunit

* 2852: Checkstyle Done!

* Update dependabot.yml
2024-03-29 11:03:18 +02:00
Jun Kang 910d6a7579 deps: Updated the maven imports of layers pattern for SpringBoot 3.2.4 (#2861)
* Updated the imports in code of the single table inheritance pattern for Spring Boot 3.x

#2825
Change javax library to jakarta

* add pom.xml

* Updated the imports in code of the healthcheck pattern for SpringBoot 3.x

Change javax library to jakarta and update maven dependency versions

* change order of imports to pass Checkstyle violations

* change import order to pass lexicographical order test

* change import order to pass CustomImportOrder warning

* Updated the maven imports of layers pattern for SpringBoot 3.2.4

* remove unused maven import
2024-03-28 20:42:54 +02:00
Ilkka Seppälä 2b934dfaef workaround: Skip failing tests 2024-03-27 21:17:35 +02:00
Ilkka Seppälä 6e806c238e deps: update slf4j and logback 2024-03-27 20:49:00 +02:00
Ilkka Seppälä 7d0874d88a deps: update maven 2024-03-27 20:09:01 +02:00
Ilkka Seppälä 2061fe8c59 upgrade hamcrest 2024-03-27 18:07:13 +02:00
dependabot[bot] 55f43fd514 build(deps): bump org.apache.maven.plugins:maven-war-plugin (#2856)
Bumps [org.apache.maven.plugins:maven-war-plugin](https://github.com/apache/maven-war-plugin) from 3.3.2 to 3.4.0.
- [Commits](https://github.com/apache/maven-war-plugin/compare/maven-war-plugin-3.3.2...maven-war-plugin-3.4.0)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-war-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-27 18:04:12 +02:00
dependabot[bot] 7c516064c6 build(deps-dev): bump org.assertj:assertj-core from 3.24.2 to 3.25.3 (#2855)
Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.24.2 to 3.25.3.
- [Release notes](https://github.com/assertj/assertj/releases)
- [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.24.2...assertj-build-3.25.3)

---
updated-dependencies:
- dependency-name: org.assertj:assertj-core
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-27 18:03:39 +02:00
Ilkka Seppälä 9f53811116 update dependabot conf 2024-03-27 16:55:36 +02:00
CYBERCRUX2 46fe841296 docs: Update README.md (#2652)
Added explanation, programming example.
2024-03-27 16:48:09 +02:00
Jun Kang be914e0bc3 deps: Updated the imports in code of the healthcheck pattern for SpringBoot 3.x (#2851)
* Updated the imports in code of the single table inheritance pattern for Spring Boot 3.x

#2825
Change javax library to jakarta

* add pom.xml

* Updated the imports in code of the healthcheck pattern for SpringBoot 3.x

Change javax library to jakarta and update maven dependency versions

* change order of imports to pass Checkstyle violations

* change import order to pass lexicographical order test

* change import order to pass CustomImportOrder warning
2024-03-27 15:38:32 +02:00
allcontributors[bot] a8ee68d4d8 docs: add KishalayP as a contributor for code (#2850)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-26 20:28:10 +02:00
Kishalay PandeyandSHRADDHAP18 b5ddd62145 feat: Implemenation of the Serialized Lob Pattern (#2795)
* #1596:Adding module for SLOB Pattern

* #1596:Adding Interface for Serializers

* #1596:Adding Objects

* #1596:Adding BLOB Based Serializer

* #1596:Implemented Clob Based Serializer

* #1596:Implemented Service for DB operations

* #1596:Implemented basic flow using Clob Serializer

* #1596:Added H2 DB Dependency

* #1596:Added Java Doc Stubs

* Updating Objects

* #1596:Completed Clob Serializer along with Tests

* #1596:Completed Slob Serializer along with Tests

* #1596:Completed Blob Serializer along with Tests

* #1596:Updated DatabaseService to handle Blob and Clob Data

* #1596:Added UML and updated README.md

* #1596:Updated data types for DB

* #1596:Code Style Formatting Cnames

* Adding Java Docs

* #1596:Reformatted as per Code Style

* #1596:Updating Java Doc

* #1596:Updating Main function to handle both Serializers

* #1596:Updated Java Docs

* #1596:Updated Java Docs

* #1596:Updated Java Docs and formatting

* #1596:Updated Java Docs and formatting

* #1596:Adding Java Docs

* #1596:Reformatted as per Code Style

* #1596:Updating Java Doc

* #1596:Updating Main function to handle both Serializers

* #1596:Updated Java Docs

* #1596:Updated Java Docs

* #1596:Updated Java Docs and formatting

* #1596:Updated Java Docs and formatting

* #1596:Updated Java Docs and formatting

* #1596:Updated Java Docs and formatting

* #1596:Updated README.md

* #1596:Updated Java Docs and README.md

* #1596:Updated Extension

* #1596:Updated README.md

* #1596:Updated Documentation as per review comments

* #1596:Updated Documentation as per review comments

* #1596: Updated README.md

* #1596:Updated Documentation as per review comments

* #1596: Added SLOB Module

---------

Co-authored-by: SHRADDHAP18 <87650482+SHRADDHAP18@users.noreply.github.com>
2024-03-26 20:27:17 +02:00
allcontributors[bot] be3a184445 docs: add junhkang as a contributor for code (#2849)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-26 20:23:57 +02:00
Jun Kang 6816c34218 deps: Updated the imports in code of the single table inheritance pattern for SpringBoot 3.x (#2847)
* Updated the imports in code of the single table inheritance pattern for Spring Boot 3.x

#2825
Change javax library to jakarta

* add pom.xml
2024-03-26 20:23:06 +02:00
Ilkka Seppälä ca92c79c15 docs: Improve Client-Session docs 2024-03-26 20:12:36 +02:00
Ilkka Seppälä cc1854f0a0 docs: update Anti-corruption layer docs 2024-03-24 15:10:47 +02:00
Ilkka Seppälä 965af11cb0 docs: Improve Circuit Breaker docs 2024-03-24 12:01:37 +02:00
Ilkka Seppälä 2667840060 docs: Improve Chain of Responsibility docs 2024-03-24 11:16:29 +02:00
allcontributors[bot] bffcbbf1fd docs: add leiferksn as a contributor for code (#2844)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-23 13:14:40 +02:00
leif eandleiferksn d51627d39a deps: Upgrade Repository pattern to Spring Boot 3.x #2823 - updated dependencies in pom and imports in code (#2837)
Co-authored-by: leiferksn <lefierskn@zoho.com>
2024-03-23 13:12:27 +02:00
dependabot[bot] 82c2bf25e2 build(deps): bump org.sonarsource.scanner.maven:sonar-maven-plugin (#2836)
Bumps [org.sonarsource.scanner.maven:sonar-maven-plugin](https://github.com/SonarSource/sonar-scanner-maven) from 3.10.0.2594 to 3.11.0.3922.
- [Release notes](https://github.com/SonarSource/sonar-scanner-maven/releases)
- [Commits](https://github.com/SonarSource/sonar-scanner-maven/compare/3.10.0.2594...3.11.0.3922)

---
updated-dependencies:
- dependency-name: org.sonarsource.scanner.maven:sonar-maven-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-23 12:57:10 +02:00
allcontributors[bot] b8fd6dd2a4 docs: add omahs as a contributor for doc (#2842)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-23 12:40:03 +02:00
omahs 01e3d9dc4b fix: Fix typos (#2834)
* fix typos

* fix typo

* fix typo

* fix typos

* fix typo
2024-03-23 12:39:30 +02:00
allcontributors[bot] 4d30e99e31 docs: add ylcn91 as a contributor for review (#2841)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-23 12:36:54 +02:00
allcontributors[bot] 8d2b101e03 docs: add sashirestela as a contributor for code (#2840)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-23 12:35:52 +02:00
f65bb820d8 feature: #2542 Dynamic proxy pattern (#2814)
* #2542 First commit

* #2542 Fixing comments

* #2542 Refactoring code

* #2542 Update Readme

* #2542 Add mockito dependencies

* #2542 Add unit test

* #2542 Fixes for testing

* #2542 Fixing typos

* #2542 Fixing SonarLint issues

* #2542 Fixing code review

---------

Co-authored-by: Sashir Estela <sashirestela@yahoo.com>
Co-authored-by: Ilkka Seppälä <iluwatar@users.noreply.github.com>
2024-03-23 12:34:32 +02:00
Ilkka Seppälä 4b704c807f docs: update async method invocation class diagram 2024-03-23 12:05:54 +02:00
allcontributors[bot] 8223d842fa docs: add guqing as a contributor for code (#2839)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-23 12:03:56 +02:00
guqing 79dd5a7abc refactor: Eliminate Optional from fields and parameters for async method invocation (#2830) 2024-03-23 12:03:13 +02:00
allcontributors[bot] 846dea2dca docs: add luismateoh as a contributor for translation (#2838)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-23 11:54:56 +02:00
dc7495e8bd translation: Translated all creational patterns category to Spanish (Task of issue #2277) (#2813)
* Typo corrections

* bridge pattern translated to spanish

* builder pattern translated to spanish

* context-object pattern translated to spanish

* converter pattern translated to spanish

* dependency injection pattern translated to spanish

* factory pattern translated to spanish

* factory-kit pattern translated to spanish

* factory-method pattern translated to spanish

* monostate pattern translated to spanish

* multiton pattern translated to spanish

* object mother pattern translated to spanish

* object pool pattern translated to spanish

* property pattern translated to spanish

* prototype pattern translated to spanish

* registry pattern translated to spanish

* step builder pattern translated to spanish

* value object pattern translated to spanish

* typo corrections and resources urls refactor

* grammar corrections

* Add image to each pattern

---------

Co-authored-by: luismateoh <luismateohm@gmail.com>
Co-authored-by: luis.hincapie <luis.hincapie@blankfactor.com>
2024-03-23 11:53:54 +02:00
jnniu-n 5c1ad5c006 docs: Update monostate README.md (#2731)
Add more explanation for monostate design pattern
2024-03-17 09:47:02 +02:00
JackH408 c7c0828a07 docs: Finished Explanation for Leader/Followers #2239 (#2733)
* Added documentation for Feature Toggle design pattern

* Explanation for Feature Toggle Issue #2230 finished, added intent, explanation, programmatic example, applicability and consequences

* Finished Explanation for Leader/Followers #2239
2024-03-17 09:45:13 +02:00
allcontributors[bot] dc9ee19445 docs: add pushpander1010 as a contributor for doc (#2833)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-17 09:40:24 +02:00
allcontributors[bot] 35d817e05e docs: add nooynayr as a contributor for doc (#2832)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-17 09:38:39 +02:00
Boris ZhguchevandBoris Zhguchev 5c47447d9b feat: anti corruption layer - Issue 1325. (#2777)
* add init impl

* add docs

* add test

* correct tests and specs

* add check style corrections

* add init impl

* add docs

* add test

* correct tests and specs

* add check style corrections

* issue_1325: revert accidental damage to the other repos

* issue_1325: sort the comments

---------

Co-authored-by: Boris Zhguchev <boris.zhguchev@gropyus.com>
2024-03-17 09:32:24 +02:00
allcontributors[bot] 7034ca5e95 docs: add MaverickWingman as a contributor for doc (#2831)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-17 08:32:29 +02:00
Aditya e30e359c95 docs: issue#2507 Removed 'Apple UIKit's' as it is not mentioned to do. (#2812) 2024-03-17 08:31:48 +02:00
Ilkka Seppälä 59cd01897a docs: update Callback documentation 2024-03-16 21:40:46 +02:00
Ilkka Seppälä dcdb0aff3e docs: improve Caching docs 2024-03-16 21:14:52 +02:00
Ilkka Seppälä db6ad08daa docs: improve Bytecode pattern documentation 2024-03-16 18:01:02 +02:00
Ilkka Seppälä 0e13ebec98 docs: Improve Builder documentation 2024-03-16 17:44:24 +02:00
Ilkka Seppälä 3c4cbd564b docs: Improve Bridge documentation 2024-03-16 17:24:27 +02:00
Ilkka Seppälä 2aadb3d60f docs: improve Business Delegate documentation 2024-03-16 10:01:23 +02:00
Ilkka Seppälä 8a91cbba89 docs: improve Balking pattern docs 2024-03-13 20:21:03 +02:00
Ilkka Seppälä a4a4edf990 docs: Update Async Method Invocation documentation 2024-03-12 21:59:17 +02:00
Ilkka Seppälä 02f1fdc261 docs: Improve Arrange/Act/Assert documentation 2024-03-11 20:28:22 +02:00
Ilkka Seppälä e56a8e15b0 docs: Update API Gateway description 2024-03-10 21:36:10 +02:00
Ilkka Seppälä d33f839c0f docs: Improve Ambassador pattern description 2024-03-10 16:54:40 +02:00
Ilkka Seppälä cc9a6c05ef docs: update Aggregator Microservices docs 2024-03-10 13:57:16 +02:00
cboy eacfb13ebf feat: Using @Serial (#2806) 2024-03-10 11:44:40 +02:00
allcontributors[bot] 4dd758b1be docs: add Manojkumarchow as a contributor for code (#2820)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-10 11:40:24 +02:00
Manoj Chowdary e377047a69 feat: Using text blocks instead of String literals (#2791) 2024-03-10 11:39:25 +02:00
cboy 90f5b38a45 refactor: Reactor pattern - Polish Javadoc and Using 'Map.computeIfAbsent' instead of 'if' statement (#2805)
* refactor: using computeIfAbsent instead of if check.

* docs: Polish Javadoc and comments
2024-03-10 11:35:15 +02:00
allcontributors[bot] aaa44fd606 docs: add jerryyummy as a contributor for translation (#2819)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-10 11:32:44 +02:00
jerryyummy 5a633acac7 translation: add Chinese translation for servant design pattern (#2804) 2024-03-10 11:31:54 +02:00
dependabot[bot] c702df04ae build(deps): bump org.apache.maven.plugins:maven-surefire-plugin (#2793)
Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.2.2 to 3.2.5.
- [Release notes](https://github.com/apache/maven-surefire/releases)
- [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.2.2...surefire-3.2.5)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-surefire-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-10 11:27:45 +02:00
Ilkka Seppälä 98505c61dd fix: #1297 Gateway pattern fixes (#2818)
* add to parent pom.xml

* update gateway readme
2024-03-10 11:25:37 +02:00
Hong Geon-ui 961121c9b1 translation : Translate the Decorater to Korean (#2784) 2024-03-10 11:13:42 +02:00
allcontributors[bot] e340f4f3f8 docs: add FinnS-F as a contributor for code (#2817)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-10 10:56:02 +02:00
FinnS-FandFinn 2d54709d1a feature: Add gateway pattern (#1297) (#2734)
* Implement Gateway pattern

* Fixed docstrings

* Fixed README.md

* Fixed App

* Fixed pom.xml

* Fixed pom.xml

* Fixed pom.xml

* Fixed pom.xml

* fixed checkstyle errors and directory names

* fixed pom.xml

* fixed checkstyle errors

* Bug fixed

* Bug fixed

* Bug fixed

* Bug fixed and code improvement

* Bug fixed and code improvement

* Bug fixed and update README.md

* update APP.java

* update gateway pattern

* Revert "update gateway pattern"

This reverts commit f31a00c268889b2c6b7690e07847df7247725999.

* update gateway pattern

---------

Co-authored-by: Finn <u7552286@anu.edu.au>
2024-03-10 10:55:18 +02:00
Hong Geon-ui ec80239e5e translation : Translate the Visitor to Korean (#2726) 2024-03-09 15:11:05 +02:00
allcontributors[bot] fa75ed02a8 docs: add sugan0tech as a contributor for code (#2816)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-09 14:49:25 +02:00
sugavaneshandIlkka Seppälä 249efd1e71 feat: added notification pattern (#2629)
Co-authored-by: Ilkka Seppälä <iluwatar@users.noreply.github.com>
2024-03-09 14:46:46 +02:00
allcontributors[bot] b2ca49a4e5 docs: add Nickolodeon98 as a contributor for translation (#2815)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-09 13:54:39 +02:00
Seunghwan Jeon 09b9ee2f5f translation: #2631, #2282 translate callback to Korean and place it under localization/ko/callback (#2641) 2024-03-09 13:53:08 +02:00
allcontributors[bot] 54d6280322 docs: add Kiro-Young as a contributor for translation (#2810)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-02-25 14:47:19 +02:00
资深老萌新 f42f547133 translation: Translation CRTP to zh-Chinese #2289 (#2762)
* translation: Translate CRTP to zh(Chinese)

* translation: Translate CRTP to zh(Chinese)
2024-02-25 14:46:31 +02:00
Leonardo LisantiandLeonardo Lisanti f8aeaa19bd translation: translation of iterator pattern to Italian (#2796)
Co-authored-by: Leonardo Lisanti <leonardo_lisanti@epam.com>
2024-02-25 14:43:37 +02:00
Leonardo LisantiandLeonardo Lisanti 1d40a1b114 translation: translation of observer pattern to Italian (#2767)
* translation: translation of observer pattern to Italian

* translation: translation of observer pattern to Italian - pattern name corrected

---------

Co-authored-by: Leonardo Lisanti <leonardo_lisanti@epam.com>
2024-02-25 14:40:53 +02:00
allcontributors[bot] 25a58e0c09 docs: add Holiday-C as a contributor for translation (#2809)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-02-25 14:24:25 +02:00
NewMorning b005b1a69a translation: Added Chinese Translation for Commander patterns (#2763) 2024-02-25 14:23:30 +02:00
allcontributors[bot] fb80886685 docs: add ved-asole as a contributor for code (#2808)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-02-25 14:21:14 +02:00
Ved Asole b2c7410c03 feat: #1316 Single Table Inheritance pattern implemented (#2632)
* implemented single table inheritance

* added the Java documentation for the pattern

* updated code files as per the standards

* added the puml and png diagram for the file

* added README.md

* #1316 Single Table Inheritance pattern implemented

* resolved the Checkstyle violations

* removed the tests due to build failure

* updated the code as per review

* resolved Checkstyle violations
2024-02-25 14:20:13 +02:00
Ilkka Seppälä 79d41d9336 docs: Improve Acyclic Visitor and Adapter readmes 2024-02-25 13:58:45 +02:00
Ilkka Seppälä 1ab8ca76fb docs: Add tag for Acyclic Visitor 2024-02-25 13:46:37 +02:00
Ilkka Seppälä 89d9558b00 docs: Improvements to Acyclic Visitor readme 2024-02-25 13:43:27 +02:00
Ilkka Seppälä a258bcc1eb docs: fix line endings 2024-02-12 19:28:48 +02:00
Ilkka Seppälä 4277a54835 docs: Improve active object description 2024-02-12 19:17:03 +02:00
Ilkka Seppälä a1f527eb28 docs: update abstract factory 2024-02-11 17:45:06 +02:00
Ilkka Seppälä 6f8a95debd docs: update abstract document readme 2024-02-11 17:24:23 +02:00
Ilkka Seppälä 8d74b3eb40 docs: Abstract Document readme improvements 2024-02-11 17:07:22 +02:00
Ilkka Seppälä b994d9a70d fix: Fix health-check page rendering error on the website 2024-02-11 10:32:26 +02:00
allcontributors[bot] 93112da51c docs: add egg0102030405 as a contributor for doc (#2803)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-02-10 11:00:17 +02:00
egg0102030405 4575879264 docs: Explanation for guarded suspension (#2752)
* translation for step-builder and table-module and unit-of-work and update-method and value-object to Chinese

* fix a translation error

* Add explanation for guarded suspension

* delete previous modifications
2024-02-10 10:59:37 +02:00
allcontributors[bot] f5747d85f1 docs: add egg0102030405 as a contributor for translation (#2802)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-02-10 10:58:37 +02:00
egg0102030405 8c316e75fe translation: Added Chinese Translation for several patterns (#2744)
* translation for step-builder and table-module and unit-of-work and update-method and value-object to Chinese

* fix a translation error
2024-02-10 10:57:36 +02:00
jnniu-n 803a2624f6 docs: Update property pattern README.md (#2745)
Finish Readme.md for Property
2024-02-10 10:54:02 +02:00
allcontributors[bot] c2709c445b docs: add jnniu-n as a contributor for doc (#2801)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-02-10 10:52:27 +02:00
jnniu-n 88b4cbc008 docs: Update module pattern README.md (#2753)
Update README.md for Module
2024-02-10 10:51:45 +02:00
allcontributors[bot] d4d428f98a docs: add bachbil as a contributor for translation (#2800)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-01-27 13:21:23 +02:00
believe 87a774c9d6 translation: Added french documentation for several patterns (#2617)
* translate Abstract Document documentation in french

* translate Abstract Document documentation in french for issue #2278

* french translation of abstract factory

* French translation for active-object

* translate Abstract Document documentation in french

* translate Abstract Document documentation in french for issue #2278

* french translation of abstract factory

* French translation for active-object

* tranlate to french: acyclic-visitore, adapter, aggregator-microservice, ambassador, api-gateway, arrange-act-assert, async-method-invocation, balking, bridge.
2024-01-27 13:20:32 +02:00
allcontributors[bot] 4a315e7f4b docs: add ylcn91 as a contributor for doc (#2799)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-01-27 13:16:55 +02:00
Doksanbir 45f63a70f1 docs: Update README.md for Health Check Pattern (#2783) 2024-01-27 13:16:06 +02:00
allcontributors[bot] 719c46d10d docs: add takikuba as a contributor for code (#2798)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-01-27 13:08:08 +02:00
Jakub Klimek 0f39267a19 refactor: #2366 Change h2 database usage to in mem (#2776)
* fix: Change h2 database usage to in mem (#2366)

* #2366 Add delay option
2024-01-27 13:07:10 +02:00
3261 changed files with 108013 additions and 29986 deletions

No files matched your search

+953 -6
View File
@@ -1548,7 +1548,8 @@
"avatar_url": "https://avatars.githubusercontent.com/u/17254162?v=4", "avatar_url": "https://avatars.githubusercontent.com/u/17254162?v=4",
"profile": "https://www.linkedin.com/in/souzasamuel/", "profile": "https://www.linkedin.com/in/souzasamuel/",
"contributions": [ "contributions": [
"code" "code",
"doc"
] ]
}, },
{ {
@@ -2546,7 +2547,7 @@
"login": "tiennm99", "login": "tiennm99",
"name": "Tien Nguyen Minh", "name": "Tien Nguyen Minh",
"avatar_url": "https://avatars.githubusercontent.com/u/39063457?v=4", "avatar_url": "https://avatars.githubusercontent.com/u/39063457?v=4",
"profile": "http://miti99.dev", "profile": "https://github.com/tiennm99",
"contributions": [ "contributions": [
"code", "code",
"translation" "translation"
@@ -2567,7 +2568,8 @@
"avatar_url": "https://avatars.githubusercontent.com/u/101238933?v=4", "avatar_url": "https://avatars.githubusercontent.com/u/101238933?v=4",
"profile": "https://surjendu-pal.netlify.app/", "profile": "https://surjendu-pal.netlify.app/",
"contributions": [ "contributions": [
"translation" "translation",
"code"
] ]
}, },
{ {
@@ -2759,7 +2761,8 @@
"avatar_url": "https://avatars.githubusercontent.com/u/141746282?v=4", "avatar_url": "https://avatars.githubusercontent.com/u/141746282?v=4",
"profile": "https://github.com/jnniu-n", "profile": "https://github.com/jnniu-n",
"contributions": [ "contributions": [
"translation" "translation",
"doc"
] ]
}, },
{ {
@@ -2832,7 +2835,9 @@
"avatar_url": "https://avatars.githubusercontent.com/u/7249450?v=4", "avatar_url": "https://avatars.githubusercontent.com/u/7249450?v=4",
"profile": "https://github.com/ylcn91", "profile": "https://github.com/ylcn91",
"contributions": [ "contributions": [
"code" "code",
"doc",
"review"
] ]
}, },
{ {
@@ -2853,9 +2858,951 @@
"contributions": [ "contributions": [
"code" "code"
] ]
},
{
"login": "takikuba",
"name": "Jakub Klimek",
"avatar_url": "https://avatars.githubusercontent.com/u/58841343?v=4",
"profile": "https://github.com/takikuba",
"contributions": [
"code"
]
},
{
"login": "bachbil",
"name": "believe",
"avatar_url": "https://avatars.githubusercontent.com/u/28935461?v=4",
"profile": "https://github.com/bachbil",
"contributions": [
"translation"
]
},
{
"login": "egg0102030405",
"name": "egg0102030405",
"avatar_url": "https://avatars.githubusercontent.com/u/59650695?v=4",
"profile": "https://github.com/egg0102030405",
"contributions": [
"translation",
"doc"
]
},
{
"login": "ved-asole",
"name": "Ved Asole",
"avatar_url": "https://avatars.githubusercontent.com/u/77259804?v=4",
"profile": "https://github.com/ved-asole",
"contributions": [
"code"
]
},
{
"login": "Holiday-C",
"name": "NewMorning",
"avatar_url": "https://avatars.githubusercontent.com/u/95869761?v=4",
"profile": "https://github.com/Holiday-C",
"contributions": [
"translation"
]
},
{
"login": "Kiro-Young",
"name": "资深老萌新",
"avatar_url": "https://avatars.githubusercontent.com/u/98251397?v=4",
"profile": "https://github.com/Kiro-Young",
"contributions": [
"translation"
]
},
{
"login": "Nickolodeon98",
"name": "Seunghwan Jeon",
"avatar_url": "https://avatars.githubusercontent.com/u/113348293?v=4",
"profile": "https://itistori.tistory.com/",
"contributions": [
"translation"
]
},
{
"login": "sugan0tech",
"name": "sugavanesh",
"avatar_url": "https://avatars.githubusercontent.com/u/71312159?v=4",
"profile": "https://github.com/sugan0tech",
"contributions": [
"code"
]
},
{
"login": "FinnS-F",
"name": "FinnS-F",
"avatar_url": "https://avatars.githubusercontent.com/u/126026830?v=4",
"profile": "https://github.com/FinnS-F",
"contributions": [
"code"
]
},
{
"login": "jerryyummy",
"name": "jerryyummy",
"avatar_url": "https://avatars.githubusercontent.com/u/62087610?v=4",
"profile": "https://github.com/jerryyummy",
"contributions": [
"translation"
]
},
{
"login": "Manojkumarchow",
"name": "Manoj Chowdary",
"avatar_url": "https://avatars.githubusercontent.com/u/28005510?v=4",
"profile": "https://manojkumarchow.github.io/",
"contributions": [
"code"
]
},
{
"login": "MaverickWingman",
"name": "Aditya",
"avatar_url": "https://avatars.githubusercontent.com/u/76624290?v=4",
"profile": "https://github.com/MaverickWingman",
"contributions": [
"doc",
"code"
]
},
{
"login": "nooynayr",
"name": "nooynayr",
"avatar_url": "https://avatars.githubusercontent.com/u/141696269?v=4",
"profile": "https://github.com/nooynayr",
"contributions": [
"doc"
]
},
{
"login": "pushpander1010",
"name": "CYBERCRUX2",
"avatar_url": "https://avatars.githubusercontent.com/u/41006191?v=4",
"profile": "https://github.com/pushpander1010",
"contributions": [
"doc"
]
},
{
"login": "luismateoh",
"name": "Luis Mateo Hincapié Martinez",
"avatar_url": "https://avatars.githubusercontent.com/u/44934142?v=4",
"profile": "https://github.com/luismateoh",
"contributions": [
"translation",
"review"
]
},
{
"login": "guqing",
"name": "guqing",
"avatar_url": "https://avatars.githubusercontent.com/u/38999863?v=4",
"profile": "https://guqing.io",
"contributions": [
"code"
]
},
{
"login": "sashirestela",
"name": "Sashir Estela",
"avatar_url": "https://avatars.githubusercontent.com/u/14045506?v=4",
"profile": "https://github.com/sashirestela",
"contributions": [
"code"
]
},
{
"login": "omahs",
"name": "omahs",
"avatar_url": "https://avatars.githubusercontent.com/u/73983677?v=4",
"profile": "https://github.com/omahs",
"contributions": [
"doc"
]
},
{
"login": "leiferksn",
"name": "leif e.",
"avatar_url": "https://avatars.githubusercontent.com/u/4026636?v=4",
"profile": "https://github.com/leiferksn",
"contributions": [
"code"
]
},
{
"login": "junhkang",
"name": "Jun Kang",
"avatar_url": "https://avatars.githubusercontent.com/u/20232155?v=4",
"profile": "https://junhkang.tistory.com/",
"contributions": [
"code"
]
},
{
"login": "KishalayP",
"name": "Kishalay Pandey",
"avatar_url": "https://avatars.githubusercontent.com/u/71012321?v=4",
"profile": "https://github.com/KishalayP",
"contributions": [
"code"
]
},
{
"login": "drishtii7",
"name": "drishtii7",
"avatar_url": "https://avatars.githubusercontent.com/u/82076566?v=4",
"profile": "https://github.com/drishtii7",
"contributions": [
"code"
]
},
{
"login": "DavidMedinaO",
"name": "David Medina Orozco",
"avatar_url": "https://avatars.githubusercontent.com/u/53974843?v=4",
"profile": "https://github.com/DavidMedinaO",
"contributions": [
"translation",
"review"
]
},
{
"login": "Romo4ka-bot",
"name": "Roman Leontev",
"avatar_url": "https://avatars.githubusercontent.com/u/61774094?v=4",
"profile": "https://github.com/Romo4ka-bot",
"contributions": [
"code"
]
},
{
"login": "Ehspresso",
"name": "Riley",
"avatar_url": "https://avatars.githubusercontent.com/u/144370752?v=4",
"profile": "https://github.com/Ehspresso",
"contributions": [
"code"
]
},
{
"login": "k1w1dev",
"name": "k1w1dev",
"avatar_url": "https://avatars.githubusercontent.com/u/121696782?v=4",
"profile": "https://github.com/k1w1dev",
"contributions": [
"code"
]
},
{
"login": "dev-yugantar",
"name": "dev-yugantar",
"avatar_url": "https://avatars.githubusercontent.com/u/153066190?v=4",
"profile": "https://github.com/dev-yugantar",
"contributions": [
"code"
]
},
{
"login": "Adelechka",
"name": "Adelya",
"avatar_url": "https://avatars.githubusercontent.com/u/65678470?v=4",
"profile": "https://github.com/Adelechka",
"contributions": [
"code"
]
},
{
"login": "gatlanagaprasanna",
"name": "gatlanagaprasanna",
"avatar_url": "https://avatars.githubusercontent.com/u/154739216?v=4",
"profile": "https://github.com/gatlanagaprasanna",
"contributions": [
"doc"
]
},
{
"login": "Avinash2110",
"name": "Avinash Shukla",
"avatar_url": "https://avatars.githubusercontent.com/u/37360069?v=4",
"profile": "https://github.com/Avinash2110",
"contributions": [
"code"
]
},
{
"login": "Mayankchoudhary294",
"name": "Mayank Choudhary",
"avatar_url": "https://avatars.githubusercontent.com/u/97609699?v=4",
"profile": "https://github.com/Mayankchoudhary294",
"contributions": [
"code"
]
},
{
"login": "romannimets",
"name": "romannimets",
"avatar_url": "https://avatars.githubusercontent.com/u/137268574?v=4",
"profile": "https://github.com/romannimets",
"contributions": [
"code"
]
},
{
"login": "Joel-Dandin",
"name": "Joel",
"avatar_url": "https://avatars.githubusercontent.com/u/60149879?v=4",
"profile": "https://github.com/Joel-Dandin",
"contributions": [
"code"
]
},
{
"login": "244Walyson",
"name": "Walyson Moises",
"avatar_url": "https://avatars.githubusercontent.com/u/125759796?v=4",
"profile": "https://github.com/244Walyson",
"contributions": [
"code"
]
},
{
"login": "Xcyq",
"name": "Xcyq",
"avatar_url": "https://avatars.githubusercontent.com/u/39086666?v=4",
"profile": "https://github.com/Xcyq",
"contributions": [
"code"
]
},
{
"login": "Ritabrata1080",
"name": "Ritabrata",
"avatar_url": "https://avatars.githubusercontent.com/u/60834250?v=4",
"profile": "https://github.com/Ritabrata1080",
"contributions": [
"review"
]
},
{
"login": "trivikr",
"name": "Trivikram Kamat",
"avatar_url": "https://avatars.githubusercontent.com/u/16024985?v=4",
"profile": "https://github.com/trivikr",
"contributions": [
"code"
]
},
{
"login": "vvanghelle",
"name": "Vincent Vanghelle",
"avatar_url": "https://avatars.githubusercontent.com/u/3204600?v=4",
"profile": "https://github.com/vvanghelle",
"contributions": [
"translation"
]
},
{
"login": "antoheri",
"name": "Antoine Héritier",
"avatar_url": "https://avatars.githubusercontent.com/u/79988396?v=4",
"profile": "https://github.com/antoheri",
"contributions": [
"translation"
]
},
{
"login": "fishandsheep",
"name": "QinShower",
"avatar_url": "https://avatars.githubusercontent.com/u/43347407?v=4",
"profile": "https://github.com/fishandsheep",
"contributions": [
"translation"
]
},
{
"login": "LakshyaPunyani-01",
"name": "LakshyaPunyani-01",
"avatar_url": "https://avatars.githubusercontent.com/u/103628913?v=4",
"profile": "https://github.com/LakshyaPunyani-01",
"contributions": [
"code"
]
},
{
"login": "jasonjyu",
"name": "jasonjyu",
"avatar_url": "https://avatars.githubusercontent.com/u/10333076?v=4",
"profile": "https://github.com/jasonjyu",
"contributions": [
"code"
]
},
{
"login": "jeffmorrison",
"name": "jeffmorrison",
"avatar_url": "https://avatars.githubusercontent.com/u/26047158?v=4",
"profile": "https://github.com/jeffmorrison",
"contributions": [
"code"
]
},
{
"login": "dmgodoy",
"name": "David M.",
"avatar_url": "https://avatars.githubusercontent.com/u/10840681?v=4",
"profile": "https://github.com/dmgodoy",
"contributions": [
"code"
]
},
{
"login": "apophizzz",
"name": "Patrick Kleindienst",
"avatar_url": "https://avatars.githubusercontent.com/u/12052783?v=4",
"profile": "https://github.com/apophizzz",
"contributions": [
"code"
]
},
{
"login": "proceane",
"name": "Juyeon",
"avatar_url": "https://avatars.githubusercontent.com/u/62143949?v=4",
"profile": "https://github.com/proceane",
"contributions": [
"translation"
]
},
{
"login": "mammadyahyayev",
"name": "Mammad Yahyayev",
"avatar_url": "https://avatars.githubusercontent.com/u/66476643?v=4",
"profile": "https://mammadyahya.vercel.app",
"contributions": [
"doc"
]
},
{
"login": "SalmaAzeem",
"name": "Salma",
"avatar_url": "https://avatars.githubusercontent.com/u/121863224?v=4",
"profile": "https://github.com/SalmaAzeem",
"contributions": [
"code"
]
},
{
"login": "CodeMaverick-143",
"name": "Arpit Sarang",
"avatar_url": "https://avatars.githubusercontent.com/u/182847716?v=4",
"profile": "https://codemaverick-143.github.io/My-Portfolio/",
"contributions": [
"code"
]
},
{
"login": "mayatarek",
"name": "Maya",
"avatar_url": "https://avatars.githubusercontent.com/u/111644421?v=4",
"profile": "https://github.com/mayatarek",
"contributions": [
"translation"
]
},
{
"login": "HabibaMekay",
"name": "HabibaMekay",
"avatar_url": "https://avatars.githubusercontent.com/u/133516736?v=4",
"profile": "https://github.com/HabibaMekay",
"contributions": [
"code"
]
},
{
"login": "Ahmed-Taha-981",
"name": "Ahmed-Taha-981",
"avatar_url": "https://avatars.githubusercontent.com/u/122402269?v=4",
"profile": "https://github.com/Ahmed-Taha-981",
"contributions": [
"code"
]
},
{
"login": "malak-elbanna",
"name": "Malak Elbanna",
"avatar_url": "https://avatars.githubusercontent.com/u/67643605?v=4",
"profile": "https://malakelbanna.netlify.app/",
"contributions": [
"code"
]
},
{
"login": "depthlending",
"name": "BiKangNing",
"avatar_url": "https://avatars.githubusercontent.com/u/164312726?v=4",
"profile": "https://github.com/depthlending",
"contributions": [
"doc"
]
},
{
"login": "TarunVishwakarma1",
"name": "Tarun Vishwakarma",
"avatar_url": "https://avatars.githubusercontent.com/u/138651451?v=4",
"profile": "https://github.com/TarunVishwakarma1",
"contributions": [
"code"
]
},
{
"login": "shahdhoss",
"name": "Shahd Hossam",
"avatar_url": "https://avatars.githubusercontent.com/u/132148556?v=4",
"profile": "https://github.com/shahdhoss",
"contributions": [
"code"
]
},
{
"login": "mehdirahimi",
"name": "Mehdi Rahimi",
"avatar_url": "https://avatars.githubusercontent.com/u/24210842?v=4",
"profile": "https://mehdirahimi.github.io",
"contributions": [
"code"
]
},
{
"login": "clintaire",
"name": "Clint Airé",
"avatar_url": "https://avatars.githubusercontent.com/u/111376518?v=4",
"profile": "https://github.com/clintaire",
"contributions": [
"code"
]
},
{
"login": "darkhyper24",
"name": "darkhyper24",
"avatar_url": "https://avatars.githubusercontent.com/u/132711528?v=4",
"profile": "https://github.com/darkhyper24",
"contributions": [
"code"
]
},
{
"login": "MohanedAtef238",
"name": "Mohaned Atef",
"avatar_url": "https://avatars.githubusercontent.com/u/105852138?v=4",
"profile": "https://github.com/MohanedAtef238",
"contributions": [
"code"
]
},
{
"login": "maximevtush",
"name": "Maxim Evtush",
"avatar_url": "https://avatars.githubusercontent.com/u/154841002?v=4",
"profile": "https://github.com/maximevtush",
"contributions": [
"code"
]
},
{
"login": "hvgh88",
"name": "Harshita Vidapanakal",
"avatar_url": "https://avatars.githubusercontent.com/u/65297242?v=4",
"profile": "https://github.com/hvgh88",
"contributions": [
"code"
]
},
{
"login": "smile-ab",
"name": "smile-ab",
"avatar_url": "https://avatars.githubusercontent.com/u/202159894?v=4",
"profile": "https://github.com/smile-ab",
"contributions": [
"translation",
"code"
]
},
{
"login": "Francisco-G-P",
"name": "Francisco-G-P",
"avatar_url": "https://avatars.githubusercontent.com/u/186766789?v=4",
"profile": "https://github.com/Francisco-G-P",
"contributions": [
"translation"
]
},
{
"login": "Duartegdm",
"name": "Gabriel Duarte",
"avatar_url": "https://avatars.githubusercontent.com/u/137895372?v=4",
"profile": "https://github.com/Duartegdm",
"contributions": [
"doc"
]
},
{
"login": "DenizAltunkapan",
"name": "Deniz Altunkapan",
"avatar_url": "https://avatars.githubusercontent.com/u/93663085?v=4",
"profile": "https://github.com/DenizAltunkapan",
"contributions": [
"translation"
]
},
{
"login": "johnklint81",
"name": "John Klint",
"avatar_url": "https://avatars.githubusercontent.com/u/70539458?v=4",
"profile": "https://github.com/johnklint81",
"contributions": [
"code"
]
},
{
"login": "sanurah",
"name": "Sanura Hettiarachchi",
"avatar_url": "https://avatars.githubusercontent.com/u/16178588?v=4",
"profile": "https://github.com/sanurah",
"contributions": [
"code"
]
},
{
"login": "2897robo",
"name": "Kim Gi Uk",
"avatar_url": "https://avatars.githubusercontent.com/u/31699375?v=4",
"profile": "https://github.com/2897robo",
"contributions": [
"code"
]
},
{
"login": "Suchismita-Deb",
"name": "Suchismita Deb",
"avatar_url": "https://avatars.githubusercontent.com/u/68535074?v=4",
"profile": "https://github.com/Suchismita-Deb",
"contributions": [
"code"
]
},
{
"login": "ssrijan-007-sys",
"name": "ssrijan-007-sys",
"avatar_url": "https://avatars.githubusercontent.com/u/137605821?v=4",
"profile": "https://github.com/ssrijan-007-sys",
"contributions": [
"code"
]
},
{
"login": "e5LA",
"name": "e5LA",
"avatar_url": "https://avatars.githubusercontent.com/u/208197507?v=4",
"profile": "https://github.com/e5LA",
"contributions": [
"code",
"doc"
]
},
{
"login": "maziyar-gerami",
"name": "Maziyar Gerami",
"avatar_url": "https://avatars.githubusercontent.com/u/122622721?v=4",
"profile": "http://maziyar-gerami.github.io/portfolio/",
"contributions": [
"translation"
]
},
{
"login": "yybmion",
"name": "yoobin_mion",
"avatar_url": "https://avatars.githubusercontent.com/u/113106136?v=4",
"profile": "https://github.com/yybmion",
"contributions": [
"code"
]
},
{
"login": "ronodhirSoumik",
"name": "Soumik Sarker",
"avatar_url": "https://avatars.githubusercontent.com/u/46843689?v=4",
"profile": "https://ronodhirsoumik.github.io",
"contributions": [
"doc"
]
},
{
"login": "naman-sriv",
"name": "Naman Srivastava",
"avatar_url": "https://avatars.githubusercontent.com/u/82610773?v=4",
"profile": "https://github.com/naman-sriv",
"contributions": [
"code"
]
},
{
"login": "letdtcode",
"name": "Thanh Nguyen Duc",
"avatar_url": "https://avatars.githubusercontent.com/u/92111552?v=4",
"profile": "https://github.com/letdtcode",
"contributions": [
"code"
]
},
{
"login": "skamble2",
"name": "Soham Kamble",
"avatar_url": "https://avatars.githubusercontent.com/u/121136639?v=4",
"profile": "https://github.com/skamble2",
"contributions": [
"code"
]
},
{
"login": "Olexandr88",
"name": "Olexandr88",
"avatar_url": "https://avatars.githubusercontent.com/u/93856062?v=4",
"profile": "https://github.com/Olexandr88",
"contributions": [
"doc"
]
},
{
"login": "nilsreichardt",
"name": "Nils Reichardt",
"avatar_url": "https://avatars.githubusercontent.com/u/24459435?v=4",
"profile": "https://github.com/nilsreichardt",
"contributions": [
"security"
]
},
{
"login": "north-echo",
"name": "Christopher Lusk",
"avatar_url": "https://avatars.githubusercontent.com/u/122107484?v=4",
"profile": "http://www.northecho.dev",
"contributions": [
"security"
]
},
{
"login": "dagecko",
"name": "dagecko",
"avatar_url": "https://avatars.githubusercontent.com/u/6371704?v=4",
"profile": "https://github.com/dagecko",
"contributions": [
"security"
]
},
{
"login": "jackmisbach",
"name": "jackmisbach",
"avatar_url": "https://avatars.githubusercontent.com/u/183796460?v=4",
"profile": "https://github.com/jackmisbach",
"contributions": [
"security"
]
},
{
"login": "avivdon",
"name": "avivdon",
"avatar_url": "https://avatars.githubusercontent.com/u/74790003?v=4",
"profile": "https://github.com/avivdon",
"contributions": [
"security"
]
},
{
"login": "quantdevv",
"name": "Aditya Kumawat",
"avatar_url": "https://avatars.githubusercontent.com/u/56085648?v=4",
"profile": "https://github.com/quantdevv",
"contributions": [
"code"
]
},
{
"login": "devch37",
"name": "devch37",
"avatar_url": "https://avatars.githubusercontent.com/u/72903623?v=4",
"profile": "https://github.com/devch37",
"contributions": [
"code"
]
},
{
"login": "HY-love-sleep",
"name": "HY-love-sleep",
"avatar_url": "https://avatars.githubusercontent.com/u/73268470?v=4",
"profile": "https://github.com/HY-love-sleep",
"contributions": [
"code"
]
},
{
"login": "CMD137",
"name": "CMD137",
"avatar_url": "https://avatars.githubusercontent.com/u/56242956?v=4",
"profile": "http://www.cmd137blog.top/",
"contributions": [
"code"
]
},
{
"login": "QuantumRange",
"name": "QuantumRange",
"avatar_url": "https://avatars.githubusercontent.com/u/49843948?v=4",
"profile": "https://github.com/QuantumRange",
"contributions": [
"doc"
]
},
{
"login": "Dhiraj-birajdar",
"name": "Dhiraj Birajdar",
"avatar_url": "https://avatars.githubusercontent.com/u/114354331?v=4",
"profile": "https://github.com/Dhiraj-birajdar",
"contributions": [
"doc"
]
},
{
"login": "sieberss",
"name": "Stefan Siebers",
"avatar_url": "https://avatars.githubusercontent.com/u/178474619?v=4",
"profile": "https://github.com/sieberss",
"contributions": [
"translation"
]
},
{
"login": "orbisai0security",
"name": "OrbisAI Security",
"avatar_url": "https://avatars.githubusercontent.com/u/242526317?v=4",
"profile": "https://orbisappsec.com/",
"contributions": [
"security"
]
},
{
"login": "rranjangupta",
"name": "Raju Gupta",
"avatar_url": "https://avatars.githubusercontent.com/u/64011583?v=4",
"profile": "https://www.rajugupta.com/portfolio/",
"contributions": [
"code"
]
},
{
"login": "alex052525",
"name": "김정모",
"avatar_url": "https://avatars.githubusercontent.com/u/116088682?v=4",
"profile": "https://github.com/alex052525",
"contributions": [
"code"
]
},
{
"login": "AnakinYen0329",
"name": "Anakin Yen",
"avatar_url": "https://avatars.githubusercontent.com/u/122139183?v=4",
"profile": "https://github.com/AnakinYen0329",
"contributions": [
"translation"
]
},
{
"login": "SrGiuliano77",
"name": "Giuliano Oliveira",
"avatar_url": "https://avatars.githubusercontent.com/u/128543464?v=4",
"profile": "https://github.com/SrGiuliano77",
"contributions": [
"translation"
]
},
{
"login": "priyanshuvishwakarma273403",
"name": "Priyanshu",
"avatar_url": "https://avatars.githubusercontent.com/u/222148451?v=4",
"profile": "https://www.priyanshu-portfolio.co.in",
"contributions": [
"code"
]
},
{
"login": "arnabnandy7",
"name": "Arnab Nandy",
"avatar_url": "https://avatars.githubusercontent.com/u/5053648?v=4",
"profile": "https://github.com/arnabnandy-cognizant",
"contributions": [
"doc"
]
},
{
"login": "MohamedMBG",
"name": "BAGHDAD Mohamed",
"avatar_url": "https://avatars.githubusercontent.com/u/123114744?v=4",
"profile": "https://github.com/MohamedMBG",
"contributions": [
"code"
]
},
{
"login": "AnveshSrivastava",
"name": "Anvesh Srivastava",
"avatar_url": "https://avatars.githubusercontent.com/u/170334970?v=4",
"profile": "https://github.com/AnveshSrivastava",
"contributions": [
"code"
]
},
{
"login": "Mukul-Howale",
"name": "Mukul Howale",
"avatar_url": "https://avatars.githubusercontent.com/u/110479646?v=4",
"profile": "https://github.com/Mukul-Howale",
"contributions": [
"code"
]
},
{
"login": "SandhyaDevadiga",
"name": "Sandhya",
"avatar_url": "https://avatars.githubusercontent.com/u/128058717?v=4",
"profile": "https://github.com/SandhyaDevadiga",
"contributions": [
"code"
]
},
{
"login": "devikae",
"name": "dev-ikae",
"avatar_url": "https://avatars.githubusercontent.com/u/98100047?v=4",
"profile": "https://github.com/devikae",
"contributions": [
"code"
]
},
{
"login": "zanarellidev",
"name": "zanarelli",
"avatar_url": "https://avatars.githubusercontent.com/u/268068569?v=4",
"profile": "https://github.com/zanarellidev",
"contributions": [
"translation"
]
} }
], ],
"contributorsPerLine": 7, "contributorsPerLine": 6,
"projectName": "java-design-patterns", "projectName": "java-design-patterns",
"projectOwner": "iluwatar", "projectOwner": "iluwatar",
"repoType": "github", "repoType": "github",
+366
View File
@@ -0,0 +1,366 @@
#
# This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
#
# The MIT License
# Copyright © 2014-2022 Ilkka Seppälä
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = false
max_line_length = off
tab_width = 4
ij_continuation_indent_size = 8
ij_formatter_off_tag = @formatter:off
ij_formatter_on_tag = @formatter:on
ij_formatter_tags_enabled = true
ij_smart_tabs = false
ij_visual_guides =
ij_wrap_on_typing = false
[*.java]
indent_size = 2
max_line_length = 100
ij_continuation_indent_size = 4
ij_java_align_consecutive_assignments = false
ij_java_align_consecutive_variable_declarations = false
ij_java_align_group_field_declarations = false
ij_java_align_multiline_annotation_parameters = false
ij_java_align_multiline_array_initializer_expression = false
ij_java_align_multiline_assignment = false
ij_java_align_multiline_binary_operation = false
ij_java_align_multiline_chained_methods = false
ij_java_align_multiline_deconstruction_list_components = true
ij_java_align_multiline_extends_list = false
ij_java_align_multiline_for = true
ij_java_align_multiline_method_parentheses = false
ij_java_align_multiline_parameters = true
ij_java_align_multiline_parameters_in_calls = false
ij_java_align_multiline_parenthesized_expression = false
ij_java_align_multiline_records = true
ij_java_align_multiline_resources = true
ij_java_align_multiline_ternary_operation = false
ij_java_align_multiline_text_blocks = false
ij_java_align_multiline_throws_list = false
ij_java_align_subsequent_simple_methods = false
ij_java_align_throws_keyword = false
ij_java_align_types_in_multi_catch = true
ij_java_annotation_parameter_wrap = off
ij_java_array_initializer_new_line_after_left_brace = false
ij_java_array_initializer_right_brace_on_new_line = false
ij_java_array_initializer_wrap = normal
ij_java_assert_statement_colon_on_next_line = false
ij_java_assert_statement_wrap = normal
ij_java_assignment_wrap = normal
ij_java_binary_operation_sign_on_next_line = false
ij_java_binary_operation_wrap = normal
ij_java_blank_lines_after_anonymous_class_header = 0
ij_java_blank_lines_after_class_header = 0
ij_java_blank_lines_after_imports = 1
ij_java_blank_lines_after_package = 1
ij_java_blank_lines_around_class = 1
ij_java_blank_lines_around_field = 0
ij_java_blank_lines_around_field_in_interface = 0
ij_java_blank_lines_around_initializer = 1
ij_java_blank_lines_around_method = 1
ij_java_blank_lines_around_method_in_interface = 1
ij_java_blank_lines_before_class_end = 0
ij_java_blank_lines_before_imports = 1
ij_java_blank_lines_before_method_body = 0
ij_java_blank_lines_before_package = 1
ij_java_block_brace_style = end_of_line
ij_java_block_comment_add_space = false
ij_java_block_comment_at_first_column = true
ij_java_builder_methods =
ij_java_call_parameters_new_line_after_left_paren = false
ij_java_call_parameters_right_paren_on_new_line = false
ij_java_call_parameters_wrap = normal
ij_java_case_statement_on_separate_line = true
ij_java_catch_on_new_line = false
ij_java_class_annotation_wrap = split_into_lines
ij_java_class_brace_style = end_of_line
ij_java_class_count_to_use_import_on_demand = 999
ij_java_class_names_in_javadoc = 1
ij_java_deconstruction_list_wrap = normal
ij_java_do_not_indent_top_level_class_members = false
ij_java_do_not_wrap_after_single_annotation = false
ij_java_do_not_wrap_after_single_annotation_in_parameter = false
ij_java_do_while_brace_force = always
ij_java_doc_add_blank_line_after_description = true
ij_java_doc_add_blank_line_after_param_comments = false
ij_java_doc_add_blank_line_after_return = false
ij_java_doc_add_p_tag_on_empty_lines = true
ij_java_doc_align_exception_comments = true
ij_java_doc_align_param_comments = true
ij_java_doc_do_not_wrap_if_one_line = false
ij_java_doc_enable_formatting = true
ij_java_doc_enable_leading_asterisks = true
ij_java_doc_indent_on_continuation = false
ij_java_doc_keep_empty_lines = true
ij_java_doc_keep_empty_parameter_tag = true
ij_java_doc_keep_empty_return_tag = true
ij_java_doc_keep_empty_throws_tag = true
ij_java_doc_keep_invalid_tags = true
ij_java_doc_param_description_on_new_line = false
ij_java_doc_preserve_line_breaks = false
ij_java_doc_use_throws_not_exception_tag = true
ij_java_else_on_new_line = false
ij_java_entity_dd_prefix =
ij_java_entity_dd_suffix = EJB
ij_java_entity_eb_prefix =
ij_java_entity_eb_suffix = Bean
ij_java_entity_hi_prefix =
ij_java_entity_hi_suffix = Home
ij_java_entity_lhi_prefix = Local
ij_java_entity_lhi_suffix = Home
ij_java_entity_li_prefix = Local
ij_java_entity_li_suffix =
ij_java_entity_pk_class = java.lang.String
ij_java_entity_ri_prefix =
ij_java_entity_ri_suffix =
ij_java_entity_vo_prefix =
ij_java_entity_vo_suffix = VO
ij_java_enum_constants_wrap = normal
ij_java_extends_keyword_wrap = normal
ij_java_extends_list_wrap = normal
ij_java_field_annotation_wrap = split_into_lines
ij_java_field_name_prefix =
ij_java_field_name_suffix =
ij_java_filter_class_prefix =
ij_java_filter_class_suffix =
ij_java_filter_dd_prefix =
ij_java_filter_dd_suffix =
ij_java_finally_on_new_line = false
ij_java_for_brace_force = always
ij_java_for_statement_new_line_after_left_paren = false
ij_java_for_statement_right_paren_on_new_line = false
ij_java_for_statement_wrap = normal
ij_java_generate_final_locals = false
ij_java_generate_final_parameters = false
ij_java_if_brace_force = always
ij_java_imports_layout = $*,|,*
ij_java_indent_case_from_switch = true
ij_java_insert_inner_class_imports = false
ij_java_insert_override_annotation = true
ij_java_keep_blank_lines_before_right_brace = 2
ij_java_keep_blank_lines_between_package_declaration_and_header = 2
ij_java_keep_blank_lines_in_code = 2
ij_java_keep_blank_lines_in_declarations = 2
ij_java_keep_builder_methods_indents = false
ij_java_keep_control_statement_in_one_line = true
ij_java_keep_first_column_comment = true
ij_java_keep_indents_on_empty_lines = false
ij_java_keep_line_breaks = true
ij_java_keep_multiple_expressions_in_one_line = false
ij_java_keep_simple_blocks_in_one_line = false
ij_java_keep_simple_classes_in_one_line = false
ij_java_keep_simple_lambdas_in_one_line = false
ij_java_keep_simple_methods_in_one_line = false
ij_java_label_indent_absolute = false
ij_java_label_indent_size = 0
ij_java_lambda_brace_style = end_of_line
ij_java_layout_static_imports_separately = true
ij_java_line_comment_add_space = false
ij_java_line_comment_add_space_on_reformat = false
ij_java_line_comment_at_first_column = true
ij_java_listener_class_prefix =
ij_java_listener_class_suffix =
ij_java_local_variable_name_prefix =
ij_java_local_variable_name_suffix =
ij_java_message_dd_prefix =
ij_java_message_dd_suffix = EJB
ij_java_message_eb_prefix =
ij_java_message_eb_suffix = Bean
ij_java_method_annotation_wrap = split_into_lines
ij_java_method_brace_style = end_of_line
ij_java_method_call_chain_wrap = normal
ij_java_method_parameters_new_line_after_left_paren = false
ij_java_method_parameters_right_paren_on_new_line = false
ij_java_method_parameters_wrap = normal
ij_java_modifier_list_wrap = false
ij_java_multi_catch_types_wrap = normal
ij_java_names_count_to_use_import_on_demand = 999
ij_java_new_line_after_lparen_in_annotation = false
ij_java_new_line_after_lparen_in_deconstruction_pattern = true
ij_java_new_line_after_lparen_in_record_header = false
ij_java_packages_to_use_import_on_demand =
ij_java_parameter_annotation_wrap = normal
ij_java_parameter_name_prefix =
ij_java_parameter_name_suffix =
ij_java_parentheses_expression_new_line_after_left_paren = false
ij_java_parentheses_expression_right_paren_on_new_line = false
ij_java_place_assignment_sign_on_next_line = false
ij_java_prefer_longer_names = true
ij_java_prefer_parameters_wrap = false
ij_java_record_components_wrap = normal
ij_java_repeat_annotations =
ij_java_repeat_synchronized = true
ij_java_replace_instanceof_and_cast = false
ij_java_replace_null_check = true
ij_java_replace_sum_lambda_with_method_ref = true
ij_java_resource_list_new_line_after_left_paren = false
ij_java_resource_list_right_paren_on_new_line = false
ij_java_resource_list_wrap = normal
ij_java_rparen_on_new_line_in_annotation = false
ij_java_rparen_on_new_line_in_deconstruction_pattern = true
ij_java_rparen_on_new_line_in_record_header = false
ij_java_servlet_class_prefix =
ij_java_servlet_class_suffix =
ij_java_servlet_dd_prefix =
ij_java_servlet_dd_suffix =
ij_java_session_dd_prefix =
ij_java_session_dd_suffix = EJB
ij_java_session_eb_prefix =
ij_java_session_eb_suffix = Bean
ij_java_session_hi_prefix =
ij_java_session_hi_suffix = Home
ij_java_session_lhi_prefix = Local
ij_java_session_lhi_suffix = Home
ij_java_session_li_prefix = Local
ij_java_session_li_suffix =
ij_java_session_ri_prefix =
ij_java_session_ri_suffix =
ij_java_session_si_prefix =
ij_java_session_si_suffix = Service
ij_java_space_after_closing_angle_bracket_in_type_argument = false
ij_java_space_after_colon = true
ij_java_space_after_comma = true
ij_java_space_after_comma_in_type_arguments = true
ij_java_space_after_for_semicolon = true
ij_java_space_after_quest = true
ij_java_space_after_type_cast = true
ij_java_space_before_annotation_array_initializer_left_brace = false
ij_java_space_before_annotation_parameter_list = false
ij_java_space_before_array_initializer_left_brace = true
ij_java_space_before_catch_keyword = true
ij_java_space_before_catch_left_brace = true
ij_java_space_before_catch_parentheses = true
ij_java_space_before_class_left_brace = true
ij_java_space_before_colon = true
ij_java_space_before_colon_in_foreach = true
ij_java_space_before_comma = false
ij_java_space_before_deconstruction_list = false
ij_java_space_before_do_left_brace = true
ij_java_space_before_else_keyword = true
ij_java_space_before_else_left_brace = true
ij_java_space_before_finally_keyword = true
ij_java_space_before_finally_left_brace = true
ij_java_space_before_for_left_brace = true
ij_java_space_before_for_parentheses = true
ij_java_space_before_for_semicolon = false
ij_java_space_before_if_left_brace = true
ij_java_space_before_if_parentheses = true
ij_java_space_before_method_call_parentheses = false
ij_java_space_before_method_left_brace = true
ij_java_space_before_method_parentheses = false
ij_java_space_before_opening_angle_bracket_in_type_parameter = false
ij_java_space_before_quest = true
ij_java_space_before_switch_left_brace = true
ij_java_space_before_switch_parentheses = true
ij_java_space_before_synchronized_left_brace = true
ij_java_space_before_synchronized_parentheses = true
ij_java_space_before_try_left_brace = true
ij_java_space_before_try_parentheses = true
ij_java_space_before_type_parameter_list = false
ij_java_space_before_while_keyword = true
ij_java_space_before_while_left_brace = true
ij_java_space_before_while_parentheses = true
ij_java_space_inside_one_line_enum_braces = false
ij_java_space_within_empty_array_initializer_braces = false
ij_java_space_within_empty_method_call_parentheses = false
ij_java_space_within_empty_method_parentheses = false
ij_java_spaces_around_additive_operators = true
ij_java_spaces_around_annotation_eq = true
ij_java_spaces_around_assignment_operators = true
ij_java_spaces_around_bitwise_operators = true
ij_java_spaces_around_equality_operators = true
ij_java_spaces_around_lambda_arrow = true
ij_java_spaces_around_logical_operators = true
ij_java_spaces_around_method_ref_dbl_colon = false
ij_java_spaces_around_multiplicative_operators = true
ij_java_spaces_around_relational_operators = true
ij_java_spaces_around_shift_operators = true
ij_java_spaces_around_type_bounds_in_type_parameters = true
ij_java_spaces_around_unary_operator = false
ij_java_spaces_within_angle_brackets = false
ij_java_spaces_within_annotation_parentheses = false
ij_java_spaces_within_array_initializer_braces = false
ij_java_spaces_within_braces = false
ij_java_spaces_within_brackets = false
ij_java_spaces_within_cast_parentheses = false
ij_java_spaces_within_catch_parentheses = false
ij_java_spaces_within_deconstruction_list = false
ij_java_spaces_within_for_parentheses = false
ij_java_spaces_within_if_parentheses = false
ij_java_spaces_within_method_call_parentheses = false
ij_java_spaces_within_method_parentheses = false
ij_java_spaces_within_parentheses = false
ij_java_spaces_within_record_header = false
ij_java_spaces_within_switch_parentheses = false
ij_java_spaces_within_synchronized_parentheses = false
ij_java_spaces_within_try_parentheses = false
ij_java_spaces_within_while_parentheses = false
ij_java_special_else_if_treatment = true
ij_java_static_field_name_prefix =
ij_java_static_field_name_suffix =
ij_java_subclass_name_prefix =
ij_java_subclass_name_suffix = Impl
ij_java_ternary_operation_signs_on_next_line = false
ij_java_ternary_operation_wrap = normal
ij_java_test_name_prefix =
ij_java_test_name_suffix = Test
ij_java_throws_keyword_wrap = normal
ij_java_throws_list_wrap = normal
ij_java_use_external_annotations = false
ij_java_use_fq_class_names = false
ij_java_use_relative_indents = false
ij_java_use_single_class_imports = true
ij_java_variable_annotation_wrap = normal
ij_java_visibility = public
ij_java_while_brace_force = always
ij_java_while_on_new_line = false
ij_java_wrap_comments = false
ij_java_wrap_first_method_in_call_chain = false
ij_java_wrap_long_lines = false
[{*.markdown,*.md}]
ij_markdown_force_one_space_after_blockquote_symbol = true
ij_markdown_force_one_space_after_header_symbol = true
ij_markdown_force_one_space_after_list_bullet = true
ij_markdown_force_one_space_between_words = true
ij_markdown_format_tables = true
ij_markdown_insert_quote_arrows_on_wrap = true
ij_markdown_keep_indents_on_empty_lines = false
ij_markdown_keep_line_breaks_inside_text_blocks = true
ij_markdown_max_line_length = off
ij_markdown_max_lines_around_block_elements = 1
ij_markdown_max_lines_around_header = 1
ij_markdown_max_lines_between_paragraphs = 1
ij_markdown_min_lines_around_block_elements = 1
ij_markdown_min_lines_around_header = 1
ij_markdown_min_lines_between_paragraphs = 1
ij_markdown_wrap_text_if_long = true
ij_markdown_wrap_text_inside_blockquotes = true
-14
View File
@@ -9,17 +9,3 @@ updates:
directory: "/" # Location of package manifests directory: "/" # Location of package manifests
schedule: schedule:
interval: "weekly" interval: "weekly"
allow:
- dependency-name: "org.springframework.boot:spring-boot-dependencies"
- dependency-name: "commons-dbcp:commons-dbcp"
- dependency-name: "net.sourceforge.htmlunit:htmlunit"
- dependency-name: "com.google.code.gson:gson"
- dependency-name: "com.google.inject:guice"
- dependency-name: "com.github.stefanbirkner:system-lambda"
- dependency-name: "org.apache.maven.plugins:maven-surefire-plugin"
- dependency-name: "org.apache.maven.plugins:maven-assembly-plugin"
- dependency-name: "org.sonarsource.scanner.maven:sonar-maven-plugin"
- dependency-name: "org.apache.maven.plugins:maven-checkstyle-plugin"
- dependency-name: "com.mycila:license-maven-plugin"
- dependency-name: "org.jacoco:jacoco-maven-plugin"
- dependency-name: "com.iluwatar.urm:urm-maven-plugin"
-61
View File
@@ -1,61 +0,0 @@
# Configuration for probot-stale - https://github.com/probot/stale
# Number of days of inactivity before an Issue or Pull Request becomes stale
daysUntilStale: 60
# Number of days of inactivity before an Issue or Pull Request with the stale label is closed.
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
daysUntilClose: false
# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled)
onlyLabels: []
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
exemptLabels:
- "info: help wanted"
# Set to true to ignore issues in a project (defaults to false)
exemptProjects: false
# Set to true to ignore issues in a milestone (defaults to false)
exemptMilestones: false
# Set to true to ignore issues with an assignee (defaults to false)
exemptAssignees: false
# Label to use when marking as stale
staleLabel: "status: stale"
# Comment to post when marking as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. The issue will be unassigned if no further activity occurs. Thank you
for your contributions.
# Comment to post when removing the stale label.
# unmarkComment: >
# Your comment here.
# Comment to post when closing a stale Issue or Pull Request.
# closeComment: >
# Your comment here.
# Limit the number of actions per hour, from 1-30. Default is 30
limitPerRun: 30
# Limit to only `issues` or `pulls`
# only: issues
# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls':
pulls:
daysUntilStale: 30
daysUntilClose: 45
markComment: >
This pull request has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs.
closeComment: >
Closed due to inactivity. Thank you for your contributions.
# issues:
# exemptLabels:
# - confirmed
+14 -38
View File
@@ -1,32 +1,3 @@
#
# The MIT License
# Copyright © 2014-2021 Ilkka Seppälä
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
# This workflow will build a Java project with Maven
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
# We are using two jobs here for testing our code on the latest JDK 11 build as well as a more satble build version of 11.0.3
# You can see the full discussion here https://github.com/iluwatar/java-design-patterns/pull/1868#issue-1029459688
name: Java CI name: Java CI
on: on:
@@ -37,34 +8,34 @@ jobs:
build-and-analyze: build-and-analyze:
name: Build and Run Sonar analysis on JDK 17 name: Build and Run Sonar analysis on JDK 21
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
steps: steps:
- name: Checkout Code - name: Checkout Code
uses: actions/checkout@v3 uses: actions/checkout@v4
with: with:
# Disabling shallow clone for improving relevancy of SonarQube reporting # Disabling shallow clone for improving relevancy of SonarQube reporting
fetch-depth: 0 fetch-depth: 0
- name: Set up JDK 17 - name: Set up JDK 21
uses: actions/setup-java@v3 uses: actions/setup-java@v4
with: with:
java-version: '17' java-version: '21'
distribution: 'temurin' distribution: 'temurin'
cache: 'maven' cache: 'maven'
- name: Cache local Maven repository - name: Cache local Maven repository
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: ~/.m2/repository path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: | restore-keys: |
${{ runner.os }}-maven- ${{ runner.os }}-maven-
# Cache Sonar packages which as used to run analysis and collect metrics # Cache Sonar packages which are used to run analysis and collect metrics
- name: Cache SonarCloud packages - name: Cache SonarCloud packages
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: ~/.sonar/cache path: ~/.sonar/cache
key: ${{ runner.os }}-sonar key: ${{ runner.os }}-sonar
@@ -80,3 +51,8 @@ jobs:
# These two env variables are needed for sonar analysis # These two env variables are needed for sonar analysis
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
+15 -52
View File
@@ -1,33 +1,7 @@
#
# The MIT License
# Copyright © 2014-2021 Ilkka Seppälä
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
# This workflow will build a Java project with Maven
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
name: Java PR Builder name: Java PR Builder
on: on:
pull_request_target: pull_request:
branches: [ master ] branches: [ master ]
types: [ opened, reopened, synchronize ] types: [ opened, reopened, synchronize ]
@@ -37,47 +11,36 @@ permissions:
jobs: jobs:
build-and-analyze: build-and-analyze:
name: Build on JDK 17 name: Build on JDK 21
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
steps: steps:
- name: Checkout Code - name: Checkout Code
uses: actions/checkout@v3 uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Set up JDK 17 - name: Set up JDK 21
uses: actions/setup-java@v3 uses: actions/setup-java@v4
with: with:
java-version: '17' java-version: '21'
distribution: 'temurin' distribution: 'temurin'
cache: 'maven' cache: 'maven'
- name: Cache local Maven repository - name: Cache local Maven repository
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: ~/.m2/repository path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: | restore-keys: |
${{ runner.os }}-maven- ${{ runner.os }}-maven-
# Cache Sonar packages which as used to run analysis and collect metrics
- name: Cache SonarCloud packages
uses: actions/cache@v3
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
# Some tests need screen access # Some tests need screen access
- name: Install xvfb - name: Install xvfb
run: sudo apt-get install -y xvfb run: sudo apt-get install -y xvfb
- name: Build with Maven and run SonarQube analysis - name: Build with Maven
env: run: xvfb-run ./mvnw clean verify
# Intermediate variable
HEAD_REF: ${{ github.head_ref }} - name: Upload coverage reports to Codecov
# These two env variables are needed for sonar analysis uses: codecov/codecov-action@v5
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} token: ${{ secrets.CODECOV_TOKEN }}
run: xvfb-run ./mvnw clean verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=iluwatar -Dsonar.projectKey=iluwatar_java-design-patterns -Dsonar.pullrequest.branch=$HEAD_REF -Dsonar.pullrequest.base=${{ github.base_ref }} -Dsonar.pullrequest.key=${{ github.event.pull_request.number }}
+28
View File
@@ -0,0 +1,28 @@
name: Presubmit.ai
permissions:
contents: read
pull-requests: write
issues: write
on:
pull_request_target:
types: [opened, synchronize]
pull_request_review_comment:
types: [created]
jobs:
review:
runs-on: ubuntu-latest
steps:
- name: Check required secrets
run: |
if [ -z "${{ secrets.LLM_API_KEY }}" ]; then
echo "Error: LLM_API_KEY secret is not configured"
exit 1
fi
- uses: presubmit/ai-reviewer@latest
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
LLM_API_KEY: ${{ secrets.LLM_API_KEY }}
LLM_MODEL: "gpt-5-nano"
+20
View File
@@ -0,0 +1,20 @@
name: 'Comment on stale issues and PRs'
on:
schedule:
- cron: '30 1 * * *'
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v9
with:
stale-issue-message: 'This issue is stale because it has been open 60 days with no activity.'
stale-pr-message: 'This PR is stale because it has been open 60 days with no activity.'
close-issue-message: 'This issue was closed because it has been stalled for too long with no activity.'
close-pr-message: 'This PR was closed because it has been stalled for too long with no activity.'
days-before-issue-stale: 60
days-before-pr-stale: 60
days-before-issue-close: -1
days-before-pr-close: -1
exempt-issue-labels: 'info: help wanted'
+2
View File
@@ -57,3 +57,5 @@ build/
#################### Java Design Patterns ####### #################### Java Design Patterns #######
etc/Java Design Patterns.urm.puml etc/Java Design Patterns.urm.puml
serialized-entity/output.txt serialized-entity/output.txt
fish1.out
fish2.out
-125
View File
@@ -1,125 +0,0 @@
/*
* The MIT License
* Copyright © 2014-2021 Ilkka Seppälä
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
import java.net.*;
import java.io.*;
import java.nio.channels.*;
import java.util.Properties;
public class MavenWrapperDownloader {
private static final String WRAPPER_VERSION = "0.5.6";
/**
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
*/
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
/**
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
* use instead of the default one.
*/
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
".mvn/wrapper/maven-wrapper.properties";
/**
* Path where the maven-wrapper.jar will be saved to.
*/
private static final String MAVEN_WRAPPER_JAR_PATH =
".mvn/wrapper/maven-wrapper.jar";
/**
* Name of the property which should be used to override the default download url for the wrapper.
*/
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
public static void main(String args[]) {
System.out.println("- Downloader started");
File baseDirectory = new File(args[0]);
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
// If the maven-wrapper.properties exists, read it and check if it contains a custom
// wrapperUrl parameter.
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
String url = DEFAULT_DOWNLOAD_URL;
if(mavenWrapperPropertyFile.exists()) {
FileInputStream mavenWrapperPropertyFileInputStream = null;
try {
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
Properties mavenWrapperProperties = new Properties();
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
} catch (IOException e) {
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
} finally {
try {
if(mavenWrapperPropertyFileInputStream != null) {
mavenWrapperPropertyFileInputStream.close();
}
} catch (IOException e) {
// Ignore ...
}
}
}
System.out.println("- Downloading from: " + url);
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
if(!outputFile.getParentFile().exists()) {
if(!outputFile.getParentFile().mkdirs()) {
System.out.println(
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
}
}
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
try {
downloadFileFromURL(url, outputFile);
System.out.println("Done");
System.exit(0);
} catch (Throwable e) {
System.out.println("- Error downloading");
e.printStackTrace();
System.exit(1);
}
}
private static void downloadFileFromURL(String urlString, File destination) throws Exception {
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
String username = System.getenv("MVNW_USERNAME");
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
}
URL website = new URL(urlString);
ReadableByteChannel rbc;
rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(destination);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
rbc.close();
}
}
+3 -3
View File
@@ -6,7 +6,7 @@
# "License"); you may not use this file except in compliance # "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at # with the License. You may obtain a copy of the License at
# #
# http://www.apache.org/licenses/LICENSE-2.0 # https://www.apache.org/licenses/LICENSE-2.0
# #
# Unless required by applicable law or agreed to in writing, # Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an # software distributed under the License is distributed on an
@@ -14,5 +14,5 @@
# KIND, either express or implied. See the License for the # KIND, either express or implied. See the License for the
# specific language governing permissions and limitations # specific language governing permissions and limitations
# under the License. # under the License.
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar
+51
View File
@@ -0,0 +1,51 @@
# Java Design Patterns - Priming Context for AI Agents
## Quick Overview
- This repository is a comprehensive collection of design patterns implemented in Java.
- The project demonstrates how to solve common software design problems using standard patterns.
- The code for each pattern lives directly in this repository, alongside its explanatory README.
- These readmes are published on the java-design-patterns.com website.
- Another repository (https://github.com/iluwatar/java-design-patterns-vuepress-web) handles the deployment of the website.
## Stack
- **Java 21**: The primary programming language used for pattern implementations.
- **Maven**: Dependency management and build tool.
- **JUnit 5**: The testing framework used to verify pattern behaviors.
- **Mockito**: Used for mocking dependencies in unit tests.
- **Lombok**: Used to reduce boilerplate code (getters, setters, etc.).
- **Spotless**: Enforces consistent code formatting via Google Java Format.
## Trusted Sources
- [Java SE 21 Documentation](https://docs.oracle.com/en/java/javase/21/docs/api/)
- [Maven Official Documentation](https://maven.apache.org/guides/index.html)
- [JUnit 5 User Guide](https://junit.org/junit5/docs/current/user-guide/)
- [Project Wiki](https://github.com/iluwatar/java-design-patterns/wiki)
## Structure
- `/pom.xml`: The root Maven configuration file that defines global dependencies and lists all pattern modules.
- `/[pattern-name]/`: Individual folders for each design pattern (e.g., `/abstract-factory`, `/builder`), acting as standalone Maven modules.
- `/[pattern-name]/src/main/java/`: Contains the actual Java implementation classes of the specific design pattern.
- `/[pattern-name]/src/test/java/`: Contains the JUnit tests verifying the pattern's behavior.
- `/[pattern-name]/README.md`: The documentation for the pattern, which gets published to the main website.
## Patterns
- Keep pattern implementations simple, atomic, and easy to understand.
- Write descriptive and meaningful names for classes, interfaces, and methods.
- Always include comprehensive unit tests for every new pattern or code modification.
- Follow the Google Java Format strictly (enforced by Spotless).
- Document the intent, explanation, and real-world usage clearly in each module's `README.md`.
## Anti-patterns
- Avoid overcomplicating patterns with unnecessary external dependencies or complex frameworks.
- Do not introduce business logic that distracts from the core mechanism of the design pattern itself.
- Submitting new patterns or features without corresponding unit tests is strictly discouraged.
- Avoid large monolithic packages; each pattern should reside in its own isolated module.
## Example Design Pattern
When a new design pattern is added to the repository, it generally follows these steps:
- **Create a Module**: Create a new folder for the pattern in the root directory (e.g., `/my-new-pattern`).
- **Update root pom.xml**: Add `<module>my-new-pattern</module>` to the `<modules>` section of the root `pom.xml`.
- **Add Module pom.xml**: Create a `pom.xml` inside the new folder that inherits from the parent project.
- **Write the Code**: Implement the pattern logic under `src/main/java/com/iluwatar/mynewpattern`, usually including an `App.java` class to demonstrate its usage.
- **Write the Tests**: Add comprehensive unit tests under `src/test/java/com/iluwatar/mynewpattern`.
- **Document**: Create a `README.md` at the root of the new module, structured with standard sections like Intent, Explanation, Class diagram, Applicability, and Real world examples.
+2 -3
View File
@@ -1,4 +1,3 @@
This is great you have something to contribute! The project guidelines can be found in [Java Design Patterns developer wiki](https://github.com/iluwatar/java-design-patterns/wiki).
Before going any further please read the [wiki](https://github.com/iluwatar/java-design-patterns/wiki) A good place to start is: https://github.com/iluwatar/java-design-patterns/wiki/01.-How-to-contribute
with conventions and rules we used for this project.
+1 -1
View File
@@ -1,6 +1,6 @@
The MIT License (MIT) The MIT License (MIT)
Copyright © 2014-2021 Ilkka Seppälä Copyright � 2014-2024 Ilkka Seppälä
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
+4 -12
View File
@@ -1,15 +1,7 @@
# Pull Request Template
Pull request title ## What does this PR do?
- Clearly and concisely describes what it does <!-- Provide a short description of what this pull request does. -->
- Refer to the issue that it solves, if available
<!-- Fixes #<issue-number> (if applicable) -->
Pull request description
- Describes the main changes that come with the pull request
- Any relevant additional information is provided
> For detailed contributing instructions see https://github.com/iluwatar/java-design-patterns/wiki/01.-How-to-contribute
+510 -350
View File
@@ -1,73 +1,79 @@
<!-- the line below needs to be an empty line C: (its because kramdown isn't # Design Patterns Implemented in Java
that smart and dearly wants an empty line before a heading to be able to
display it as such, e.g. website) -->
# Design patterns implemented in Java [![Java CI](https://github.com/iluwatar/java-design-patterns/workflows/Java%20CI/badge.svg)](https://github.com/iluwatar/java-design-patterns/actions/workflows/maven-ci.yml)
![Java CI](https://github.com/iluwatar/java-design-patterns/workflows/Java%20CI/badge.svg)
[![License MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/iluwatar/java-design-patterns/master/LICENSE.md) [![License MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/iluwatar/java-design-patterns/master/LICENSE.md)
[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=iluwatar_java-design-patterns&metric=ncloc)](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns) [![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=iluwatar_java-design-patterns&metric=ncloc)](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns)
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=iluwatar_java-design-patterns&metric=coverage)](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=iluwatar_java-design-patterns&metric=coverage)](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns)
[![Join the chat at https://gitter.im/iluwatar/java-design-patterns](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/iluwatar/java-design-patterns?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Join the chat at https://gitter.im/iluwatar/java-design-patterns](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/iluwatar/java-design-patterns?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --> <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
[![All Contributors](https://img.shields.io/badge/all_contributors-313-orange.svg?style=flat-square)](#contributors-) [![All Contributors](https://img.shields.io/badge/all_contributors-417-orange.svg?style=flat-square)](#contributors-)
<!-- ALL-CONTRIBUTORS-BADGE:END --> <!-- ALL-CONTRIBUTORS-BADGE:END -->
<br/> <br/>
Read in different language : [**zh**](localization/zh/README.md), [**ko**](localization/ko/README.md), [**fr**](localization/fr/README.md), [**tr**](localization/tr/README.md), [**ar**](localization/ar/README.md), [**es**](localization/es/README.md), [**pt**](localization/pt/README.md), [**id**](localization/id/README.md), [**ru**](localization/ru/README.md), [**de**](localization/de/README.md), [**ja**](localization/ja/README.md), [**vi**](localization/vi/README.md), [**bn**](localization/bn/README.md), [**np**](localization/ne/README.md), [**it**](localization/it/README.md), [**da**](localization/da/README.md) Read in different language : [**zh**](localization/zh/README.md), [**zh-TW**](localization/zh-TW/README.md)
,[**ko**](localization/ko/README.md), [**fr**](localization/fr/README.md), [**tr**](localization/tr/README.md), [**ar**](localization/ar/README.md), [**es**](localization/es/README.md), [**pt**](localization/pt/README.md), [**id**](localization/id/README.md), [**ru**](localization/ru/README.md), [**de**](localization/de/README.md), [**ja**](localization/ja/README.md), [**vi**](localization/vi/README.md), [**bn**](localization/bn/README.md), [**np**](localization/ne/README.md), [**it**](localization/it/README.md), [**da**](localization/da/README.md)
<br/> <br/>
# Introduction # Introduction
Design patterns are the best, formalized practices a programmer can use to Design patterns are the best, formalized practices a programmer can use to solve common problems when designing an application or system.
solve common problems when designing an application or system.
Design patterns can speed up the development process by providing tested, proven Design patterns can speed up the development process by providing tested, proven development paradigms.
development paradigms.
Reusing design patterns help prevent subtle issues that cause major Reusing design patterns helps prevent subtle issues that cause major problems, and it also improves code readability for coders and architects who are familiar with the patterns.
problems, and it also improves code readability for coders and architects who
are familiar with the patterns.
# Getting started # Getting Started
This site showcases Java Design Patterns. The solutions have been developed by This site showcases Java Design Patterns. The solutions have been developed by experienced programmers and architects from the open-source community. The patterns can be browsed by their high-level descriptions or by looking at their
experienced programmers and architects from the open-source community. The source code. The source code examples are well commented and can be thought of as programming tutorials on how to implement a specific pattern. We use the most popular battle-proven open-source Java technologies.
patterns can be browsed by their high-level descriptions or by looking at their
source code. The source code examples are well commented and can be thought of as
programming tutorials on how to implement a specific pattern. We use the most
popular battle-proven open-source Java technologies.
Before you dive into the material, you should be familiar with various Before you dive into the material, you should be familiar with various [Software Design Principles](https://java-design-patterns.com/principles/).
[Software Design Principles](https://java-design-patterns.com/principles/).
All designs should be as simple as possible. You should start with KISS, YAGNI, All designs should be as simple as possible. You should start with KISS, YAGNI, and Do The Simplest Thing That Could Possibly Work principles. Complexity and patterns should only be introduced when they are needed for practical extensibility.
and Do The Simplest Thing That Could Possibly Work principles. Complexity and
patterns should only be introduced when they are needed for practical
extensibility.
Once you are familiar with these concepts you can start drilling down into the Once you are familiar with these concepts you can start drilling down into the [available design patterns](https://java-design-patterns.com/patterns/) by any of the following approaches:
[available design patterns](https://java-design-patterns.com/patterns/) by any
of the following approaches
- Search for a specific pattern by name. Can't find one? Please report a new pattern [here](https://github.com/iluwatar/java-design-patterns/issues). - Search for a specific pattern by name. Can't find one? Please report a new pattern [here](https://github.com/iluwatar/java-design-patterns/issues).
- Using tags such as `Performance`, `Gang of Four` or `Data access`. - Using tags such as `Performance`, `Gang of Four` or `Data access`.
- Using pattern categories, `Creational`, `Behavioral`, and others. - Using pattern categories, `Creational`, `Behavioral`, and others.
Hopefully, you find the object-oriented solutions presented on this site useful Hopefully, you find the object-oriented solutions presented on this site useful in your architectures and have as much fun learning them as we had while developing them.
in your architectures and have as much fun learning them as we had while developing them.
# How to contribute # How to Contribute
If you are willing to contribute to the project you will find the relevant information in If you are willing to contribute to the project you will find the relevant information in our [developer wiki](https://github.com/iluwatar/java-design-patterns/wiki). We will help you and answer your questions in the [Gitter chatroom](https://gitter.im/iluwatar/java-design-patterns).
our [developer wiki](https://github.com/iluwatar/java-design-patterns/wiki). We will help
you and answer your questions in the [Gitter chatroom](https://gitter.im/iluwatar/java-design-patterns). # The Book
The design patterns are now available as an e-book. Find out more about "Open Source Java Design Patterns" here: https://payhip.com/b/bNQFX
The project contributors can get the book for free. Contact the maintainer via [Gitter chatroom](https://gitter.im/iluwatar/java-design-patterns) or email (iluwatar (at) gmail (dot) com ). Send a message that contains your email address, Github username, and a link to an accepted pull request.
# License # License
This project is licensed under the terms of the MIT license. This project is licensed under the terms of the MIT license.
# Supporters
<table>
<tr>
<td align="center" width="32%">
<a href="https://serpapi.com/?utm_source=javadesignpatterns">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="assets/banner-wide.svg">
<source media="(prefers-color-scheme: light)" srcset="assets/banner-wide-black.svg">
<img src="assets/banner-wide-black.svg" width="280" alt="SerpApi logo">
</picture>
</a>
</td>
<td valign="middle">
<h3><a href="https://serpapi.com/?utm_source=javadesignpatterns">SerpApi</a></h3>
<p>SerpApi is the world’s leading provider of search data, pioneering APIs that turn search engine results into structured, developer-ready information.</p>
</td>
</tr>
</table>
# Contributors # Contributors
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
@@ -76,407 +82,561 @@ This project is licensed under the terms of the MIT license.
<table> <table>
<tbody> <tbody>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/iluwatar"><img src="https://avatars1.githubusercontent.com/u/582346?v=4?s=100" width="100px;" alt="Ilkka Seppälä"/><br /><sub><b>Ilkka Seppälä</b></sub></a><br /><a href="#projectManagement-iluwatar" title="Project Management">📆</a> <a href="#maintenance-iluwatar" title="Maintenance">🚧</a> <a href="#content-iluwatar" title="Content">🖋</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/iluwatar"><img src="https://avatars1.githubusercontent.com/u/582346?v=4?s=100" width="100px;" alt="Ilkka Seppälä"/><br /><sub><b>Ilkka Seppälä</b></sub></a><br /><a href="#projectManagement-iluwatar" title="Project Management">📆</a> <a href="#maintenance-iluwatar" title="Maintenance">🚧</a> <a href="#content-iluwatar" title="Content">🖋</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://subho.xyz"><img src="https://avatars0.githubusercontent.com/u/13291222?v=4?s=100" width="100px;" alt="Subhrodip Mohanta"/><br /><sub><b>Subhrodip Mohanta</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ohbus" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aohbus" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-ohbus" title="Maintenance">🚧</a></td> <td align="center" valign="top" width="16.66%"><a href="http://subho.xyz"><img src="https://avatars0.githubusercontent.com/u/13291222?v=4?s=100" width="100px;" alt="Subhrodip Mohanta"/><br /><sub><b>Subhrodip Mohanta</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ohbus" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aohbus" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-ohbus" title="Maintenance">🚧</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/amit1307"><img src="https://avatars0.githubusercontent.com/u/23420222?v=4?s=100" width="100px;" alt="amit1307"/><br /><sub><b>amit1307</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=amit1307" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/amit1307"><img src="https://avatars0.githubusercontent.com/u/23420222?v=4?s=100" width="100px;" alt="amit1307"/><br /><sub><b>amit1307</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=amit1307" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/npathai"><img src="https://avatars2.githubusercontent.com/u/1792515?v=4?s=100" width="100px;" alt="Narendra Pathai"/><br /><sub><b>Narendra Pathai</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=npathai" title="Code">💻</a> <a href="#ideas-npathai" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Anpathai" title="Reviewed Pull Requests">👀</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/npathai"><img src="https://avatars2.githubusercontent.com/u/1792515?v=4?s=100" width="100px;" alt="Narendra Pathai"/><br /><sub><b>Narendra Pathai</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=npathai" title="Code">💻</a> <a href="#ideas-npathai" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Anpathai" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fluxw42"><img src="https://avatars1.githubusercontent.com/u/1545460?v=4?s=100" width="100px;" alt="Jeroen Meulemeester"/><br /><sub><b>Jeroen Meulemeester</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=fluxw42" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/fluxw42"><img src="https://avatars1.githubusercontent.com/u/1545460?v=4?s=100" width="100px;" alt="Jeroen Meulemeester"/><br /><sub><b>Jeroen Meulemeester</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=fluxw42" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.joemccarthy.co.uk"><img src="https://avatars0.githubusercontent.com/u/4526195?v=4?s=100" width="100px;" alt="Joseph McCarthy"/><br /><sub><b>Joseph McCarthy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mikulucky" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://www.joemccarthy.co.uk"><img src="https://avatars0.githubusercontent.com/u/4526195?v=4?s=100" width="100px;" alt="Joseph McCarthy"/><br /><sub><b>Joseph McCarthy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mikulucky" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/thomasoss"><img src="https://avatars1.githubusercontent.com/u/22516154?v=4?s=100" width="100px;" alt="Thomas"/><br /><sub><b>Thomas</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=thomasoss" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/anuragagarwal561994"><img src="https://avatars1.githubusercontent.com/u/6075379?v=4?s=100" width="100px;" alt="Anurag Agarwal"/><br /><sub><b>Anurag Agarwal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=anuragagarwal561994" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/thomasoss"><img src="https://avatars1.githubusercontent.com/u/22516154?v=4?s=100" width="100px;" alt="Thomas"/><br /><sub><b>Thomas</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=thomasoss" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://markusmo3.github.io"><img src="https://avatars1.githubusercontent.com/u/3317416?v=4?s=100" width="100px;" alt="Markus Moser"/><br /><sub><b>Markus Moser</b></sub></a><br /><a href="#design-markusmo3" title="Design">🎨</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=markusmo3" title="Code">💻</a> <a href="#ideas-markusmo3" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/anuragagarwal561994"><img src="https://avatars1.githubusercontent.com/u/6075379?v=4?s=100" width="100px;" alt="Anurag Agarwal"/><br /><sub><b>Anurag Agarwal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=anuragagarwal561994" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/i_sabiq"><img src="https://avatars1.githubusercontent.com/u/19510920?v=4?s=100" width="100px;" alt="Sabiq Ihab"/><br /><sub><b>Sabiq Ihab</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=isabiq" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://markusmo3.github.io"><img src="https://avatars1.githubusercontent.com/u/3317416?v=4?s=100" width="100px;" alt="Markus Moser"/><br /><sub><b>Markus Moser</b></sub></a><br /><a href="#design-markusmo3" title="Design">🎨</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=markusmo3" title="Code">💻</a> <a href="#ideas-markusmo3" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://inbravo.github.io"><img src="https://avatars3.githubusercontent.com/u/5253764?v=4?s=100" width="100px;" alt="Amit Dixit"/><br /><sub><b>Amit Dixit</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=inbravo" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://twitter.com/i_sabiq"><img src="https://avatars1.githubusercontent.com/u/19510920?v=4?s=100" width="100px;" alt="Sabiq Ihab"/><br /><sub><b>Sabiq Ihab</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=isabiq" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piyushchaudhari04"><img src="https://avatars3.githubusercontent.com/u/10268029?v=4?s=100" width="100px;" alt="Piyush Kailash Chaudhari"/><br /><sub><b>Piyush Kailash Chaudhari</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=piyushchaudhari04" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://inbravo.github.io"><img src="https://avatars3.githubusercontent.com/u/5253764?v=4?s=100" width="100px;" alt="Amit Dixit"/><br /><sub><b>Amit Dixit</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=inbravo" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/joshzambales"><img src="https://avatars1.githubusercontent.com/u/8704552?v=4?s=100" width="100px;" alt="joshzambales"/><br /><sub><b>joshzambales</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=joshzambales" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/piyushchaudhari04"><img src="https://avatars3.githubusercontent.com/u/10268029?v=4?s=100" width="100px;" alt="Piyush Kailash Chaudhari"/><br /><sub><b>Piyush Kailash Chaudhari</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=piyushchaudhari04" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Crossy147"><img src="https://avatars2.githubusercontent.com/u/7272996?v=4?s=100" width="100px;" alt="Kamil Pietruszka"/><br /><sub><b>Kamil Pietruszka</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Crossy147" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="http://cs.joensuu.fi/~zkhayda"><img src="https://avatars2.githubusercontent.com/u/660742?v=4?s=100" width="100px;" alt="Zafar Khaydarov"/><br /><sub><b>Zafar Khaydarov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=zafarella" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=zafarella" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/joshzambales"><img src="https://avatars1.githubusercontent.com/u/8704552?v=4?s=100" width="100px;" alt="joshzambales"/><br /><sub><b>joshzambales</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=joshzambales" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://kemitix.github.io/"><img src="https://avatars1.githubusercontent.com/u/1147749?v=4?s=100" width="100px;" alt="Paul Campbell"/><br /><sub><b>Paul Campbell</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kemitix" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Crossy147"><img src="https://avatars2.githubusercontent.com/u/7272996?v=4?s=100" width="100px;" alt="Kamil Pietruszka"/><br /><sub><b>Kamil Pietruszka</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Crossy147" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Argyro-Sioziou"><img src="https://avatars0.githubusercontent.com/u/22822639?v=4?s=100" width="100px;" alt="Argyro Sioziou"/><br /><sub><b>Argyro Sioziou</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Argyro-Sioziou" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://cs.joensuu.fi/~zkhayda"><img src="https://avatars2.githubusercontent.com/u/660742?v=4?s=100" width="100px;" alt="Zafar Khaydarov"/><br /><sub><b>Zafar Khaydarov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=zafarella" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=zafarella" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TylerMcConville"><img src="https://avatars0.githubusercontent.com/u/4946449?v=4?s=100" width="100px;" alt="TylerMcConville"/><br /><sub><b>TylerMcConville</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=TylerMcConville" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://kemitix.github.io/"><img src="https://avatars1.githubusercontent.com/u/1147749?v=4?s=100" width="100px;" alt="Paul Campbell"/><br /><sub><b>Paul Campbell</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kemitix" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/saksham93"><img src="https://avatars1.githubusercontent.com/u/37399540?v=4?s=100" width="100px;" alt="saksham93"/><br /><sub><b>saksham93</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=saksham93" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Argyro-Sioziou"><img src="https://avatars0.githubusercontent.com/u/22822639?v=4?s=100" width="100px;" alt="Argyro Sioziou"/><br /><sub><b>Argyro Sioziou</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Argyro-Sioziou" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nikhilbarar"><img src="https://avatars2.githubusercontent.com/u/37332144?v=4?s=100" width="100px;" alt="nikhilbarar"/><br /><sub><b>nikhilbarar</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nikhilbarar" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/TylerMcConville"><img src="https://avatars0.githubusercontent.com/u/4946449?v=4?s=100" width="100px;" alt="TylerMcConville"/><br /><sub><b>TylerMcConville</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=TylerMcConville" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://colinbut.com"><img src="https://avatars2.githubusercontent.com/u/10725674?v=4?s=100" width="100px;" alt="Colin But"/><br /><sub><b>Colin But</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=colinbut" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ruslanpa"><img src="https://avatars2.githubusercontent.com/u/1503411?v=4?s=100" width="100px;" alt="Ruslan"/><br /><sub><b>Ruslan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ruslanpa" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/saksham93"><img src="https://avatars1.githubusercontent.com/u/37399540?v=4?s=100" width="100px;" alt="saksham93"/><br /><sub><b>saksham93</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=saksham93" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JuhoKang"><img src="https://avatars1.githubusercontent.com/u/4745294?v=4?s=100" width="100px;" alt="Juho Kang"/><br /><sub><b>Juho Kang</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JuhoKang" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/nikhilbarar"><img src="https://avatars2.githubusercontent.com/u/37332144?v=4?s=100" width="100px;" alt="nikhilbarar"/><br /><sub><b>nikhilbarar</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nikhilbarar" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dheeraj-mummareddy"><img src="https://avatars2.githubusercontent.com/u/7002230?v=4?s=100" width="100px;" alt="Dheeraj Mummareddy"/><br /><sub><b>Dheeraj Mummareddy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dheeraj-mummareddy" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://colinbut.com"><img src="https://avatars2.githubusercontent.com/u/10725674?v=4?s=100" width="100px;" alt="Colin But"/><br /><sub><b>Colin But</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=colinbut" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.bernardosulzbach.com"><img src="https://avatars0.githubusercontent.com/u/8271090?v=4?s=100" width="100px;" alt="Bernardo Sulzbach"/><br /><sub><b>Bernardo Sulzbach</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=bernardosulzbach" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/ruslanpa"><img src="https://avatars2.githubusercontent.com/u/1503411?v=4?s=100" width="100px;" alt="Ruslan"/><br /><sub><b>Ruslan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ruslanpa" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/4lexis"><img src="https://avatars0.githubusercontent.com/u/19871727?v=4?s=100" width="100px;" alt="Aleksandar Dudukovic"/><br /><sub><b>Aleksandar Dudukovic</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=4lexis" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/JuhoKang"><img src="https://avatars1.githubusercontent.com/u/4745294?v=4?s=100" width="100px;" alt="Juho Kang"/><br /><sub><b>Juho Kang</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JuhoKang" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.yusufaytas.com"><img src="https://avatars2.githubusercontent.com/u/1049483?v=4?s=100" width="100px;" alt="Yusuf Aytaş"/><br /><sub><b>Yusuf Aytaş</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yusufaytas" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/dheeraj-mummareddy"><img src="https://avatars2.githubusercontent.com/u/7002230?v=4?s=100" width="100px;" alt="Dheeraj Mummareddy"/><br /><sub><b>Dheeraj Mummareddy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dheeraj-mummareddy" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://futurehomes.hu"><img src="https://avatars2.githubusercontent.com/u/1001491?v=4?s=100" width="100px;" alt="Mihály Kuprivecz"/><br /><sub><b>Mihály Kuprivecz</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=qpi" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kapinuss"><img src="https://avatars0.githubusercontent.com/u/17639945?v=4?s=100" width="100px;" alt="Stanislav Kapinus"/><br /><sub><b>Stanislav Kapinus</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kapinuss" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.bernardosulzbach.com"><img src="https://avatars0.githubusercontent.com/u/8271090?v=4?s=100" width="100px;" alt="Bernardo Sulzbach"/><br /><sub><b>Bernardo Sulzbach</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=bernardosulzbach" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gvsharma"><img src="https://avatars1.githubusercontent.com/u/6648152?v=4?s=100" width="100px;" alt="GVSharma"/><br /><sub><b>GVSharma</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=gvsharma" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/4lexis"><img src="https://avatars0.githubusercontent.com/u/19871727?v=4?s=100" width="100px;" alt="Aleksandar Dudukovic"/><br /><sub><b>Aleksandar Dudukovic</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=4lexis" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SrdjanPaunovic"><img src="https://avatars1.githubusercontent.com/u/22815104?v=4?s=100" width="100px;" alt="Srđan Paunović"/><br /><sub><b>Srđan Paunović</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=SrdjanPaunovic" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.yusufaytas.com"><img src="https://avatars2.githubusercontent.com/u/1049483?v=4?s=100" width="100px;" alt="Yusuf Aytaş"/><br /><sub><b>Yusuf Aytaş</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yusufaytas" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://sideris.xyz/"><img src="https://avatars3.githubusercontent.com/u/5484694?v=4?s=100" width="100px;" alt="Petros G. Sideris"/><br /><sub><b>Petros G. Sideris</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sideris" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://futurehomes.hu"><img src="https://avatars2.githubusercontent.com/u/1001491?v=4?s=100" width="100px;" alt="Mihály Kuprivecz"/><br /><sub><b>Mihály Kuprivecz</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=qpi" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/pramodgupta3/"><img src="https://avatars1.githubusercontent.com/u/2184241?v=4?s=100" width="100px;" alt="Pramod Gupta"/><br /><sub><b>Pramod Gupta</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AIAmPramod" title="Reviewed Pull Requests">👀</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/kapinuss"><img src="https://avatars0.githubusercontent.com/u/17639945?v=4?s=100" width="100px;" alt="Stanislav Kapinus"/><br /><sub><b>Stanislav Kapinus</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kapinuss" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://amarnath510.github.io/portfolio"><img src="https://avatars0.githubusercontent.com/u/4599623?v=4?s=100" width="100px;" alt="Amarnath Chandana"/><br /><sub><b>Amarnath Chandana</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Amarnath510" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/gvsharma"><img src="https://avatars1.githubusercontent.com/u/6648152?v=4?s=100" width="100px;" alt="GVSharma"/><br /><sub><b>GVSharma</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=gvsharma" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Anurag870"><img src="https://avatars1.githubusercontent.com/u/6295975?v=4?s=100" width="100px;" alt="Anurag870"/><br /><sub><b>Anurag870</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Anurag870" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=Anurag870" title="Documentation">📖</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="http://theerroris.me"><img src="https://avatars0.githubusercontent.com/u/1685953?v=4?s=100" width="100px;" alt="Wes Gilleland"/><br /><sub><b>Wes Gilleland</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Deathnerd" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/SrdjanPaunovic"><img src="https://avatars1.githubusercontent.com/u/22815104?v=4?s=100" width="100px;" alt="Srđan Paunović"/><br /><sub><b>Srđan Paunović</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=SrdjanPaunovic" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Harshrajsinh"><img src="https://avatars2.githubusercontent.com/u/22811531?v=4?s=100" width="100px;" alt="Harshraj Thakor"/><br /><sub><b>Harshraj Thakor</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Harshrajsinh" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://sideris.xyz/"><img src="https://avatars3.githubusercontent.com/u/5484694?v=4?s=100" width="100px;" alt="Petros G. Sideris"/><br /><sub><b>Petros G. Sideris</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sideris" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MaVdbussche"><img src="https://avatars1.githubusercontent.com/u/26136934?v=4?s=100" width="100px;" alt="Martin Vandenbussche"/><br /><sub><b>Martin Vandenbussche</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MaVdbussche" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/pramodgupta3/"><img src="https://avatars1.githubusercontent.com/u/2184241?v=4?s=100" width="100px;" alt="Pramod Gupta"/><br /><sub><b>Pramod Gupta</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AIAmPramod" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://alexsomai.com"><img src="https://avatars1.githubusercontent.com/u/5720977?v=4?s=100" width="100px;" alt="Alexandru Somai"/><br /><sub><b>Alexandru Somai</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=alexsomai" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://amarnath510.github.io/portfolio"><img src="https://avatars0.githubusercontent.com/u/4599623?v=4?s=100" width="100px;" alt="Amarnath Chandana"/><br /><sub><b>Amarnath Chandana</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Amarnath510" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/amogozov"><img src="https://avatars3.githubusercontent.com/u/7372215?v=4?s=100" width="100px;" alt="Artur Mogozov"/><br /><sub><b>Artur Mogozov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=amogozov" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Anurag870"><img src="https://avatars1.githubusercontent.com/u/6295975?v=4?s=100" width="100px;" alt="Anurag870"/><br /><sub><b>Anurag870</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Anurag870" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=Anurag870" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/anthonycampbell"><img src="https://avatars3.githubusercontent.com/u/10249255?v=4?s=100" width="100px;" alt="anthony"/><br /><sub><b>anthony</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=anthonycampbell" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://theerroris.me"><img src="https://avatars0.githubusercontent.com/u/1685953?v=4?s=100" width="100px;" alt="Wes Gilleland"/><br /><sub><b>Wes Gilleland</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Deathnerd" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://ccygnus.com/"><img src="https://avatars1.githubusercontent.com/u/9342724?v=4?s=100" width="100px;" alt="Christian Cygnus"/><br /><sub><b>Christian Cygnus</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=christophercolumbusdog" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://about.me/dzmitryh"><img src="https://avatars2.githubusercontent.com/u/5390492?v=4?s=100" width="100px;" alt="Dima Gubin"/><br /><sub><b>Dima Gubin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dzmitryh" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Harshrajsinh"><img src="https://avatars2.githubusercontent.com/u/22811531?v=4?s=100" width="100px;" alt="Harshraj Thakor"/><br /><sub><b>Harshraj Thakor</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Harshrajsinh" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jjjimenez100"><img src="https://avatars3.githubusercontent.com/u/22243493?v=4?s=100" width="100px;" alt="Joshua Jimenez"/><br /><sub><b>Joshua Jimenez</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=jjjimenez100" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/MaVdbussche"><img src="https://avatars1.githubusercontent.com/u/26136934?v=4?s=100" width="100px;" alt="Martin Vandenbussche"/><br /><sub><b>Martin Vandenbussche</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MaVdbussche" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://about.me/kaiwinter"><img src="https://avatars0.githubusercontent.com/u/110982?v=4?s=100" width="100px;" alt="Kai Winter"/><br /><sub><b>Kai Winter</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kaiwinter" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://alexsomai.com"><img src="https://avatars1.githubusercontent.com/u/5720977?v=4?s=100" width="100px;" alt="Alexandru Somai"/><br /><sub><b>Alexandru Somai</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=alexsomai" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lbroman"><img src="https://avatars1.githubusercontent.com/u/86007?v=4?s=100" width="100px;" alt="lbroman"/><br /><sub><b>lbroman</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=lbroman" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/amogozov"><img src="https://avatars3.githubusercontent.com/u/7372215?v=4?s=100" width="100px;" alt="Artur Mogozov"/><br /><sub><b>Artur Mogozov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=amogozov" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://przemeknowak.com"><img src="https://avatars1.githubusercontent.com/u/3254609?v=4?s=100" width="100px;" alt="Przemek"/><br /><sub><b>Przemek</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=pnowy" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/anthonycampbell"><img src="https://avatars3.githubusercontent.com/u/10249255?v=4?s=100" width="100px;" alt="anthony"/><br /><sub><b>anthony</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=anthonycampbell" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/prafful1"><img src="https://avatars0.githubusercontent.com/u/14350274?v=4?s=100" width="100px;" alt="Prafful Agarwal"/><br /><sub><b>Prafful Agarwal</b></sub></a><br /><a href="#content-prafful1" title="Content">🖋</a></td> <td align="center" valign="top" width="16.66%"><a href="http://ccygnus.com/"><img src="https://avatars1.githubusercontent.com/u/9342724?v=4?s=100" width="100px;" alt="Christian Cygnus"/><br /><sub><b>Christian Cygnus</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=christophercolumbusdog" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sankypanhale"><img src="https://avatars1.githubusercontent.com/u/6478783?v=4?s=100" width="100px;" alt="Sanket Panhale"/><br /><sub><b>Sanket Panhale</b></sub></a><br /><a href="#content-sankypanhale" title="Content">🖋</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/staillebois"><img src="https://avatars0.githubusercontent.com/u/23701200?v=4?s=100" width="100px;" alt="staillebois"/><br /><sub><b>staillebois</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=staillebois" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://about.me/dzmitryh"><img src="https://avatars2.githubusercontent.com/u/5390492?v=4?s=100" width="100px;" alt="Dima Gubin"/><br /><sub><b>Dima Gubin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dzmitryh" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/valdar-hu"><img src="https://avatars3.githubusercontent.com/u/17962817?v=4?s=100" width="100px;" alt="Krisztián Nagy"/><br /><sub><b>Krisztián Nagy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=valdar-hu" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/jjjimenez100"><img src="https://avatars3.githubusercontent.com/u/22243493?v=4?s=100" width="100px;" alt="Joshua Jimenez"/><br /><sub><b>Joshua Jimenez</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=jjjimenez100" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.vanogrid.com"><img src="https://avatars0.githubusercontent.com/u/4307918?v=4?s=100" width="100px;" alt="Alexander Ivanov"/><br /><sub><b>Alexander Ivanov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vanogrid" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://about.me/kaiwinter"><img src="https://avatars0.githubusercontent.com/u/110982?v=4?s=100" width="100px;" alt="Kai Winter"/><br /><sub><b>Kai Winter</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kaiwinter" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yosfik"><img src="https://avatars3.githubusercontent.com/u/4850270?v=4?s=100" width="100px;" alt="Yosfik Alqadri"/><br /><sub><b>Yosfik Alqadri</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yosfik" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/lbroman"><img src="https://avatars1.githubusercontent.com/u/86007?v=4?s=100" width="100px;" alt="lbroman"/><br /><sub><b>lbroman</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=lbroman" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/7agustibm"><img src="https://avatars0.githubusercontent.com/u/8149332?v=4?s=100" width="100px;" alt="Agustí Becerra Milà"/><br /><sub><b>Agustí Becerra Milà</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=7agustibm" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://przemeknowak.com"><img src="https://avatars1.githubusercontent.com/u/3254609?v=4?s=100" width="100px;" alt="Przemek"/><br /><sub><b>Przemek</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=pnowy" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Juaanma"><img src="https://avatars3.githubusercontent.com/u/7390500?v=4?s=100" width="100px;" alt="Juan Manuel Suárez"/><br /><sub><b>Juan Manuel Suárez</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Juaanma" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/prafful1"><img src="https://avatars0.githubusercontent.com/u/14350274?v=4?s=100" width="100px;" alt="Prafful Agarwal"/><br /><sub><b>Prafful Agarwal</b></sub></a><br /><a href="#content-prafful1" title="Content">🖋</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.devsedge.net/"><img src="https://avatars0.githubusercontent.com/u/9956006?v=4?s=100" width="100px;" alt="Luigi Cortese"/><br /><sub><b>Luigi Cortese</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=LuigiCortese" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Rzeposlaw"><img src="https://avatars2.githubusercontent.com/u/18425745?v=4?s=100" width="100px;" alt="Katarzyna Rzepecka"/><br /><sub><b>Katarzyna Rzepecka</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Rzeposlaw" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/sankypanhale"><img src="https://avatars1.githubusercontent.com/u/6478783?v=4?s=100" width="100px;" alt="Sanket Panhale"/><br /><sub><b>Sanket Panhale</b></sub></a><br /><a href="#content-sankypanhale" title="Content">🖋</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://adamski.pro"><img src="https://avatars1.githubusercontent.com/u/6537430?v=4?s=100" width="100px;" alt="adamski.pro"/><br /><sub><b>adamski.pro</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=akrystian" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/staillebois"><img src="https://avatars0.githubusercontent.com/u/23701200?v=4?s=100" width="100px;" alt="staillebois"/><br /><sub><b>staillebois</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=staillebois" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/baislsl"><img src="https://avatars0.githubusercontent.com/u/17060584?v=4?s=100" width="100px;" alt="Shengli Bai"/><br /><sub><b>Shengli Bai</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=baislsl" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/valdar-hu"><img src="https://avatars3.githubusercontent.com/u/17962817?v=4?s=100" width="100px;" alt="Krisztián Nagy"/><br /><sub><b>Krisztián Nagy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=valdar-hu" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/besok"><img src="https://avatars2.githubusercontent.com/u/29834592?v=4?s=100" width="100px;" alt="Boris"/><br /><sub><b>Boris</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=besok" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.vanogrid.com"><img src="https://avatars0.githubusercontent.com/u/4307918?v=4?s=100" width="100px;" alt="Alexander Ivanov"/><br /><sub><b>Alexander Ivanov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vanogrid" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dmitraver"><img src="https://avatars3.githubusercontent.com/u/1798156?v=4?s=100" width="100px;" alt="Dmitry Avershin"/><br /><sub><b>Dmitry Avershin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dmitraver" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/yosfik"><img src="https://avatars3.githubusercontent.com/u/4850270?v=4?s=100" width="100px;" alt="Yosfik Alqadri"/><br /><sub><b>Yosfik Alqadri</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yosfik" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fanofxiaofeng"><img src="https://avatars0.githubusercontent.com/u/3983683?v=4?s=100" width="100px;" alt="靳阳"/><br /><sub><b>靳阳</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=fanofxiaofeng" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/7agustibm"><img src="https://avatars0.githubusercontent.com/u/8149332?v=4?s=100" width="100px;" alt="Agustí Becerra Milà"/><br /><sub><b>Agustí Becerra Milà</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=7agustibm" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hoangnam2261"><img src="https://avatars2.githubusercontent.com/u/31692990?v=4?s=100" width="100px;" alt="hoangnam2261"/><br /><sub><b>hoangnam2261</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hoangnam2261" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jarpit96"><img src="https://avatars2.githubusercontent.com/u/10098713?v=4?s=100" width="100px;" alt="Arpit Jain"/><br /><sub><b>Arpit Jain</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=jarpit96" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Juaanma"><img src="https://avatars3.githubusercontent.com/u/7390500?v=4?s=100" width="100px;" alt="Juan Manuel Suárez"/><br /><sub><b>Juan Manuel Suárez</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Juaanma" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://joningi.net"><img src="https://avatars2.githubusercontent.com/u/6115148?v=4?s=100" width="100px;" alt="Jón Ingi Sveinbjörnsson"/><br /><sub><b>Jón Ingi Sveinbjörnsson</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=joningiwork" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://www.devsedge.net/"><img src="https://avatars0.githubusercontent.com/u/9956006?v=4?s=100" width="100px;" alt="Luigi Cortese"/><br /><sub><b>Luigi Cortese</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=LuigiCortese" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kirill-vlasov"><img src="https://avatars3.githubusercontent.com/u/16112495?v=4?s=100" width="100px;" alt="Kirill Vlasov"/><br /><sub><b>Kirill Vlasov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kirill-vlasov" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Rzeposlaw"><img src="https://avatars2.githubusercontent.com/u/18425745?v=4?s=100" width="100px;" alt="Katarzyna Rzepecka"/><br /><sub><b>Katarzyna Rzepecka</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Rzeposlaw" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://mitchell-irvin.com"><img src="https://avatars0.githubusercontent.com/u/16233245?v=4?s=100" width="100px;" alt="Mitchell Irvin"/><br /><sub><b>Mitchell Irvin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mitchellirvin" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://adamski.pro"><img src="https://avatars1.githubusercontent.com/u/6537430?v=4?s=100" width="100px;" alt="adamski.pro"/><br /><sub><b>adamski.pro</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=akrystian" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://ranjeet-floyd.github.io"><img src="https://avatars0.githubusercontent.com/u/1992972?v=4?s=100" width="100px;" alt="Ranjeet"/><br /><sub><b>Ranjeet</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ranjeet-floyd" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/baislsl"><img src="https://avatars0.githubusercontent.com/u/17060584?v=4?s=100" width="100px;" alt="Shengli Bai"/><br /><sub><b>Shengli Bai</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=baislsl" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://alwayswithme.github.io"><img src="https://avatars3.githubusercontent.com/u/3234786?v=4?s=100" width="100px;" alt="PhoenixYip"/><br /><sub><b>PhoenixYip</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Alwayswithme" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/besok"><img src="https://avatars2.githubusercontent.com/u/29834592?v=4?s=100" width="100px;" alt="Boris"/><br /><sub><b>Boris</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=besok" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MSaifAsif"><img src="https://avatars1.githubusercontent.com/u/6280554?v=4?s=100" width="100px;" alt="M Saif Asif"/><br /><sub><b>M Saif Asif</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MSaifAsif" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kanwarpreet25"><img src="https://avatars0.githubusercontent.com/u/39183641?v=4?s=100" width="100px;" alt="kanwarpreet25"/><br /><sub><b>kanwarpreet25</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kanwarpreet25" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/dmitraver"><img src="https://avatars3.githubusercontent.com/u/1798156?v=4?s=100" width="100px;" alt="Dmitry Avershin"/><br /><sub><b>Dmitry Avershin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dmitraver" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://leonmak.me"><img src="https://avatars3.githubusercontent.com/u/13071508?v=4?s=100" width="100px;" alt="Leon Mak"/><br /><sub><b>Leon Mak</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=leonmak" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/fanofxiaofeng"><img src="https://avatars0.githubusercontent.com/u/3983683?v=4?s=100" width="100px;" alt="靳阳"/><br /><sub><b>靳阳</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=fanofxiaofeng" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.wramdemark.se"><img src="https://avatars2.githubusercontent.com/u/7052193?v=4?s=100" width="100px;" alt="Per Wramdemark"/><br /><sub><b>Per Wramdemark</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=perwramdemark" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/hoangnam2261"><img src="https://avatars2.githubusercontent.com/u/31692990?v=4?s=100" width="100px;" alt="hoangnam2261"/><br /><sub><b>hoangnam2261</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hoangnam2261" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/waisuan"><img src="https://avatars2.githubusercontent.com/u/10975700?v=4?s=100" width="100px;" alt="Evan Sia Wai Suan"/><br /><sub><b>Evan Sia Wai Suan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=waisuan" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/jarpit96"><img src="https://avatars2.githubusercontent.com/u/10098713?v=4?s=100" width="100px;" alt="Arpit Jain"/><br /><sub><b>Arpit Jain</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=jarpit96" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AnaghaSasikumar"><img src="https://avatars2.githubusercontent.com/u/42939261?v=4?s=100" width="100px;" alt="AnaghaSasikumar"/><br /><sub><b>AnaghaSasikumar</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AnaghaSasikumar" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://joningi.net"><img src="https://avatars2.githubusercontent.com/u/6115148?v=4?s=100" width="100px;" alt="Jón Ingi Sveinbjörnsson"/><br /><sub><b>Jón Ingi Sveinbjörnsson</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=joningiwork" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://christofferh.com"><img src="https://avatars1.githubusercontent.com/u/767643?v=4?s=100" width="100px;" alt="Christoffer Hamberg"/><br /><sub><b>Christoffer Hamberg</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=christofferh" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/kirill-vlasov"><img src="https://avatars3.githubusercontent.com/u/16112495?v=4?s=100" width="100px;" alt="Kirill Vlasov"/><br /><sub><b>Kirill Vlasov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kirill-vlasov" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dgruntz"><img src="https://avatars0.githubusercontent.com/u/1516800?v=4?s=100" width="100px;" alt="Dominik Gruntz"/><br /><sub><b>Dominik Gruntz</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dgruntz" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://bitbucket.org/hannespernpeintner/"><img src="https://avatars3.githubusercontent.com/u/1679437?v=4?s=100" width="100px;" alt="Hannes"/><br /><sub><b>Hannes</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hannespernpeintner" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://mitchell-irvin.com"><img src="https://avatars0.githubusercontent.com/u/16233245?v=4?s=100" width="100px;" alt="Mitchell Irvin"/><br /><sub><b>Mitchell Irvin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mitchellirvin" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/leogtzr"><img src="https://avatars0.githubusercontent.com/u/1211969?v=4?s=100" width="100px;" alt="Leo Gutiérrez Ramírez"/><br /><sub><b>Leo Gutiérrez Ramírez</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=leogtzr" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://ranjeet-floyd.github.io"><img src="https://avatars0.githubusercontent.com/u/1992972?v=4?s=100" width="100px;" alt="Ranjeet"/><br /><sub><b>Ranjeet</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ranjeet-floyd" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/npczwh"><img src="https://avatars0.githubusercontent.com/u/14066422?v=4?s=100" width="100px;" alt="Zhang WH"/><br /><sub><b>Zhang WH</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=npczwh" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://alwayswithme.github.io"><img src="https://avatars3.githubusercontent.com/u/3234786?v=4?s=100" width="100px;" alt="PhoenixYip"/><br /><sub><b>PhoenixYip</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Alwayswithme" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/oconnelc"><img src="https://avatars0.githubusercontent.com/u/1112973?v=4?s=100" width="100px;" alt="Christopher O'Connell"/><br /><sub><b>Christopher O'Connell</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=oconnelc" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/MSaifAsif"><img src="https://avatars1.githubusercontent.com/u/6280554?v=4?s=100" width="100px;" alt="M Saif Asif"/><br /><sub><b>M Saif Asif</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MSaifAsif" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/giorgosmav21"><img src="https://avatars2.githubusercontent.com/u/22855493?v=4?s=100" width="100px;" alt="George Mavroeidis"/><br /><sub><b>George Mavroeidis</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=giorgosmav21" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/kanwarpreet25"><img src="https://avatars0.githubusercontent.com/u/39183641?v=4?s=100" width="100px;" alt="kanwarpreet25"/><br /><sub><b>kanwarpreet25</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kanwarpreet25" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hbothra15"><img src="https://avatars1.githubusercontent.com/u/7418012?v=4?s=100" width="100px;" alt="Hemant Bothra"/><br /><sub><b>Hemant Bothra</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hbothra15" title="Code">💻</a> <a href="#design-hbothra15" title="Design">🎨</a></td> <td align="center" valign="top" width="16.66%"><a href="http://leonmak.me"><img src="https://avatars3.githubusercontent.com/u/13071508?v=4?s=100" width="100px;" alt="Leon Mak"/><br /><sub><b>Leon Mak</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=leonmak" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.kevinpeters.net/about/"><img src="https://avatars1.githubusercontent.com/u/12736734?v=4?s=100" width="100px;" alt="Kevin Peters"/><br /><sub><b>Kevin Peters</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=igeligel" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://llorllale.github.io/"><img src="https://avatars1.githubusercontent.com/u/2019896?v=4?s=100" width="100px;" alt="George Aristy"/><br /><sub><b>George Aristy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=llorllale" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://www.wramdemark.se"><img src="https://avatars2.githubusercontent.com/u/7052193?v=4?s=100" width="100px;" alt="Per Wramdemark"/><br /><sub><b>Per Wramdemark</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=perwramdemark" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mookkiah"><img src="https://avatars1.githubusercontent.com/u/8975264?v=4?s=100" width="100px;" alt="Mahendran Mookkiah"/><br /><sub><b>Mahendran Mookkiah</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mookkiah" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/waisuan"><img src="https://avatars2.githubusercontent.com/u/10975700?v=4?s=100" width="100px;" alt="Evan Sia Wai Suan"/><br /><sub><b>Evan Sia Wai Suan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=waisuan" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Azureyjt"><img src="https://avatars2.githubusercontent.com/u/18476317?v=4?s=100" width="100px;" alt="Azureyjt"/><br /><sub><b>Azureyjt</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Azureyjt" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/AnaghaSasikumar"><img src="https://avatars2.githubusercontent.com/u/42939261?v=4?s=100" width="100px;" alt="AnaghaSasikumar"/><br /><sub><b>AnaghaSasikumar</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AnaghaSasikumar" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vehpsr"><img src="https://avatars2.githubusercontent.com/u/3133265?v=4?s=100" width="100px;" alt="gans"/><br /><sub><b>gans</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vehpsr" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://christofferh.com"><img src="https://avatars1.githubusercontent.com/u/767643?v=4?s=100" width="100px;" alt="Christoffer Hamberg"/><br /><sub><b>Christoffer Hamberg</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=christofferh" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ThatGuyWithTheHat"><img src="https://avatars0.githubusercontent.com/u/24470582?v=4?s=100" width="100px;" alt="Matt"/><br /><sub><b>Matt</b></sub></a><br /><a href="#content-ThatGuyWithTheHat" title="Content">🖋</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/dgruntz"><img src="https://avatars0.githubusercontent.com/u/1516800?v=4?s=100" width="100px;" alt="Dominik Gruntz"/><br /><sub><b>Dominik Gruntz</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dgruntz" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/gopinathlangote/"><img src="https://avatars2.githubusercontent.com/u/10210778?v=4?s=100" width="100px;" alt="Gopinath Langote"/><br /><sub><b>Gopinath Langote</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=gopinath-langote" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://bitbucket.org/hannespernpeintner/"><img src="https://avatars3.githubusercontent.com/u/1679437?v=4?s=100" width="100px;" alt="Hannes"/><br /><sub><b>Hannes</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hannespernpeintner" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hoswey"><img src="https://avatars3.githubusercontent.com/u/3689445?v=4?s=100" width="100px;" alt="Hoswey"/><br /><sub><b>Hoswey</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hoswey" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/amit2103"><img src="https://avatars3.githubusercontent.com/u/7566692?v=4?s=100" width="100px;" alt="Amit Pandey"/><br /><sub><b>Amit Pandey</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=amit2103" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/leogtzr"><img src="https://avatars0.githubusercontent.com/u/1211969?v=4?s=100" width="100px;" alt="Leo Gutiérrez Ramírez"/><br /><sub><b>Leo Gutiérrez Ramírez</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=leogtzr" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gwildor28"><img src="https://avatars0.githubusercontent.com/u/16000365?v=4?s=100" width="100px;" alt="gwildor28"/><br /><sub><b>gwildor28</b></sub></a><br /><a href="#content-gwildor28" title="Content">🖋</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/npczwh"><img src="https://avatars0.githubusercontent.com/u/14066422?v=4?s=100" width="100px;" alt="Zhang WH"/><br /><sub><b>Zhang WH</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=npczwh" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://t.me/paul_docker"><img src="https://avatars1.githubusercontent.com/u/2404785?v=4?s=100" width="100px;" alt="田浩"/><br /><sub><b>田浩</b></sub></a><br /><a href="#content-llitfkitfk" title="Content">🖋</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/oconnelc"><img src="https://avatars0.githubusercontent.com/u/1112973?v=4?s=100" width="100px;" alt="Christopher O'Connell"/><br /><sub><b>Christopher O'Connell</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=oconnelc" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/StPitsios"><img src="https://avatars1.githubusercontent.com/u/6773603?v=4?s=100" width="100px;" alt="Stamatis Pitsios"/><br /><sub><b>Stamatis Pitsios</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=pitsios-s" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/giorgosmav21"><img src="https://avatars2.githubusercontent.com/u/22855493?v=4?s=100" width="100px;" alt="George Mavroeidis"/><br /><sub><b>George Mavroeidis</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=giorgosmav21" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/qza"><img src="https://avatars3.githubusercontent.com/u/233149?v=4?s=100" width="100px;" alt="qza"/><br /><sub><b>qza</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=qza" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/hbothra15"><img src="https://avatars1.githubusercontent.com/u/7418012?v=4?s=100" width="100px;" alt="Hemant Bothra"/><br /><sub><b>Hemant Bothra</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hbothra15" title="Code">💻</a> <a href="#design-hbothra15" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://tschis.github.io"><img src="https://avatars1.githubusercontent.com/u/20662669?v=4?s=100" width="100px;" alt="Rodolfo Forte"/><br /><sub><b>Rodolfo Forte</b></sub></a><br /><a href="#content-Tschis" title="Content">🖋</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.kevinpeters.net/about/"><img src="https://avatars1.githubusercontent.com/u/12736734?v=4?s=100" width="100px;" alt="Kevin Peters"/><br /><sub><b>Kevin Peters</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=igeligel" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ankurkaushal"><img src="https://avatars2.githubusercontent.com/u/2236616?v=4?s=100" width="100px;" alt="Ankur Kaushal"/><br /><sub><b>Ankur Kaushal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ankurkaushal" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/ovidijus-okinskas/"><img src="https://avatars0.githubusercontent.com/u/20372387?v=4?s=100" width="100px;" alt="Ovidijus Okinskas"/><br /><sub><b>Ovidijus Okinskas</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=okinskas" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://llorllale.github.io/"><img src="https://avatars1.githubusercontent.com/u/2019896?v=4?s=100" width="100px;" alt="George Aristy"/><br /><sub><b>George Aristy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=llorllale" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/robertt240"><img src="https://avatars1.githubusercontent.com/u/9137432?v=4?s=100" width="100px;" alt="Robert Kasperczyk"/><br /><sub><b>Robert Kasperczyk</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=robertt240" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/mookkiah"><img src="https://avatars1.githubusercontent.com/u/8975264?v=4?s=100" width="100px;" alt="Mahendran Mookkiah"/><br /><sub><b>Mahendran Mookkiah</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mookkiah" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/trautonen"><img src="https://avatars3.githubusercontent.com/u/1641063?v=4?s=100" width="100px;" alt="Tapio Rautonen"/><br /><sub><b>Tapio Rautonen</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=trautonen" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Azureyjt"><img src="https://avatars2.githubusercontent.com/u/18476317?v=4?s=100" width="100px;" alt="Azureyjt"/><br /><sub><b>Azureyjt</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Azureyjt" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://vk.com/yuri.orlov"><img src="https://avatars0.githubusercontent.com/u/1595733?v=4?s=100" width="100px;" alt="Yuri Orlov"/><br /><sub><b>Yuri Orlov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yorlov" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/vehpsr"><img src="https://avatars2.githubusercontent.com/u/3133265?v=4?s=100" width="100px;" alt="gans"/><br /><sub><b>gans</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vehpsr" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/varunu28/"><img src="https://avatars0.githubusercontent.com/u/7676016?v=4?s=100" width="100px;" alt="Varun Upadhyay"/><br /><sub><b>Varun Upadhyay</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=varunu28" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/ThatGuyWithTheHat"><img src="https://avatars0.githubusercontent.com/u/24470582?v=4?s=100" width="100px;" alt="Matt"/><br /><sub><b>Matt</b></sub></a><br /><a href="#content-ThatGuyWithTheHat" title="Content">🖋</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/PalAditya"><img src="https://avatars2.githubusercontent.com/u/25523604?v=4?s=100" width="100px;" alt="Aditya Pal"/><br /><sub><b>Aditya Pal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=PalAditya" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/gopinathlangote/"><img src="https://avatars2.githubusercontent.com/u/10210778?v=4?s=100" width="100px;" alt="Gopinath Langote"/><br /><sub><b>Gopinath Langote</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=gopinath-langote" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/grzesiekkedzior"><img src="https://avatars3.githubusercontent.com/u/23739158?v=4?s=100" width="100px;" alt="grzesiekkedzior"/><br /><sub><b>grzesiekkedzior</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=grzesiekkedzior" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Agrzesiekkedzior" title="Reviewed Pull Requests">👀</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sivasubramanim"><img src="https://avatars2.githubusercontent.com/u/51107434?v=4?s=100" width="100px;" alt="Sivasubramani M"/><br /><sub><b>Sivasubramani M</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sivasubramanim" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/hoswey"><img src="https://avatars3.githubusercontent.com/u/3689445?v=4?s=100" width="100px;" alt="Hoswey"/><br /><sub><b>Hoswey</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hoswey" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/d4gg4d"><img src="https://avatars2.githubusercontent.com/u/99457?v=4?s=100" width="100px;" alt="Sami Airaksinen"/><br /><sub><b>Sami Airaksinen</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=d4gg4d" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/amit2103"><img src="https://avatars3.githubusercontent.com/u/7566692?v=4?s=100" width="100px;" alt="Amit Pandey"/><br /><sub><b>Amit Pandey</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=amit2103" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vertti"><img src="https://avatars0.githubusercontent.com/u/557751?v=4?s=100" width="100px;" alt="Janne Sinivirta"/><br /><sub><b>Janne Sinivirta</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vertti" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/gwildor28"><img src="https://avatars0.githubusercontent.com/u/16000365?v=4?s=100" width="100px;" alt="gwildor28"/><br /><sub><b>gwildor28</b></sub></a><br /><a href="#content-gwildor28" title="Content">🖋</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Bobo1239"><img src="https://avatars1.githubusercontent.com/u/2302947?v=4?s=100" width="100px;" alt="Boris-Chengbiao Zhou"/><br /><sub><b>Boris-Chengbiao Zhou</b></sub></a><br /><a href="#content-Bobo1239" title="Content">🖋</a></td> <td align="center" valign="top" width="16.66%"><a href="https://t.me/paul_docker"><img src="https://avatars1.githubusercontent.com/u/2404785?v=4?s=100" width="100px;" alt="田浩"/><br /><sub><b>田浩</b></sub></a><br /><a href="#content-llitfkitfk" title="Content">🖋</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://jahhein.github.io"><img src="https://avatars2.githubusercontent.com/u/10779515?v=4?s=100" width="100px;" alt="Jacob Hein"/><br /><sub><b>Jacob Hein</b></sub></a><br /><a href="#content-Jahhein" title="Content">🖋</a></td> <td align="center" valign="top" width="16.66%"><a href="https://twitter.com/StPitsios"><img src="https://avatars1.githubusercontent.com/u/6773603?v=4?s=100" width="100px;" alt="Stamatis Pitsios"/><br /><sub><b>Stamatis Pitsios</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=pitsios-s" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/iamrichardjones"><img src="https://avatars3.githubusercontent.com/u/14842151?v=4?s=100" width="100px;" alt="Richard Jones"/><br /><sub><b>Richard Jones</b></sub></a><br /><a href="#content-iamrichardjones" title="Content">🖋</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/qza"><img src="https://avatars3.githubusercontent.com/u/233149?v=4?s=100" width="100px;" alt="qza"/><br /><sub><b>qza</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=qza" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://rachelcarmena.github.io"><img src="https://avatars0.githubusercontent.com/u/22792183?v=4?s=100" width="100px;" alt="Rachel M. Carmena"/><br /><sub><b>Rachel M. Carmena</b></sub></a><br /><a href="#content-rachelcarmena" title="Content">🖋</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://zd-zero.github.io"><img src="https://avatars0.githubusercontent.com/u/21978370?v=4?s=100" width="100px;" alt="Zaerald Denze Lungos"/><br /><sub><b>Zaerald Denze Lungos</b></sub></a><br /><a href="#content-zd-zero" title="Content">🖋</a></td> <td align="center" valign="top" width="16.66%"><a href="http://tschis.github.io"><img src="https://avatars1.githubusercontent.com/u/20662669?v=4?s=100" width="100px;" alt="Rodolfo Forte"/><br /><sub><b>Rodolfo Forte</b></sub></a><br /><a href="#content-Tschis" title="Content">🖋</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://webpro.nl"><img src="https://avatars1.githubusercontent.com/u/456426?v=4?s=100" width="100px;" alt="Lars Kappert"/><br /><sub><b>Lars Kappert</b></sub></a><br /><a href="#content-webpro" title="Content">🖋</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/ankurkaushal"><img src="https://avatars2.githubusercontent.com/u/2236616?v=4?s=100" width="100px;" alt="Ankur Kaushal"/><br /><sub><b>Ankur Kaushal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ankurkaushal" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://xiaod.info"><img src="https://avatars2.githubusercontent.com/u/21277644?v=4?s=100" width="100px;" alt="Mike Liu"/><br /><sub><b>Mike Liu</b></sub></a><br /><a href="#translation-xiaod-dev" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/ovidijus-okinskas/"><img src="https://avatars0.githubusercontent.com/u/20372387?v=4?s=100" width="100px;" alt="Ovidijus Okinskas"/><br /><sub><b>Ovidijus Okinskas</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=okinskas" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/charlesfinley"><img src="https://avatars1.githubusercontent.com/u/6307904?v=4?s=100" width="100px;" alt="Matt Dolan"/><br /><sub><b>Matt Dolan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=charlesfinley" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Acharlesfinley" title="Reviewed Pull Requests">👀</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/robertt240"><img src="https://avatars1.githubusercontent.com/u/9137432?v=4?s=100" width="100px;" alt="Robert Kasperczyk"/><br /><sub><b>Robert Kasperczyk</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=robertt240" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MananS77"><img src="https://avatars3.githubusercontent.com/u/21033516?v=4?s=100" width="100px;" alt="Manan"/><br /><sub><b>Manan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AMananS77" title="Reviewed Pull Requests">👀</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/trautonen"><img src="https://avatars3.githubusercontent.com/u/1641063?v=4?s=100" width="100px;" alt="Tapio Rautonen"/><br /><sub><b>Tapio Rautonen</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=trautonen" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nishant"><img src="https://avatars2.githubusercontent.com/u/15331971?v=4?s=100" width="100px;" alt="Nishant Arora"/><br /><sub><b>Nishant Arora</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nishant" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://vk.com/yuri.orlov"><img src="https://avatars0.githubusercontent.com/u/1595733?v=4?s=100" width="100px;" alt="Yuri Orlov"/><br /><sub><b>Yuri Orlov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yorlov" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/raja-peeyush-kumar-singh"><img src="https://avatars0.githubusercontent.com/u/5496024?v=4?s=100" width="100px;" alt="Peeyush"/><br /><sub><b>Peeyush</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=raja-peeyush-kumar-singh" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ravening"><img src="https://avatars1.githubusercontent.com/u/10645273?v=4?s=100" width="100px;" alt="Rakesh"/><br /><sub><b>Rakesh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ravening" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aravening" title="Reviewed Pull Requests">👀</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/varunu28/"><img src="https://avatars0.githubusercontent.com/u/7676016?v=4?s=100" width="100px;" alt="Varun Upadhyay"/><br /><sub><b>Varun Upadhyay</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=varunu28" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vINCENT8888801"><img src="https://avatars0.githubusercontent.com/u/8037883?v=4?s=100" width="100px;" alt="Wei Seng"/><br /><sub><b>Wei Seng</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vINCENT8888801" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/PalAditya"><img src="https://avatars2.githubusercontent.com/u/25523604?v=4?s=100" width="100px;" alt="Aditya Pal"/><br /><sub><b>Aditya Pal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=PalAditya" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/ashish-trivedi-218379135/"><img src="https://avatars3.githubusercontent.com/u/23194128?v=4?s=100" width="100px;" alt="Ashish Trivedi"/><br /><sub><b>Ashish Trivedi</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ashishtrivedi16" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/grzesiekkedzior"><img src="https://avatars3.githubusercontent.com/u/23739158?v=4?s=100" width="100px;" alt="grzesiekkedzior"/><br /><sub><b>grzesiekkedzior</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=grzesiekkedzior" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Agrzesiekkedzior" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://rayyounghong.com"><img src="https://avatars1.githubusercontent.com/u/41055099?v=4?s=100" width="100px;" alt="洪月阳"/><br /><sub><b>洪月阳</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=RayYH" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/sivasubramanim"><img src="https://avatars2.githubusercontent.com/u/51107434?v=4?s=100" width="100px;" alt="Sivasubramani M"/><br /><sub><b>Sivasubramani M</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sivasubramanim" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://xdvrx1.github.io/"><img src="https://avatars0.githubusercontent.com/u/47092464?v=4?s=100" width="100px;" alt="xdvrx1"/><br /><sub><b>xdvrx1</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Axdvrx1" title="Reviewed Pull Requests">👀</a> <a href="#ideas-xdvrx1" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/d4gg4d"><img src="https://avatars2.githubusercontent.com/u/99457?v=4?s=100" width="100px;" alt="Sami Airaksinen"/><br /><sub><b>Sami Airaksinen</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=d4gg4d" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nahteb"><img src="https://avatars3.githubusercontent.com/u/13121570?v=4?s=100" width="100px;" alt="Bethan Palmer"/><br /><sub><b>Bethan Palmer</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nahteb" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/vertti"><img src="https://avatars0.githubusercontent.com/u/557751?v=4?s=100" width="100px;" alt="Janne Sinivirta"/><br /><sub><b>Janne Sinivirta</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vertti" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ToxicDreamz"><img src="https://avatars0.githubusercontent.com/u/45225562?v=4?s=100" width="100px;" alt="Toxic Dreamz"/><br /><sub><b>Toxic Dreamz</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ToxicDreamz" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="http://www.edycutjong.com"><img src="https://avatars1.githubusercontent.com/u/1098102?v=4?s=100" width="100px;" alt="Edy Cu Tjong"/><br /><sub><b>Edy Cu Tjong</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=edycutjong" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Bobo1239"><img src="https://avatars1.githubusercontent.com/u/2302947?v=4?s=100" width="100px;" alt="Boris-Chengbiao Zhou"/><br /><sub><b>Boris-Chengbiao Zhou</b></sub></a><br /><a href="#content-Bobo1239" title="Content">🖋</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mkrzywanski"><img src="https://avatars0.githubusercontent.com/u/15279585?v=4?s=100" width="100px;" alt="Michał Krzywański"/><br /><sub><b>Michał Krzywański</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mkrzywanski" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://jahhein.github.io"><img src="https://avatars2.githubusercontent.com/u/10779515?v=4?s=100" width="100px;" alt="Jacob Hein"/><br /><sub><b>Jacob Hein</b></sub></a><br /><a href="#content-Jahhein" title="Content">🖋</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.stefan-birkner.de"><img src="https://avatars1.githubusercontent.com/u/711349?v=4?s=100" width="100px;" alt="Stefan Birkner"/><br /><sub><b>Stefan Birkner</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=stefanbirkner" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/iamrichardjones"><img src="https://avatars3.githubusercontent.com/u/14842151?v=4?s=100" width="100px;" alt="Richard Jones"/><br /><sub><b>Richard Jones</b></sub></a><br /><a href="#content-iamrichardjones" title="Content">🖋</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fedorskvorcov"><img src="https://avatars3.githubusercontent.com/u/43882212?v=4?s=100" width="100px;" alt="Fedor Skvorcov"/><br /><sub><b>Fedor Skvorcov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=fedorskvorcov" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://rachelcarmena.github.io"><img src="https://avatars0.githubusercontent.com/u/22792183?v=4?s=100" width="100px;" alt="Rachel M. Carmena"/><br /><sub><b>Rachel M. Carmena</b></sub></a><br /><a href="#content-rachelcarmena" title="Content">🖋</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/samilAyoub"><img src="https://avatars0.githubusercontent.com/u/61546990?v=4?s=100" width="100px;" alt="samilAyoub"/><br /><sub><b>samilAyoub</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=samilAyoub" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://zd-zero.github.io"><img src="https://avatars0.githubusercontent.com/u/21978370?v=4?s=100" width="100px;" alt="Zaerald Denze Lungos"/><br /><sub><b>Zaerald Denze Lungos</b></sub></a><br /><a href="#content-zd-zero" title="Content">🖋</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vdlald"><img src="https://avatars0.githubusercontent.com/u/29997701?v=4?s=100" width="100px;" alt="Vladislav Golubinov"/><br /><sub><b>Vladislav Golubinov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vdlald" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://webpro.nl"><img src="https://avatars1.githubusercontent.com/u/456426?v=4?s=100" width="100px;" alt="Lars Kappert"/><br /><sub><b>Lars Kappert</b></sub></a><br /><a href="#content-webpro" title="Content">🖋</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/swarajsaaj"><img src="https://avatars2.githubusercontent.com/u/6285049?v=4?s=100" width="100px;" alt="Swaraj"/><br /><sub><b>Swaraj</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=swarajsaaj" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="http://christophflick.de"><img src="https://avatars0.githubusercontent.com/u/4465376?v=4?s=100" width="100px;" alt="Christoph Flick"/><br /><sub><b>Christoph Flick</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ChFlick" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://xiaod.info"><img src="https://avatars2.githubusercontent.com/u/21277644?v=4?s=100" width="100px;" alt="Mike Liu"/><br /><sub><b>Mike Liu</b></sub></a><br /><a href="#translation-xiaod-dev" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Ascenio"><img src="https://avatars1.githubusercontent.com/u/7662016?v=4?s=100" width="100px;" alt="Ascênio"/><br /><sub><b>Ascênio</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AAscenio" title="Reviewed Pull Requests">👀</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/charlesfinley"><img src="https://avatars1.githubusercontent.com/u/6307904?v=4?s=100" width="100px;" alt="Matt Dolan"/><br /><sub><b>Matt Dolan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=charlesfinley" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Acharlesfinley" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/domenico-sibilio/"><img src="https://avatars2.githubusercontent.com/u/24280982?v=4?s=100" width="100px;" alt="Domenico Sibilio"/><br /><sub><b>Domenico Sibilio</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dsibilio" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/MananS77"><img src="https://avatars3.githubusercontent.com/u/21033516?v=4?s=100" width="100px;" alt="Manan"/><br /><sub><b>Manan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AMananS77" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/akashchandwani"><img src="https://avatars2.githubusercontent.com/u/3483277?v=4?s=100" width="100px;" alt="Akash Chandwani"/><br /><sub><b>Akash Chandwani</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aakashchandwani" title="Reviewed Pull Requests">👀</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/nishant"><img src="https://avatars2.githubusercontent.com/u/15331971?v=4?s=100" width="100px;" alt="Nishant Arora"/><br /><sub><b>Nishant Arora</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nishant" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.linkedin.com/in/manannikov"><img src="https://avatars2.githubusercontent.com/u/7019769?v=4?s=100" width="100px;" alt="Pavlo Manannikov"/><br /><sub><b>Pavlo Manannikov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=manannikov" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/raja-peeyush-kumar-singh"><img src="https://avatars0.githubusercontent.com/u/5496024?v=4?s=100" width="100px;" alt="Peeyush"/><br /><sub><b>Peeyush</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=raja-peeyush-kumar-singh" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/eimanip"><img src="https://avatars0.githubusercontent.com/u/20307301?v=4?s=100" width="100px;" alt="Eiman"/><br /><sub><b>Eiman</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=eimanip" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/ravening"><img src="https://avatars1.githubusercontent.com/u/10645273?v=4?s=100" width="100px;" alt="Rakesh"/><br /><sub><b>Rakesh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ravening" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aravening" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/OrangePants-R"><img src="https://avatars0.githubusercontent.com/u/42976136?v=4?s=100" width="100px;" alt="Rocky"/><br /><sub><b>Rocky</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=OrangePants-R" title="Documentation">📖</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://ibrahimalii.github.io/"><img src="https://avatars2.githubusercontent.com/u/21141301?v=4?s=100" width="100px;" alt="Ibrahim ali abdelghany"/><br /><sub><b>Ibrahim ali abdelghany</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AibrahimAlii" title="Reviewed Pull Requests">👀</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/vINCENT8888801"><img src="https://avatars0.githubusercontent.com/u/8037883?v=4?s=100" width="100px;" alt="Wei Seng"/><br /><sub><b>Wei Seng</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vINCENT8888801" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gkulkarni2020"><img src="https://avatars3.githubusercontent.com/u/5161548?v=4?s=100" width="100px;" alt="Girish Kulkarni"/><br /><sub><b>Girish Kulkarni</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=gkulkarni2020" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/ashish-trivedi-218379135/"><img src="https://avatars3.githubusercontent.com/u/23194128?v=4?s=100" width="100px;" alt="Ashish Trivedi"/><br /><sub><b>Ashish Trivedi</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ashishtrivedi16" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/omk13"><img src="https://avatars0.githubusercontent.com/u/59054172?v=4?s=100" width="100px;" alt="Omar Karazoun"/><br /><sub><b>Omar Karazoun</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=omk13" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://rayyounghong.com"><img src="https://avatars1.githubusercontent.com/u/41055099?v=4?s=100" width="100px;" alt="洪月阳"/><br /><sub><b>洪月阳</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=RayYH" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jeff303"><img src="https://avatars0.githubusercontent.com/u/3521562?v=4?s=100" width="100px;" alt="Jeff Evans"/><br /><sub><b>Jeff Evans</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=jeff303" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://xdvrx1.github.io/"><img src="https://avatars0.githubusercontent.com/u/47092464?v=4?s=100" width="100px;" alt="xdvrx1"/><br /><sub><b>xdvrx1</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Axdvrx1" title="Reviewed Pull Requests">👀</a> <a href="#ideas-xdvrx1" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://viveksb007.github.io"><img src="https://avatars1.githubusercontent.com/u/12713808?v=4?s=100" width="100px;" alt="Vivek Singh"/><br /><sub><b>Vivek Singh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=viveksb007" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/nahteb"><img src="https://avatars3.githubusercontent.com/u/13121570?v=4?s=100" width="100px;" alt="Bethan Palmer"/><br /><sub><b>Bethan Palmer</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nahteb" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/siavashsoleymani"><img src="https://avatars2.githubusercontent.com/u/18074419?v=4?s=100" width="100px;" alt="siavash"/><br /><sub><b>siavash</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=siavashsoleymani" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/ToxicDreamz"><img src="https://avatars0.githubusercontent.com/u/45225562?v=4?s=100" width="100px;" alt="Toxic Dreamz"/><br /><sub><b>Toxic Dreamz</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ToxicDreamz" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ruchpeanuts"><img src="https://avatars0.githubusercontent.com/u/29301900?v=4?s=100" width="100px;" alt="ruchpeanuts"/><br /><sub><b>ruchpeanuts</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ruchpeanuts" title="Documentation">📖</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/warp125"><img src="https://avatars1.githubusercontent.com/u/48073115?v=4?s=100" width="100px;" alt="warp125"/><br /><sub><b>warp125</b></sub></a><br /><a href="#translation-warp125" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="http://www.edycutjong.com"><img src="https://avatars1.githubusercontent.com/u/1098102?v=4?s=100" width="100px;" alt="Edy Cu Tjong"/><br /><sub><b>Edy Cu Tjong</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=edycutjong" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://libkhadir.fr"><img src="https://avatars1.githubusercontent.com/u/45130488?v=4?s=100" width="100px;" alt="KHADIR Tayeb"/><br /><sub><b>KHADIR Tayeb</b></sub></a><br /><a href="#translation-tkhadir" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/mkrzywanski"><img src="https://avatars0.githubusercontent.com/u/15279585?v=4?s=100" width="100px;" alt="Michał Krzywański"/><br /><sub><b>Michał Krzywański</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mkrzywanski" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ignite1771"><img src="https://avatars2.githubusercontent.com/u/59446563?v=4?s=100" width="100px;" alt="ignite1771"/><br /><sub><b>ignite1771</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ignite1771" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.stefan-birkner.de"><img src="https://avatars1.githubusercontent.com/u/711349?v=4?s=100" width="100px;" alt="Stefan Birkner"/><br /><sub><b>Stefan Birkner</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=stefanbirkner" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/demirhalil"><img src="https://avatars1.githubusercontent.com/u/22895118?v=4?s=100" width="100px;" alt="Halil Demir"/><br /><sub><b>Halil Demir</b></sub></a><br /><a href="#translation-demirhalil" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/fedorskvorcov"><img src="https://avatars3.githubusercontent.com/u/43882212?v=4?s=100" width="100px;" alt="Fedor Skvorcov"/><br /><sub><b>Fedor Skvorcov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=fedorskvorcov" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/rohit10000"><img src="https://avatars.githubusercontent.com/u/20845565?v=4?s=100" width="100px;" alt="Rohit Singh"/><br /><sub><b>Rohit Singh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=rohit10000" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/samilAyoub"><img src="https://avatars0.githubusercontent.com/u/61546990?v=4?s=100" width="100px;" alt="samilAyoub"/><br /><sub><b>samilAyoub</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=samilAyoub" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/byoungju94"><img src="https://avatars.githubusercontent.com/u/42516378?v=4?s=100" width="100px;" alt="byoungju94"/><br /><sub><b>byoungju94</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=byoungju94" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/vdlald"><img src="https://avatars0.githubusercontent.com/u/29997701?v=4?s=100" width="100px;" alt="Vladislav Golubinov"/><br /><sub><b>Vladislav Golubinov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vdlald" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/moustafafarhat"><img src="https://avatars.githubusercontent.com/u/38836727?v=4?s=100" width="100px;" alt="Moustafa Farhat"/><br /><sub><b>Moustafa Farhat</b></sub></a><br /><a href="#translation-moustafafarhat" title="Translation">🌍</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/richardmr36"><img src="https://avatars.githubusercontent.com/u/19147333?v=4?s=100" width="100px;" alt="Martel Richard"/><br /><sub><b>Martel Richard</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=richardmr36" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/swarajsaaj"><img src="https://avatars2.githubusercontent.com/u/6285049?v=4?s=100" width="100px;" alt="Swaraj"/><br /><sub><b>Swaraj</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=swarajsaaj" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/va1m"><img src="https://avatars.githubusercontent.com/u/17025445?v=4?s=100" width="100px;" alt="va1m"/><br /><sub><b>va1m</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=va1m" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://christophflick.de"><img src="https://avatars0.githubusercontent.com/u/4465376?v=4?s=100" width="100px;" alt="Christoph Flick"/><br /><sub><b>Christoph Flick</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ChFlick" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/noamgrinch"><img src="https://avatars.githubusercontent.com/u/31648669?v=4?s=100" width="100px;" alt="Noam Greenshtain"/><br /><sub><b>Noam Greenshtain</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=noamgrinch" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Ascenio"><img src="https://avatars1.githubusercontent.com/u/7662016?v=4?s=100" width="100px;" alt="Ascênio"/><br /><sub><b>Ascênio</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AAscenio" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://xuyonghong.cn/"><img src="https://avatars.githubusercontent.com/u/14086462?v=4?s=100" width="100px;" alt="yonghong Xu"/><br /><sub><b>yonghong Xu</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=qfxl" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/domenico-sibilio/"><img src="https://avatars2.githubusercontent.com/u/24280982?v=4?s=100" width="100px;" alt="Domenico Sibilio"/><br /><sub><b>Domenico Sibilio</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dsibilio" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/jinisha-vora"><img src="https://avatars.githubusercontent.com/u/40777762?v=4?s=100" width="100px;" alt="jinishavora"/><br /><sub><b>jinishavora</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Ajinishavora" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=jinishavora" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/akashchandwani"><img src="https://avatars2.githubusercontent.com/u/3483277?v=4?s=100" width="100px;" alt="Akash Chandwani"/><br /><sub><b>Akash Chandwani</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aakashchandwani" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/eas5"><img src="https://avatars.githubusercontent.com/u/50836521?v=4?s=100" width="100px;" alt="Elvys Soares"/><br /><sub><b>Elvys Soares</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=eas5" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://www.linkedin.com/in/manannikov"><img src="https://avatars2.githubusercontent.com/u/7019769?v=4?s=100" width="100px;" alt="Pavlo Manannikov"/><br /><sub><b>Pavlo Manannikov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=manannikov" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zWeBrain"><img src="https://avatars.githubusercontent.com/u/46642512?v=4?s=100" width="100px;" alt="zWeBrain"/><br /><sub><b>zWeBrain</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=zWeBrain" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://al-assad.github.io/notion/"><img src="https://avatars.githubusercontent.com/u/22493821?v=4?s=100" width="100px;" alt="余林颖"/><br /><sub><b>余林颖</b></sub></a><br /><a href="#translation-Al-assad" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/eimanip"><img src="https://avatars0.githubusercontent.com/u/20307301?v=4?s=100" width="100px;" alt="Eiman"/><br /><sub><b>Eiman</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=eimanip" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/STudio26"><img src="https://avatars.githubusercontent.com/u/6988911?v=4?s=100" width="100px;" alt="Alain"/><br /><sub><b>Alain</b></sub></a><br /><a href="#translation-STudio26" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/OrangePants-R"><img src="https://avatars0.githubusercontent.com/u/42976136?v=4?s=100" width="100px;" alt="Rocky"/><br /><sub><b>Rocky</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=OrangePants-R" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DEV-VRUPER"><img src="https://avatars.githubusercontent.com/u/30525467?v=4?s=100" width="100px;" alt="VR"/><br /><sub><b>VR</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=DEV-VRUPER" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://ibrahimalii.github.io/"><img src="https://avatars2.githubusercontent.com/u/21141301?v=4?s=100" width="100px;" alt="Ibrahim ali abdelghany"/><br /><sub><b>Ibrahim ali abdelghany</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AibrahimAlii" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JackieNim"><img src="https://avatars.githubusercontent.com/u/4138836?v=4?s=100" width="100px;" alt="JackieNim"/><br /><sub><b>JackieNim</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JackieNim" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/gkulkarni2020"><img src="https://avatars3.githubusercontent.com/u/5161548?v=4?s=100" width="100px;" alt="Girish Kulkarni"/><br /><sub><b>Girish Kulkarni</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=gkulkarni2020" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/EdisonE3"><img src="https://avatars.githubusercontent.com/u/52118917?v=4?s=100" width="100px;" alt="EdisonE3"/><br /><sub><b>EdisonE3</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=EdisonE3" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/omk13"><img src="https://avatars0.githubusercontent.com/u/59054172?v=4?s=100" width="100px;" alt="Omar Karazoun"/><br /><sub><b>Omar Karazoun</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=omk13" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/tao-sun2"><img src="https://avatars.githubusercontent.com/u/66189688?v=4?s=100" width="100px;" alt="Tao"/><br /><sub><b>Tao</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=tao-sun2" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/jeff303"><img src="https://avatars0.githubusercontent.com/u/3521562?v=4?s=100" width="100px;" alt="Jeff Evans"/><br /><sub><b>Jeff Evans</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=jeff303" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JuanManuelAbate"><img src="https://avatars.githubusercontent.com/u/16357060?v=4?s=100" width="100px;" alt="Juan Manuel Abate"/><br /><sub><b>Juan Manuel Abate</b></sub></a><br /><a href="#translation-JuanManuelAbate" title="Translation">🌍</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Xenilo137"><img src="https://avatars.githubusercontent.com/u/24865069?v=4?s=100" width="100px;" alt="Xenilo137"/><br /><sub><b>Xenilo137</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Xenilo137" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://viveksb007.github.io"><img src="https://avatars1.githubusercontent.com/u/12713808?v=4?s=100" width="100px;" alt="Vivek Singh"/><br /><sub><b>Vivek Singh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=viveksb007" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/souzasamuel/"><img src="https://avatars.githubusercontent.com/u/17254162?v=4?s=100" width="100px;" alt="Samuel Souza"/><br /><sub><b>Samuel Souza</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=samuelpsouza" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/siavashsoleymani"><img src="https://avatars2.githubusercontent.com/u/18074419?v=4?s=100" width="100px;" alt="siavash"/><br /><sub><b>siavash</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=siavashsoleymani" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marlo2222"><img src="https://avatars.githubusercontent.com/u/40809563?v=4?s=100" width="100px;" alt="Marlo Henrique"/><br /><sub><b>Marlo Henrique</b></sub></a><br /><a href="#translation-marlo2222" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/ruchpeanuts"><img src="https://avatars0.githubusercontent.com/u/29301900?v=4?s=100" width="100px;" alt="ruchpeanuts"/><br /><sub><b>ruchpeanuts</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ruchpeanuts" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AndriyPyzh"><img src="https://avatars.githubusercontent.com/u/57706635?v=4?s=100" width="100px;" alt="AndriyPyzh"/><br /><sub><b>AndriyPyzh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AndriyPyzh" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/warp125"><img src="https://avatars1.githubusercontent.com/u/48073115?v=4?s=100" width="100px;" alt="warp125"/><br /><sub><b>warp125</b></sub></a><br /><a href="#translation-warp125" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/karthikbhat13"><img src="https://avatars.githubusercontent.com/u/22431014?v=4?s=100" width="100px;" alt="karthikbhat13"/><br /><sub><b>karthikbhat13</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=karthikbhat13" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://libkhadir.fr"><img src="https://avatars1.githubusercontent.com/u/45130488?v=4?s=100" width="100px;" alt="KHADIR Tayeb"/><br /><sub><b>KHADIR Tayeb</b></sub></a><br /><a href="#translation-tkhadir" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mortezaadi"><img src="https://avatars.githubusercontent.com/u/1329687?v=4?s=100" width="100px;" alt="Morteza Adigozalpour"/><br /><sub><b>Morteza Adigozalpour</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mortezaadi" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/ignite1771"><img src="https://avatars2.githubusercontent.com/u/59446563?v=4?s=100" width="100px;" alt="ignite1771"/><br /><sub><b>ignite1771</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ignite1771" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://stackoverflow.com/users/308565/nagaraj-tantri"><img src="https://avatars.githubusercontent.com/u/3784194?v=4?s=100" width="100px;" alt="Nagaraj Tantri"/><br /><sub><b>Nagaraj Tantri</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=tan31989" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/frascu"><img src="https://avatars.githubusercontent.com/u/7107651?v=4?s=100" width="100px;" alt="Francesco Scuccimarri"/><br /><sub><b>Francesco Scuccimarri</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=frascu" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/demirhalil"><img src="https://avatars1.githubusercontent.com/u/22895118?v=4?s=100" width="100px;" alt="Halil Demir"/><br /><sub><b>Halil Demir</b></sub></a><br /><a href="#translation-demirhalil" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Conhan93"><img src="https://avatars.githubusercontent.com/u/71334757?v=4?s=100" width="100px;" alt="Conny Hansson"/><br /><sub><b>Conny Hansson</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Conhan93" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/rohit10000"><img src="https://avatars.githubusercontent.com/u/20845565?v=4?s=100" width="100px;" alt="Rohit Singh"/><br /><sub><b>Rohit Singh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=rohit10000" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://muklasr.medium.com"><img src="https://avatars.githubusercontent.com/u/43443753?v=4?s=100" width="100px;" alt="Muklas Rahmanto"/><br /><sub><b>Muklas Rahmanto</b></sub></a><br /><a href="#translation-muklasr" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/byoungju94"><img src="https://avatars.githubusercontent.com/u/42516378?v=4?s=100" width="100px;" alt="byoungju94"/><br /><sub><b>byoungju94</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=byoungju94" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/VxDxK"><img src="https://avatars.githubusercontent.com/u/38704817?v=4?s=100" width="100px;" alt="Vadim"/><br /><sub><b>Vadim</b></sub></a><br /><a href="#translation-VxDxK" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/moustafafarhat"><img src="https://avatars.githubusercontent.com/u/38836727?v=4?s=100" width="100px;" alt="Moustafa Farhat"/><br /><sub><b>Moustafa Farhat</b></sub></a><br /><a href="#translation-moustafafarhat" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sims-keshri"><img src="https://avatars.githubusercontent.com/u/62168475?v=4?s=100" width="100px;" alt="Simran Keshri"/><br /><sub><b>Simran Keshri</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sims-keshri" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/richardmr36"><img src="https://avatars.githubusercontent.com/u/19147333?v=4?s=100" width="100px;" alt="Martel Richard"/><br /><sub><b>Martel Richard</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=richardmr36" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://programacionymas.com"><img src="https://avatars.githubusercontent.com/u/3101238?v=4?s=100" width="100px;" alt="JCarlos"/><br /><sub><b>JCarlos</b></sub></a><br /><a href="#translation-JCarlosR" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/va1m"><img src="https://avatars.githubusercontent.com/u/17025445?v=4?s=100" width="100px;" alt="va1m"/><br /><sub><b>va1m</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=va1m" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.mrmoshkel.ir"><img src="https://avatars.githubusercontent.com/u/60359433?v=4?s=100" width="100px;" alt="Ali Ghasemi"/><br /><sub><b>Ali Ghasemi</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Dev-AliGhasemi" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="http://carlfx.wordpress.com"><img src="https://avatars.githubusercontent.com/u/1594624?v=4?s=100" width="100px;" alt="Carl Dea"/><br /><sub><b>Carl Dea</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=carldea" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/noamgrinch"><img src="https://avatars.githubusercontent.com/u/31648669?v=4?s=100" width="100px;" alt="Noam Greenshtain"/><br /><sub><b>Noam Greenshtain</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=noamgrinch" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Mozartuss"><img src="https://avatars.githubusercontent.com/u/32893711?v=4?s=100" width="100px;" alt="Mozartus"/><br /><sub><b>Mozartus</b></sub></a><br /><a href="#translation-Mozartuss" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://xuyonghong.cn/"><img src="https://avatars.githubusercontent.com/u/14086462?v=4?s=100" width="100px;" alt="yonghong Xu"/><br /><sub><b>yonghong Xu</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=qfxl" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ManviGoel26"><img src="https://avatars.githubusercontent.com/u/55682355?v=4?s=100" width="100px;" alt="Manvi Goel"/><br /><sub><b>Manvi Goel</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ManviGoel26" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/jinisha-vora"><img src="https://avatars.githubusercontent.com/u/40777762?v=4?s=100" width="100px;" alt="jinishavora"/><br /><sub><b>jinishavora</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Ajinishavora" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=jinishavora" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/blueberry404"><img src="https://avatars.githubusercontent.com/u/39243539?v=4?s=100" width="100px;" alt="Anum Amin"/><br /><sub><b>Anum Amin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=blueberry404" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/eas5"><img src="https://avatars.githubusercontent.com/u/50836521?v=4?s=100" width="100px;" alt="Elvys Soares"/><br /><sub><b>Elvys Soares</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=eas5" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://uh-zz.github.io/blog/"><img src="https://avatars.githubusercontent.com/u/47747828?v=4?s=100" width="100px;" alt="Reo Uehara"/><br /><sub><b>Reo Uehara</b></sub></a><br /><a href="#translation-uh-zz" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/zWeBrain"><img src="https://avatars.githubusercontent.com/u/46642512?v=4?s=100" width="100px;" alt="zWeBrain"/><br /><sub><b>zWeBrain</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=zWeBrain" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fiordy"><img src="https://avatars.githubusercontent.com/u/53420573?v=4?s=100" width="100px;" alt="Fiordy"/><br /><sub><b>Fiordy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Fiordy" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://al-assad.github.io/notion/"><img src="https://avatars.githubusercontent.com/u/22493821?v=4?s=100" width="100px;" alt="余林颖"/><br /><sub><b>余林颖</b></sub></a><br /><a href="#translation-Al-assad" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harshalkh"><img src="https://avatars.githubusercontent.com/u/37841724?v=4?s=100" width="100px;" alt="Harshal"/><br /><sub><b>Harshal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=harshalkh" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/abhinav-vashisth-06613b208/"><img src="https://avatars.githubusercontent.com/u/89785800?v=4?s=100" width="100px;" alt="Abhinav Vashisth"/><br /><sub><b>Abhinav Vashisth</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vashisthabhinav" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/STudio26"><img src="https://avatars.githubusercontent.com/u/6988911?v=4?s=100" width="100px;" alt="Alain"/><br /><sub><b>Alain</b></sub></a><br /><a href="#translation-STudio26" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://no website"><img src="https://avatars.githubusercontent.com/u/47126749?v=4?s=100" width="100px;" alt="Kevin"/><br /><sub><b>Kevin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AKevinyl3" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=Kevinyl3" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/DEV-VRUPER"><img src="https://avatars.githubusercontent.com/u/30525467?v=4?s=100" width="100px;" alt="VR"/><br /><sub><b>VR</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=DEV-VRUPER" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Shrirang97"><img src="https://avatars.githubusercontent.com/u/28738668?v=4?s=100" width="100px;" alt="Shrirang"/><br /><sub><b>Shrirang</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AShrirang97" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=Shrirang97" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/JackieNim"><img src="https://avatars.githubusercontent.com/u/4138836?v=4?s=100" width="100px;" alt="JackieNim"/><br /><sub><b>JackieNim</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JackieNim" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/interactwithankush"><img src="https://avatars.githubusercontent.com/u/18613127?v=4?s=100" width="100px;" alt="interactwithankush"/><br /><sub><b>interactwithankush</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=interactwithankush" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/EdisonE3"><img src="https://avatars.githubusercontent.com/u/52118917?v=4?s=100" width="100px;" alt="EdisonE3"/><br /><sub><b>EdisonE3</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=EdisonE3" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yuhangbin"><img src="https://avatars.githubusercontent.com/u/17566866?v=4?s=100" width="100px;" alt="CharlieYu"/><br /><sub><b>CharlieYu</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yuhangbin" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/tao-sun2"><img src="https://avatars.githubusercontent.com/u/66189688?v=4?s=100" width="100px;" alt="Tao"/><br /><sub><b>Tao</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=tao-sun2" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Leisterbecker"><img src="https://avatars.githubusercontent.com/u/20650323?v=4?s=100" width="100px;" alt="Leisterbecker"/><br /><sub><b>Leisterbecker</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Leisterbecker" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/JuanManuelAbate"><img src="https://avatars.githubusercontent.com/u/16357060?v=4?s=100" width="100px;" alt="Juan Manuel Abate"/><br /><sub><b>Juan Manuel Abate</b></sub></a><br /><a href="#translation-JuanManuelAbate" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://rosaecrucis.cn"><img src="https://avatars.githubusercontent.com/u/35420129?v=4?s=100" width="100px;" alt="DragonDreamer"/><br /><sub><b>DragonDreamer</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=castleKing1997" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ShivanshCharak"><img src="https://avatars.githubusercontent.com/u/96943825?v=4?s=100" width="100px;" alt="ShivanshCharak"/><br /><sub><b>ShivanshCharak</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ShivanshCharak" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Xenilo137"><img src="https://avatars.githubusercontent.com/u/24865069?v=4?s=100" width="100px;" alt="Xenilo137"/><br /><sub><b>Xenilo137</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Xenilo137" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/HattoriHenzo"><img src="https://avatars.githubusercontent.com/u/5141285?v=4?s=100" width="100px;" alt="HattoriHenzo"/><br /><sub><b>HattoriHenzo</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=HattoriHenzo" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/souzasamuel/"><img src="https://avatars.githubusercontent.com/u/17254162?v=4?s=100" width="100px;" alt="Samuel Souza"/><br /><sub><b>Samuel Souza</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=samuelpsouza" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=samuelpsouza" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://arnabsen.bio.link"><img src="https://avatars.githubusercontent.com/u/51032928?v=4?s=100" width="100px;" alt="Arnab Sen"/><br /><sub><b>Arnab Sen</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=arnabsen1729" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/marlo2222"><img src="https://avatars.githubusercontent.com/u/40809563?v=4?s=100" width="100px;" alt="Marlo Henrique"/><br /><sub><b>Marlo Henrique</b></sub></a><br /><a href="#translation-marlo2222" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://javaforlife.wordpress.com/"><img src="https://avatars.githubusercontent.com/u/1470114?v=4?s=100" width="100px;" alt="MohanaRao SV"/><br /><sub><b>MohanaRao SV</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mohanaraosv" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/AndriyPyzh"><img src="https://avatars.githubusercontent.com/u/57706635?v=4?s=100" width="100px;" alt="AndriyPyzh"/><br /><sub><b>AndriyPyzh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AndriyPyzh" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yonatankarp"><img src="https://avatars.githubusercontent.com/u/14914865?v=4?s=100" width="100px;" alt="Yonatan Karp-Rudin"/><br /><sub><b>Yonatan Karp-Rudin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yonatankarp" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Ayonatankarp" title="Reviewed Pull Requests">👀</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/karthikbhat13"><img src="https://avatars.githubusercontent.com/u/22431014?v=4?s=100" width="100px;" alt="karthikbhat13"/><br /><sub><b>karthikbhat13</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=karthikbhat13" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GustavoOliani"><img src="https://avatars.githubusercontent.com/u/25756378?v=4?s=100" width="100px;" alt="Oliani"/><br /><sub><b>Oliani</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=GustavoOliani" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/mortezaadi"><img src="https://avatars.githubusercontent.com/u/1329687?v=4?s=100" width="100px;" alt="Morteza Adigozalpour"/><br /><sub><b>Morteza Adigozalpour</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mortezaadi" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Liu-rj"><img src="https://avatars.githubusercontent.com/u/64826925?v=4?s=100" width="100px;" alt="Renjie LIU"/><br /><sub><b>Renjie LIU</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Liu-rj" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TreeFireMen"><img src="https://avatars.githubusercontent.com/u/54127694?v=4?s=100" width="100px;" alt="perfect guy"/><br /><sub><b>perfect guy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=TreeFireMen" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://stackoverflow.com/users/308565/nagaraj-tantri"><img src="https://avatars.githubusercontent.com/u/3784194?v=4?s=100" width="100px;" alt="Nagaraj Tantri"/><br /><sub><b>Nagaraj Tantri</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=tan31989" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/xyllq999"><img src="https://avatars.githubusercontent.com/u/72729433?v=4?s=100" width="100px;" alt="xyllq999"/><br /><sub><b>xyllq999</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=xyllq999" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/frascu"><img src="https://avatars.githubusercontent.com/u/7107651?v=4?s=100" width="100px;" alt="Francesco Scuccimarri"/><br /><sub><b>Francesco Scuccimarri</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=frascu" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dmdbilal"><img src="https://avatars.githubusercontent.com/u/91405690?v=4?s=100" width="100px;" alt="Mohamed Bilal"/><br /><sub><b>Mohamed Bilal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dmdbilal" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Conhan93"><img src="https://avatars.githubusercontent.com/u/71334757?v=4?s=100" width="100px;" alt="Conny Hansson"/><br /><sub><b>Conny Hansson</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Conhan93" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/karshilsheth/"><img src="https://avatars.githubusercontent.com/u/37497287?v=4?s=100" width="100px;" alt="Karshil sheth"/><br /><sub><b>Karshil sheth</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=karshil2309" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://muklasr.medium.com"><img src="https://avatars.githubusercontent.com/u/43443753?v=4?s=100" width="100px;" alt="Muklas Rahmanto"/><br /><sub><b>Muklas Rahmanto</b></sub></a><br /><a href="#translation-muklasr" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kongleong86"><img src="https://avatars.githubusercontent.com/u/3745455?v=4?s=100" width="100px;" alt="kongleong86"/><br /><sub><b>kongleong86</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kongleong86" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/VxDxK"><img src="https://avatars.githubusercontent.com/u/38704817?v=4?s=100" width="100px;" alt="Vadim"/><br /><sub><b>Vadim</b></sub></a><br /><a href="#translation-VxDxK" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aitorfi"><img src="https://avatars.githubusercontent.com/u/64830228?v=4?s=100" width="100px;" alt="Aitor Fidalgo Sánchez"/><br /><sub><b>Aitor Fidalgo Sánchez</b></sub></a><br /><a href="#translation-aitorfi" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=aitorfi" title="Documentation">📖</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aaitorfi" title="Reviewed Pull Requests">👀</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/sims-keshri"><img src="https://avatars.githubusercontent.com/u/62168475?v=4?s=100" width="100px;" alt="Simran Keshri"/><br /><sub><b>Simran Keshri</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sims-keshri" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/HeVictor"><img src="https://avatars.githubusercontent.com/u/20733994?v=4?s=100" width="100px;" alt="Victor He"/><br /><sub><b>Victor He</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=HeVictor" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="http://m-inh.github.io/"><img src="https://avatars.githubusercontent.com/u/10632233?v=4?s=100" width="100px;" alt="Minh Nguyen"/><br /><sub><b>Minh Nguyen</b></sub></a><br /><a href="#translation-m-inh" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=m-inh" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://programacionymas.com"><img src="https://avatars.githubusercontent.com/u/3101238?v=4?s=100" width="100px;" alt="JCarlos"/><br /><sub><b>JCarlos</b></sub></a><br /><a href="#translation-JCarlosR" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/HeVictor"><img src="https://avatars.githubusercontent.com/u/20733994?v=4?s=100" width="100px;" alt="Victor He"/><br /><sub><b>Victor He</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=HeVictor" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.mrmoshkel.ir"><img src="https://avatars.githubusercontent.com/u/60359433?v=4?s=100" width="100px;" alt="Ali Ghasemi"/><br /><sub><b>Ali Ghasemi</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Dev-AliGhasemi" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/YichuanSun"><img src="https://avatars.githubusercontent.com/u/30886176?v=4?s=100" width="100px;" alt="yiichan"/><br /><sub><b>yiichan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=YichuanSun" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="http://carlfx.wordpress.com"><img src="https://avatars.githubusercontent.com/u/1594624?v=4?s=100" width="100px;" alt="Carl Dea"/><br /><sub><b>Carl Dea</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=carldea" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/PanSem"><img src="https://avatars.githubusercontent.com/u/43316964?v=4?s=100" width="100px;" alt="Pan Sem"/><br /><sub><b>Pan Sem</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=PanSem" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Mozartuss"><img src="https://avatars.githubusercontent.com/u/32893711?v=4?s=100" width="100px;" alt="Mozartus"/><br /><sub><b>Mozartus</b></sub></a><br /><a href="#translation-Mozartuss" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zhoumengyks"><img src="https://avatars.githubusercontent.com/u/111965739?v=4?s=100" width="100px;" alt="zhoumengyks"/><br /><sub><b>zhoumengyks</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=zhoumengyks" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/ManviGoel26"><img src="https://avatars.githubusercontent.com/u/55682355?v=4?s=100" width="100px;" alt="Manvi Goel"/><br /><sub><b>Manvi Goel</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ManviGoel26" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/you"><img src="https://avatars.githubusercontent.com/u/57100752?v=4?s=100" width="100px;" alt="you"/><br /><sub><b>you</b></sub></a><br /><a href="#translation-you" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/blueberry404"><img src="https://avatars.githubusercontent.com/u/39243539?v=4?s=100" width="100px;" alt="Anum Amin"/><br /><sub><b>Anum Amin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=blueberry404" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/thanks"><img src="https://avatars.githubusercontent.com/u/1121545?v=4?s=100" width="100px;" alt="Thanks"/><br /><sub><b>Thanks</b></sub></a><br /><a href="#translation-Thanks" title="Translation">🌍</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lazy-pr0grammer"><img src="https://avatars.githubusercontent.com/u/87204946?v=4?s=100" width="100px;" alt="LazyProgrammer"/><br /><sub><b>LazyProgrammer</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=lazy-pr0grammer" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://uh-zz.github.io/blog/"><img src="https://avatars.githubusercontent.com/u/47747828?v=4?s=100" width="100px;" alt="Reo Uehara"/><br /><sub><b>Reo Uehara</b></sub></a><br /><a href="#translation-uh-zz" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mdfaizanahmed786"><img src="https://avatars.githubusercontent.com/u/85175130?v=4?s=100" width="100px;" alt="Mohammed Faizan Ahmed"/><br /><sub><b>Mohammed Faizan Ahmed</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mdfaizanahmed786" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Fiordy"><img src="https://avatars.githubusercontent.com/u/53420573?v=4?s=100" width="100px;" alt="Fiordy"/><br /><sub><b>Fiordy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Fiordy" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/burno1"><img src="https://avatars.githubusercontent.com/u/39165280?v=4?s=100" width="100px;" alt="Bruno Fernandes"/><br /><sub><b>Bruno Fernandes</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=burno1" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/harshalkh"><img src="https://avatars.githubusercontent.com/u/37841724?v=4?s=100" width="100px;" alt="Harshal"/><br /><sub><b>Harshal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=harshalkh" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SammanPali"><img src="https://avatars.githubusercontent.com/u/110753804?v=4?s=100" width="100px;" alt="SammanPali"/><br /><sub><b>SammanPali</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=SammanPali" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/abhinav-vashisth-06613b208/"><img src="https://avatars.githubusercontent.com/u/89785800?v=4?s=100" width="100px;" alt="Abhinav Vashisth"/><br /><sub><b>Abhinav Vashisth</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vashisthabhinav" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LeseChe"><img src="https://avatars.githubusercontent.com/u/79553089?v=4?s=100" width="100px;" alt="Qixiang Chen"/><br /><sub><b>Qixiang Chen</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=LeseChe" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="http://no website"><img src="https://avatars.githubusercontent.com/u/47126749?v=4?s=100" width="100px;" alt="Kevin"/><br /><sub><b>Kevin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AKevinyl3" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=Kevinyl3" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/shouryamanekar"><img src="https://avatars.githubusercontent.com/u/72398499?v=4?s=100" width="100px;" alt="Shourya Manekar"/><br /><sub><b>Shourya Manekar</b></sub></a><br /><a href="#translation-shouryamanekar" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Shrirang97"><img src="https://avatars.githubusercontent.com/u/28738668?v=4?s=100" width="100px;" alt="Shrirang"/><br /><sub><b>Shrirang</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AShrirang97" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=Shrirang97" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://seongkyu-lim.github.io/Blog/"><img src="https://avatars.githubusercontent.com/u/55138532?v=4?s=100" width="100px;" alt="Alan"/><br /><sub><b>Alan</b></sub></a><br /><a href="#translation-seongkyu-lim" title="Translation">🌍</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JanFidor"><img src="https://avatars.githubusercontent.com/u/66260538?v=4?s=100" width="100px;" alt="JanFidor"/><br /><sub><b>JanFidor</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JanFidor" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=JanFidor" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/interactwithankush"><img src="https://avatars.githubusercontent.com/u/18613127?v=4?s=100" width="100px;" alt="interactwithankush"/><br /><sub><b>interactwithankush</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=interactwithankush" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/drakulavich"><img src="https://avatars.githubusercontent.com/u/129260?v=4?s=100" width="100px;" alt="Anton Yakutovich"/><br /><sub><b>Anton Yakutovich</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=drakulavich" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/yuhangbin"><img src="https://avatars.githubusercontent.com/u/17566866?v=4?s=100" width="100px;" alt="CharlieYu"/><br /><sub><b>CharlieYu</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yuhangbin" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/steph88ss"><img src="https://avatars.githubusercontent.com/u/111041594?v=4?s=100" width="100px;" alt="steph88ss"/><br /><sub><b>steph88ss</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=steph88ss" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Leisterbecker"><img src="https://avatars.githubusercontent.com/u/20650323?v=4?s=100" width="100px;" alt="Leisterbecker"/><br /><sub><b>Leisterbecker</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Leisterbecker" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://yujanranjitkar.com.np"><img src="https://avatars.githubusercontent.com/u/63731234?v=4?s=100" width="100px;" alt="Yujan Ranjitkar"/><br /><sub><b>Yujan Ranjitkar</b></sub></a><br /><a href="#translation-0xYujan" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="http://rosaecrucis.cn"><img src="https://avatars.githubusercontent.com/u/35420129?v=4?s=100" width="100px;" alt="DragonDreamer"/><br /><sub><b>DragonDreamer</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=castleKing1997" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yusha-g"><img src="https://avatars.githubusercontent.com/u/110189579?v=4?s=100" width="100px;" alt="yusha-g"/><br /><sub><b>yusha-g</b></sub></a><br /><a href="#translation-yusha-g" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/ShivanshCharak"><img src="https://avatars.githubusercontent.com/u/96943825?v=4?s=100" width="100px;" alt="ShivanshCharak"/><br /><sub><b>ShivanshCharak</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ShivanshCharak" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/robertvolkmann"><img src="https://avatars.githubusercontent.com/u/20912167?v=4?s=100" width="100px;" alt="Robert Volkmann"/><br /><sub><b>Robert Volkmann</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=robertvolkmann" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Arobertvolkmann" title="Reviewed Pull Requests">👀</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/HattoriHenzo"><img src="https://avatars.githubusercontent.com/u/5141285?v=4?s=100" width="100px;" alt="HattoriHenzo"/><br /><sub><b>HattoriHenzo</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=HattoriHenzo" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bipin-k"><img src="https://avatars.githubusercontent.com/u/21119358?v=4?s=100" width="100px;" alt="Bipin Kumar Chaurasia"/><br /><sub><b>Bipin Kumar Chaurasia</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=bipin-k" title="Documentation">📖</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/KyleSong30"><img src="https://avatars.githubusercontent.com/u/100892032?v=4?s=100" width="100px;" alt="KyleSong30"/><br /><sub><b>KyleSong30</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=KyleSong30" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="http://arnabsen.bio.link"><img src="https://avatars.githubusercontent.com/u/51032928?v=4?s=100" width="100px;" alt="Arnab Sen"/><br /><sub><b>Arnab Sen</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=arnabsen1729" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/u7281975"><img src="https://avatars.githubusercontent.com/u/111095623?v=4?s=100" width="100px;" alt="u7281975"/><br /><sub><b>u7281975</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=u7281975" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://javaforlife.wordpress.com/"><img src="https://avatars.githubusercontent.com/u/1470114?v=4?s=100" width="100px;" alt="MohanaRao SV"/><br /><sub><b>MohanaRao SV</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mohanaraosv" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harshalkhachane"><img src="https://avatars.githubusercontent.com/u/92866584?v=4?s=100" width="100px;" alt="harshalkhachane"/><br /><sub><b>harshalkhachane</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=harshalkhachane" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/yonatankarp"><img src="https://avatars.githubusercontent.com/u/14914865?v=4?s=100" width="100px;" alt="Yonatan Karp-Rudin"/><br /><sub><b>Yonatan Karp-Rudin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yonatankarp" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Ayonatankarp" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ec-026"><img src="https://avatars.githubusercontent.com/u/95495584?v=4?s=100" width="100px;" alt="Tejas Singh"/><br /><sub><b>Tejas Singh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ec-026" title="Documentation">📖</a> <a href="#translation-ec-026" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/GustavoOliani"><img src="https://avatars.githubusercontent.com/u/25756378?v=4?s=100" width="100px;" alt="Oliani"/><br /><sub><b>Oliani</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=GustavoOliani" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://journal.artfuldev.com"><img src="https://avatars.githubusercontent.com/u/3091087?v=4?s=100" width="100px;" alt="Sudarsan Balaji"/><br /><sub><b>Sudarsan Balaji</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=artfuldev" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Liu-rj"><img src="https://avatars.githubusercontent.com/u/64826925?v=4?s=100" width="100px;" alt="Renjie LIU"/><br /><sub><b>Renjie LIU</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Liu-rj" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/vaibhav-agr/"><img src="https://avatars.githubusercontent.com/u/78676331?v=4?s=100" width="100px;" alt="Vaibhav Agrawal"/><br /><sub><b>Vaibhav Agrawal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vaibhav-if" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/TreeFireMen"><img src="https://avatars.githubusercontent.com/u/54127694?v=4?s=100" width="100px;" alt="perfect guy"/><br /><sub><b>perfect guy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=TreeFireMen" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/u7275858"><img src="https://avatars.githubusercontent.com/u/110969489?v=4?s=100" width="100px;" alt="u7275858"/><br /><sub><b>u7275858</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=u7275858" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://gist.github.com/prasad-333"><img src="https://avatars.githubusercontent.com/u/37048768?v=4?s=100" width="100px;" alt="prasad-333"/><br /><sub><b>prasad-333</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=prasad-333" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/xyllq999"><img src="https://avatars.githubusercontent.com/u/72729433?v=4?s=100" width="100px;" alt="xyllq999"/><br /><sub><b>xyllq999</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=xyllq999" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JurenXu"><img src="https://avatars.githubusercontent.com/u/101047547?v=4?s=100" width="100px;" alt="JurenXu"/><br /><sub><b>JurenXu</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JurenXu" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/dmdbilal"><img src="https://avatars.githubusercontent.com/u/91405690?v=4?s=100" width="100px;" alt="Mohamed Bilal"/><br /><sub><b>Mohamed Bilal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dmdbilal" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/murphShaw"><img src="https://avatars.githubusercontent.com/u/111167533?v=4?s=100" width="100px;" alt="murphShaw"/><br /><sub><b>murphShaw</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=murphShaw" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/karshilsheth/"><img src="https://avatars.githubusercontent.com/u/37497287?v=4?s=100" width="100px;" alt="Karshil sheth"/><br /><sub><b>Karshil sheth</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=karshil2309" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/XianWu99"><img src="https://avatars.githubusercontent.com/u/111103319?v=4?s=100" width="100px;" alt="XianWu99"/><br /><sub><b>XianWu99</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=XianWu99" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/kongleong86"><img src="https://avatars.githubusercontent.com/u/3745455?v=4?s=100" width="100px;" alt="kongleong86"/><br /><sub><b>kongleong86</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kongleong86" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JoshuaSinglaANU"><img src="https://avatars.githubusercontent.com/u/109902734?v=4?s=100" width="100px;" alt="JoshuaSinglaANU"/><br /><sub><b>JoshuaSinglaANU</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JoshuaSinglaANU" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/aitorfi"><img src="https://avatars.githubusercontent.com/u/64830228?v=4?s=100" width="100px;" alt="Aitor Fidalgo Sánchez"/><br /><sub><b>Aitor Fidalgo Sánchez</b></sub></a><br /><a href="#translation-aitorfi" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=aitorfi" title="Documentation">📖</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aaitorfi" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.linkedin.com/in/ricardo-ramos-moura"><img src="https://avatars.githubusercontent.com/u/36955909?v=4?s=100" width="100px;" alt="Ricardo Ramos"/><br /><sub><b>Ricardo Ramos</b></sub></a><br /><a href="#translation-ricardo-ramos-moura" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/HeVictor"><img src="https://avatars.githubusercontent.com/u/20733994?v=4?s=100" width="100px;" alt="Victor He"/><br /><sub><b>Victor He</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=HeVictor" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://zhrfrd.github.io/faridzouheir/"><img src="https://avatars.githubusercontent.com/u/72947724?v=4?s=100" width="100px;" alt="Farid Zouheir"/><br /><sub><b>Farid Zouheir</b></sub></a><br /><a href="#translation-zhrfrd" title="Translation">🌍</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/vinicius-beraldo/"><img src="https://avatars.githubusercontent.com/u/91766068?v=4?s=100" width="100px;" alt="Vinícius A. B."/><br /><sub><b>Vinícius A. B.</b></sub></a><br /><a href="#translation-Viniberaldo" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="http://m-inh.github.io/"><img src="https://avatars.githubusercontent.com/u/10632233?v=4?s=100" width="100px;" alt="Minh Nguyen"/><br /><sub><b>Minh Nguyen</b></sub></a><br /><a href="#translation-m-inh" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=m-inh" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.linkedin.com/in/stefanel-stan/"><img src="https://avatars.githubusercontent.com/u/25990078?v=4?s=100" width="100px;" alt="Stefanel Stan"/><br /><sub><b>Stefanel Stan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=StefanelStan" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/HeVictor"><img src="https://avatars.githubusercontent.com/u/20733994?v=4?s=100" width="100px;" alt="Victor He"/><br /><sub><b>Victor He</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=HeVictor" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bhati00"><img src="https://avatars.githubusercontent.com/u/79313705?v=4?s=100" width="100px;" alt="Prince bhati"/><br /><sub><b>Prince bhati</b></sub></a><br /><a href="#translation-bhati00" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/YichuanSun"><img src="https://avatars.githubusercontent.com/u/30886176?v=4?s=100" width="100px;" alt="yiichan"/><br /><sub><b>yiichan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=YichuanSun" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wulangcode"><img src="https://avatars.githubusercontent.com/u/48200100?v=4?s=100" width="100px;" alt="WuLang"/><br /><sub><b>WuLang</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=wulangcode" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/PanSem"><img src="https://avatars.githubusercontent.com/u/43316964?v=4?s=100" width="100px;" alt="Pan Sem"/><br /><sub><b>Pan Sem</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=PanSem" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hkattt"><img src="https://avatars.githubusercontent.com/u/54300585?v=4?s=100" width="100px;" alt="Hugo Kat"/><br /><sub><b>Hugo Kat</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hkattt" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/zhoumengyks"><img src="https://avatars.githubusercontent.com/u/111965739?v=4?s=100" width="100px;" alt="zhoumengyks"/><br /><sub><b>zhoumengyks</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=zhoumengyks" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/shivu2002a"><img src="https://avatars.githubusercontent.com/u/88313126?v=4?s=100" width="100px;" alt="Shivanagouda Agasimani"/><br /><sub><b>Shivanagouda Agasimani</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=shivu2002a" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/you"><img src="https://avatars.githubusercontent.com/u/57100752?v=4?s=100" width="100px;" alt="you"/><br /><sub><b>you</b></sub></a><br /><a href="#translation-you" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Ap284"><img src="https://avatars.githubusercontent.com/u/13827254?v=4?s=100" width="100px;" alt="Aparna"/><br /><sub><b>Aparna</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Ap284" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/girolamo-giordano"><img src="https://avatars.githubusercontent.com/u/56109364?v=4?s=100" width="100px;" alt="Girolamo Giordano"/><br /><sub><b>Girolamo Giordano</b></sub></a><br /><a href="#translation-girolamo-giordano" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/thanks"><img src="https://avatars.githubusercontent.com/u/1121545?v=4?s=100" width="100px;" alt="Thanks"/><br /><sub><b>Thanks</b></sub></a><br /><a href="#translation-Thanks" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Chak-C"><img src="https://avatars.githubusercontent.com/u/114961815?v=4?s=100" width="100px;" alt="Chak-C"/><br /><sub><b>Chak-C</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Chak-C" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/lazy-pr0grammer"><img src="https://avatars.githubusercontent.com/u/87204946?v=4?s=100" width="100px;" alt="LazyProgrammer"/><br /><sub><b>LazyProgrammer</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=lazy-pr0grammer" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nakul251197"><img src="https://avatars.githubusercontent.com/u/39953357?v=4?s=100" width="100px;" alt="Nakul Nambiar"/><br /><sub><b>Nakul Nambiar</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nakul251197" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/mdfaizanahmed786"><img src="https://avatars.githubusercontent.com/u/85175130?v=4?s=100" width="100px;" alt="Mohammed Faizan Ahmed"/><br /><sub><b>Mohammed Faizan Ahmed</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mdfaizanahmed786" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/KarmaTashiCat"><img src="https://avatars.githubusercontent.com/u/76797146?v=4?s=100" width="100px;" alt="KarmaTashiCat"/><br /><sub><b>KarmaTashiCat</b></sub></a><br /><a href="#translation-KarmaTashiCat" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/burno1"><img src="https://avatars.githubusercontent.com/u/39165280?v=4?s=100" width="100px;" alt="Bruno Fernandes"/><br /><sub><b>Bruno Fernandes</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=burno1" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Marikattt"><img src="https://avatars.githubusercontent.com/u/49302558?v=4?s=100" width="100px;" alt="marikattt"/><br /><sub><b>marikattt</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Marikattt" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/SammanPali"><img src="https://avatars.githubusercontent.com/u/110753804?v=4?s=100" width="100px;" alt="SammanPali"/><br /><sub><b>SammanPali</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=SammanPali" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Harsh4902"><img src="https://avatars.githubusercontent.com/u/84663071?v=4?s=100" width="100px;" alt="Hashvardhan Parmar"/><br /><sub><b>Hashvardhan Parmar</b></sub></a><br /><a href="#translation-Harsh4902" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/LeseChe"><img src="https://avatars.githubusercontent.com/u/79553089?v=4?s=100" width="100px;" alt="Qixiang Chen"/><br /><sub><b>Qixiang Chen</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=LeseChe" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://hwan33.tistory.com/"><img src="https://avatars.githubusercontent.com/u/67625677?v=4?s=100" width="100px;" alt="YongHwan"/><br /><sub><b>YongHwan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yongyongkr" title="Documentation">📖</a> <a href="#translation-yongyongkr" title="Translation">🌍</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/shogohida"><img src="https://avatars.githubusercontent.com/u/10365357?v=4?s=100" width="100px;" alt="Shogo Hida"/><br /><sub><b>Shogo Hida</b></sub></a><br /><a href="#translation-shogohida" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/shouryamanekar"><img src="https://avatars.githubusercontent.com/u/72398499?v=4?s=100" width="100px;" alt="Shourya Manekar"/><br /><sub><b>Shourya Manekar</b></sub></a><br /><a href="#translation-shouryamanekar" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Regyl"><img src="https://avatars.githubusercontent.com/u/48804404?v=4?s=100" width="100px;" alt="Eugene"/><br /><sub><b>Eugene</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Regyl" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://seongkyu-lim.github.io/Blog/"><img src="https://avatars.githubusercontent.com/u/55138532?v=4?s=100" width="100px;" alt="Alan"/><br /><sub><b>Alan</b></sub></a><br /><a href="#translation-seongkyu-lim" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piyush280599"><img src="https://avatars.githubusercontent.com/u/118425491?v=4?s=100" width="100px;" alt="Piyush"/><br /><sub><b>Piyush</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=piyush280599" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/JanFidor"><img src="https://avatars.githubusercontent.com/u/66260538?v=4?s=100" width="100px;" alt="JanFidor"/><br /><sub><b>JanFidor</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JanFidor" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=JanFidor" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/rahulraj90/"><img src="https://avatars.githubusercontent.com/u/517415?v=4?s=100" width="100px;" alt="Rahul Raj"/><br /><sub><b>Rahul Raj</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=rahul-raj" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/drakulavich"><img src="https://avatars.githubusercontent.com/u/129260?v=4?s=100" width="100px;" alt="Anton Yakutovich"/><br /><sub><b>Anton Yakutovich</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=drakulavich" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/bharathkalyans/"><img src="https://avatars.githubusercontent.com/u/49526472?v=4?s=100" width="100px;" alt="Bharath Kalyan S"/><br /><sub><b>Bharath Kalyan S</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=bharathkalyans" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/steph88ss"><img src="https://avatars.githubusercontent.com/u/111041594?v=4?s=100" width="100px;" alt="steph88ss"/><br /><sub><b>steph88ss</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=steph88ss" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/thisissaiteja/"><img src="https://avatars.githubusercontent.com/u/13088886?v=4?s=100" width="100px;" alt="Saiteja Reddy"/><br /><sub><b>Saiteja Reddy</b></sub></a><br /><a href="#translation-saiteja55" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="http://yujanranjitkar.com.np"><img src="https://avatars.githubusercontent.com/u/63731234?v=4?s=100" width="100px;" alt="Yujan Ranjitkar"/><br /><sub><b>Yujan Ranjitkar</b></sub></a><br /><a href="#translation-0xYujan" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://twitch.tv/clerici"><img src="https://avatars.githubusercontent.com/u/115318468?v=4?s=100" width="100px;" alt="Enrique Clerici"/><br /><sub><b>Enrique Clerici</b></sub></a><br /><a href="#translation-TheClerici" title="Translation">🌍</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ramilS"><img src="https://avatars.githubusercontent.com/u/13589365?v=4?s=100" width="100px;" alt="Ramil Sayetov"/><br /><sub><b>Ramil Sayetov</b></sub></a><br /><a href="#translation-ramilS" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/yusha-g"><img src="https://avatars.githubusercontent.com/u/110189579?v=4?s=100" width="100px;" alt="yusha-g"/><br /><sub><b>yusha-g</b></sub></a><br /><a href="#translation-yusha-g" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://pkq.xyz"><img src="https://avatars.githubusercontent.com/u/50656114?v=4?s=100" width="100px;" alt="东方未白"/><br /><sub><b>东方未白</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=pikapiu" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/robertvolkmann"><img src="https://avatars.githubusercontent.com/u/20912167?v=4?s=100" width="100px;" alt="Robert Volkmann"/><br /><sub><b>Robert Volkmann</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=robertvolkmann" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Arobertvolkmann" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/swashb0ckler"><img src="https://avatars.githubusercontent.com/u/62488841?v=4?s=100" width="100px;" alt="Fredrik Sejr"/><br /><sub><b>Fredrik Sejr</b></sub></a><br /><a href="#translation-swashb0ckler" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/bipin-k"><img src="https://avatars.githubusercontent.com/u/21119358?v=4?s=100" width="100px;" alt="Bipin Kumar Chaurasia"/><br /><sub><b>Bipin Kumar Chaurasia</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=bipin-k" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/akshatarora0013"><img src="https://avatars.githubusercontent.com/u/102645021?v=4?s=100" width="100px;" alt="akshatarora0013"/><br /><sub><b>akshatarora0013</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=akshatarora0013" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/KyleSong30"><img src="https://avatars.githubusercontent.com/u/100892032?v=4?s=100" width="100px;" alt="KyleSong30"/><br /><sub><b>KyleSong30</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=KyleSong30" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://mugheesqasimmq.wixsite.com/portfolio-website"><img src="https://avatars.githubusercontent.com/u/45170085?v=4?s=100" width="100px;" alt="Mughees Qasim"/><br /><sub><b>Mughees Qasim</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MugheesQasim" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/u7281975"><img src="https://avatars.githubusercontent.com/u/111095623?v=4?s=100" width="100px;" alt="u7281975"/><br /><sub><b>u7281975</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=u7281975" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/behappyleee"><img src="https://avatars.githubusercontent.com/u/72903623?v=4?s=100" width="100px;" alt="behappyleee"/><br /><sub><b>behappyleee</b></sub></a><br /><a href="#translation-behappyleee" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/harshalkhachane"><img src="https://avatars.githubusercontent.com/u/92866584?v=4?s=100" width="100px;" alt="harshalkhachane"/><br /><sub><b>harshalkhachane</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=harshalkhachane" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Ayush-Thakur-geek"><img src="https://avatars.githubusercontent.com/u/116510022?v=4?s=100" width="100px;" alt="Ayush Thakur"/><br /><sub><b>Ayush Thakur</b></sub></a><br /><a href="#translation-Ayush-Thakur-geek" title="Translation">🌍</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/boscha1"><img src="https://avatars.githubusercontent.com/u/55814237?v=4?s=100" width="100px;" alt="Anthony Bosch"/><br /><sub><b>Anthony Bosch</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=boscha1" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/ec-026"><img src="https://avatars.githubusercontent.com/u/95495584?v=4?s=100" width="100px;" alt="Tejas Singh"/><br /><sub><b>Tejas Singh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ec-026" title="Documentation">📖</a> <a href="#translation-ec-026" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AnsonTran"><img src="https://avatars.githubusercontent.com/u/37683428?v=4?s=100" width="100px;" alt="trananso"/><br /><sub><b>trananso</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AnsonTran" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://journal.artfuldev.com"><img src="https://avatars.githubusercontent.com/u/3091087?v=4?s=100" width="100px;" alt="Sudarsan Balaji"/><br /><sub><b>Sudarsan Balaji</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=artfuldev" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/beef-e"><img src="https://avatars.githubusercontent.com/u/102854627?v=4?s=100" width="100px;" alt="Giammaria Biffi"/><br /><sub><b>Giammaria Biffi</b></sub></a><br /><a href="#translation-beef-e" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/vaibhav-agr/"><img src="https://avatars.githubusercontent.com/u/78676331?v=4?s=100" width="100px;" alt="Vaibhav Agrawal"/><br /><sub><b>Vaibhav Agrawal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vaibhav-if" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/saif7159"><img src="https://avatars.githubusercontent.com/u/36008396?v=4?s=100" width="100px;" alt="Saiful Haque"/><br /><sub><b>Saiful Haque</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=saif7159" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/u7275858"><img src="https://avatars.githubusercontent.com/u/110969489?v=4?s=100" width="100px;" alt="u7275858"/><br /><sub><b>u7275858</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=u7275858" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JabezBrew"><img src="https://avatars.githubusercontent.com/u/74483609?v=4?s=100" width="100px;" alt="JabezBrew"/><br /><sub><b>JabezBrew</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JabezBrew" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://gist.github.com/prasad-333"><img src="https://avatars.githubusercontent.com/u/37048768?v=4?s=100" width="100px;" alt="prasad-333"/><br /><sub><b>prasad-333</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=prasad-333" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/konstantin-goldman"><img src="https://avatars.githubusercontent.com/u/47669472?v=4?s=100" width="100px;" alt="konstantin-goldman"/><br /><sub><b>konstantin-goldman</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=konstantin-goldman" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/JurenXu"><img src="https://avatars.githubusercontent.com/u/101047547?v=4?s=100" width="100px;" alt="JurenXu"/><br /><sub><b>JurenXu</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JurenXu" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://miti99.dev"><img src="https://avatars.githubusercontent.com/u/39063457?v=4?s=100" width="100px;" alt="Tien Nguyen Minh"/><br /><sub><b>Tien Nguyen Minh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=tiennm99" title="Code">💻</a> <a href="#translation-tiennm99" title="Translation">🌍</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/VladimirCreator"><img src="https://avatars.githubusercontent.com/u/49140851?v=4?s=100" width="100px;" alt="Vladimir"/><br /><sub><b>Vladimir</b></sub></a><br /><a href="#translation-VladimirCreator" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/murphShaw"><img src="https://avatars.githubusercontent.com/u/111167533?v=4?s=100" width="100px;" alt="murphShaw"/><br /><sub><b>murphShaw</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=murphShaw" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://surjendu-pal.netlify.app/"><img src="https://avatars.githubusercontent.com/u/101238933?v=4?s=100" width="100px;" alt="Surjendu"/><br /><sub><b>Surjendu</b></sub></a><br /><a href="#translation-surjendu104" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/XianWu99"><img src="https://avatars.githubusercontent.com/u/111103319?v=4?s=100" width="100px;" alt="XianWu99"/><br /><sub><b>XianWu99</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=XianWu99" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bakazhou"><img src="https://avatars.githubusercontent.com/u/81795984?v=4?s=100" width="100px;" alt="bakazhou"/><br /><sub><b>bakazhou</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=bakazhou" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/JoshuaSinglaANU"><img src="https://avatars.githubusercontent.com/u/109902734?v=4?s=100" width="100px;" alt="JoshuaSinglaANU"/><br /><sub><b>JoshuaSinglaANU</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JoshuaSinglaANU" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Owen-CH-Leung"><img src="https://avatars.githubusercontent.com/u/43698890?v=4?s=100" width="100px;" alt="Owen Leung"/><br /><sub><b>Owen Leung</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Owen-CH-Leung" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="http://www.linkedin.com/in/ricardo-ramos-moura"><img src="https://avatars.githubusercontent.com/u/36955909?v=4?s=100" width="100px;" alt="Ricardo Ramos"/><br /><sub><b>Ricardo Ramos</b></sub></a><br /><a href="#translation-ricardo-ramos-moura" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/thestbar"><img src="https://avatars.githubusercontent.com/u/20283468?v=4?s=100" width="100px;" alt="Stavros Barousis"/><br /><sub><b>Stavros Barousis</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=thestbar" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://zhrfrd.github.io/faridzouheir/"><img src="https://avatars.githubusercontent.com/u/72947724?v=4?s=100" width="100px;" alt="Farid Zouheir"/><br /><sub><b>Farid Zouheir</b></sub></a><br /><a href="#translation-zhrfrd" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ibrahim89"><img src="https://avatars.githubusercontent.com/u/20753671?v=4?s=100" width="100px;" alt="Syyed Ibrahim Abdullah"/><br /><sub><b>Syyed Ibrahim Abdullah</b></sub></a><br /><a href="#translation-ibrahim89" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/vinicius-beraldo/"><img src="https://avatars.githubusercontent.com/u/91766068?v=4?s=100" width="100px;" alt="Vinícius A. B."/><br /><sub><b>Vinícius A. B.</b></sub></a><br /><a href="#translation-Viniberaldo" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JanisZhang"><img src="https://avatars.githubusercontent.com/u/95570096?v=4?s=100" width="100px;" alt="JiaDi Zhang"/><br /><sub><b>JiaDi Zhang</b></sub></a><br /><a href="#translation-JanisZhang" title="Translation">🌍</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sanchitbansal10"><img src="https://avatars.githubusercontent.com/u/16536741?v=4?s=100" width="100px;" alt="Sanchit Bansal"/><br /><sub><b>Sanchit Bansal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sanchitbansal10" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="http://www.linkedin.com/in/stefanel-stan/"><img src="https://avatars.githubusercontent.com/u/25990078?v=4?s=100" width="100px;" alt="Stefanel Stan"/><br /><sub><b>Stefanel Stan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=StefanelStan" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mm-saiful6854"><img src="https://avatars.githubusercontent.com/u/48361160?v=4?s=100" width="100px;" alt="Md Saiful Islam"/><br /><sub><b>Md Saiful Islam</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mm-saiful6854" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/bhati00"><img src="https://avatars.githubusercontent.com/u/79313705?v=4?s=100" width="100px;" alt="Prince bhati"/><br /><sub><b>Prince bhati</b></sub></a><br /><a href="#translation-bhati00" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AddeusExMachina"><img src="https://avatars.githubusercontent.com/u/39912670?v=4?s=100" width="100px;" alt="Antonio Addeo"/><br /><sub><b>Antonio Addeo</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AddeusExMachina" title="Documentation">📖</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=AddeusExMachina" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/wulangcode"><img src="https://avatars.githubusercontent.com/u/48200100?v=4?s=100" width="100px;" alt="WuLang"/><br /><sub><b>WuLang</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=wulangcode" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Upendra-Allagadda"><img src="https://avatars.githubusercontent.com/u/25962010?v=4?s=100" width="100px;" alt="Allagadda Sai Upendranath"/><br /><sub><b>Allagadda Sai Upendranath</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Upendra-Allagadda" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/hkattt"><img src="https://avatars.githubusercontent.com/u/54300585?v=4?s=100" width="100px;" alt="Hugo Kat"/><br /><sub><b>Hugo Kat</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hkattt" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/mobraga/"><img src="https://avatars.githubusercontent.com/u/31048764?v=4?s=100" width="100px;" alt="Matheus Braga"/><br /><sub><b>Matheus Braga</b></sub></a><br /><a href="#translation-mathbraga" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=mathbraga" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/shivu2002a"><img src="https://avatars.githubusercontent.com/u/88313126?v=4?s=100" width="100px;" alt="Shivanagouda Agasimani"/><br /><sub><b>Shivanagouda Agasimani</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=shivu2002a" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/satyabarghav"><img src="https://avatars.githubusercontent.com/u/36763910?v=4?s=100" width="100px;" alt="Appari Satya Barghav"/><br /><sub><b>Appari Satya Barghav</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=satyabarghav" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Ap284"><img src="https://avatars.githubusercontent.com/u/13827254?v=4?s=100" width="100px;" alt="Aparna"/><br /><sub><b>Aparna</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Ap284" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://mribeirodantas.me"><img src="https://avatars.githubusercontent.com/u/1023197?v=4?s=100" width="100px;" alt="Marcel Ribeiro-Dantas"/><br /><sub><b>Marcel Ribeiro-Dantas</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mribeirodantas" title="Documentation">📖</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hamexhanif"><img src="https://avatars.githubusercontent.com/u/74542852?v=4?s=100" width="100px;" alt="Muhammad Hanif Amrullah"/><br /><sub><b>Muhammad Hanif Amrullah</b></sub></a><br /><a href="#translation-hamexhanif" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/girolamo-giordano"><img src="https://avatars.githubusercontent.com/u/56109364?v=4?s=100" width="100px;" alt="Girolamo Giordano"/><br /><sub><b>Girolamo Giordano</b></sub></a><br /><a href="#translation-girolamo-giordano" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JackH408"><img src="https://avatars.githubusercontent.com/u/141727294?v=4?s=100" width="100px;" alt="JackH408"/><br /><sub><b>JackH408</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JackH408" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Chak-C"><img src="https://avatars.githubusercontent.com/u/114961815?v=4?s=100" width="100px;" alt="Chak-C"/><br /><sub><b>Chak-C</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Chak-C" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/versus2004"><img src="https://avatars.githubusercontent.com/u/132815243?v=4?s=100" width="100px;" alt="Shubham"/><br /><sub><b>Shubham</b></sub></a><br /><a href="#translation-versus2004" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/nakul251197"><img src="https://avatars.githubusercontent.com/u/39953357?v=4?s=100" width="100px;" alt="Nakul Nambiar"/><br /><sub><b>Nakul Nambiar</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nakul251197" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/inishantjain"><img src="https://avatars.githubusercontent.com/u/121454072?v=4?s=100" width="100px;" alt="Nishant Jain"/><br /><sub><b>Nishant Jain</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=inishantjain" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/KarmaTashiCat"><img src="https://avatars.githubusercontent.com/u/76797146?v=4?s=100" width="100px;" alt="KarmaTashiCat"/><br /><sub><b>KarmaTashiCat</b></sub></a><br /><a href="#translation-KarmaTashiCat" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hallowshaw"><img src="https://avatars.githubusercontent.com/u/90751158?v=4?s=100" width="100px;" alt="Rhitam Chaudhury"/><br /><sub><b>Rhitam Chaudhury</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hallowshaw" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Marikattt"><img src="https://avatars.githubusercontent.com/u/49302558?v=4?s=100" width="100px;" alt="marikattt"/><br /><sub><b>marikattt</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Marikattt" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JerryZhao275"><img src="https://avatars.githubusercontent.com/u/132061401?v=4?s=100" width="100px;" alt="JerryZhao275"/><br /><sub><b>JerryZhao275</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JerryZhao275" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Harsh4902"><img src="https://avatars.githubusercontent.com/u/84663071?v=4?s=100" width="100px;" alt="Hashvardhan Parmar"/><br /><sub><b>Hashvardhan Parmar</b></sub></a><br /><a href="#translation-Harsh4902" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/llisant"><img src="https://avatars.githubusercontent.com/u/1445890?v=4?s=100" width="100px;" alt="Leonardo Lisanti"/><br /><sub><b>Leonardo Lisanti</b></sub></a><br /><a href="#translation-leonardol" title="Translation">🌍</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="http://www.linkedin.com/in/yenniferh"><img src="https://avatars.githubusercontent.com/u/19285706?v=4?s=100" width="100px;" alt="Yennifer Herrera"/><br /><sub><b>Yennifer Herrera</b></sub></a><br /><a href="#translation-Yenniferh" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AYenniferh" title="Reviewed Pull Requests">👀</a></td> <td align="center" valign="top" width="16.66%"><a href="https://hwan33.tistory.com/"><img src="https://avatars.githubusercontent.com/u/67625677?v=4?s=100" width="100px;" alt="YongHwan"/><br /><sub><b>YongHwan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yongyongkr" title="Documentation">📖</a> <a href="#translation-yongyongkr" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jnniu-n"><img src="https://avatars.githubusercontent.com/u/141746282?v=4?s=100" width="100px;" alt="jnniu-n"/><br /><sub><b>jnniu-n</b></sub></a><br /><a href="#translation-jnniu-n" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/shogohida"><img src="https://avatars.githubusercontent.com/u/10365357?v=4?s=100" width="100px;" alt="Shogo Hida"/><br /><sub><b>Shogo Hida</b></sub></a><br /><a href="#translation-shogohida" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/miguel-is-coding"><img src="https://avatars.githubusercontent.com/u/48435117?v=4?s=100" width="100px;" alt="Miguel Angel Perez Garcia"/><br /><sub><b>Miguel Angel Perez Garcia</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Amiguel-is-coding" title="Reviewed Pull Requests">👀</a> <a href="#translation-miguel-is-coding" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/Regyl"><img src="https://avatars.githubusercontent.com/u/48804404?v=4?s=100" width="100px;" alt="Eugene"/><br /><sub><b>Eugene</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Regyl" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SuwanSankaja"><img src="https://avatars.githubusercontent.com/u/86839778?v=4?s=100" width="100px;" alt="Suwan Sankaja"/><br /><sub><b>Suwan Sankaja</b></sub></a><br /><a href="#translation-SuwanSankaja" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/piyush280599"><img src="https://avatars.githubusercontent.com/u/118425491?v=4?s=100" width="100px;" alt="Piyush"/><br /><sub><b>Piyush</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=piyush280599" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Iamalok007"><img src="https://avatars.githubusercontent.com/u/97467835?v=4?s=100" width="100px;" alt="alok"/><br /><sub><b>alok</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Iamalok007" title="Documentation">📖</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/rahulraj90/"><img src="https://avatars.githubusercontent.com/u/517415?v=4?s=100" width="100px;" alt="Rahul Raj"/><br /><sub><b>Rahul Raj</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=rahul-raj" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dlvideira"><img src="https://avatars.githubusercontent.com/u/53951425?v=4?s=100" width="100px;" alt="Daniel Lisboa"/><br /><sub><b>Daniel Lisboa</b></sub></a><br /><a href="#translation-dlvideira" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/bharathkalyans/"><img src="https://avatars.githubusercontent.com/u/49526472?v=4?s=100" width="100px;" alt="Bharath Kalyan S"/><br /><sub><b>Bharath Kalyan S</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=bharathkalyans" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ComplexOW"><img src="https://avatars.githubusercontent.com/u/105279107?v=4?s=100" width="100px;" alt="Sam Powell"/><br /><sub><b>Sam Powell</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ComplexOW" title="Documentation">📖</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jppf22"><img src="https://avatars.githubusercontent.com/u/104360594?v=4?s=100" width="100px;" alt="João Fernandes"/><br /><sub><b>João Fernandes</b></sub></a><br /><a href="#translation-jppf22" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/thisissaiteja/"><img src="https://avatars.githubusercontent.com/u/13088886?v=4?s=100" width="100px;" alt="Saiteja Reddy"/><br /><sub><b>Saiteja Reddy</b></sub></a><br /><a href="#translation-saiteja55" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/HongGeonUi"><img src="https://avatars.githubusercontent.com/u/89684956?v=4?s=100" width="100px;" alt="Hong Geon-ui"/><br /><sub><b>Hong Geon-ui</b></sub></a><br /><a href="#translation-HongGeonUi" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="http://twitch.tv/clerici"><img src="https://avatars.githubusercontent.com/u/115318468?v=4?s=100" width="100px;" alt="Enrique Clerici"/><br /><sub><b>Enrique Clerici</b></sub></a><br /><a href="#translation-TheClerici" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ylcn91"><img src="https://avatars.githubusercontent.com/u/7249450?v=4?s=100" width="100px;" alt="Doksanbir"/><br /><sub><b>Doksanbir</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ylcn91" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/ramilS"><img src="https://avatars.githubusercontent.com/u/13589365?v=4?s=100" width="100px;" alt="Ramil Sayetov"/><br /><sub><b>Ramil Sayetov</b></sub></a><br /><a href="#translation-ramilS" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Chant3ll3"><img src="https://avatars.githubusercontent.com/u/141697333?v=4?s=100" width="100px;" alt="Chant3ll3"/><br /><sub><b>Chant3ll3</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Chant3ll3" title="Documentation">📖</a> <a href="#translation-Chant3ll3" title="Translation">🌍</a></td> <td align="center" valign="top" width="16.66%"><a href="https://pkq.xyz"><img src="https://avatars.githubusercontent.com/u/50656114?v=4?s=100" width="100px;" alt="东方未白"/><br /><sub><b>东方未白</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=pikapiu" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://hwan33.tistory.com/"><img src="https://avatars.githubusercontent.com/u/67625677?v=4?s=100" width="100px;" alt="YongHwan Kwon"/><br /><sub><b>YongHwan Kwon</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hwan33" title="Code">💻</a></td> <td align="center" valign="top" width="16.66%"><a href="https://github.com/swashb0ckler"><img src="https://avatars.githubusercontent.com/u/62488841?v=4?s=100" width="100px;" alt="Fredrik Sejr"/><br /><sub><b>Fredrik Sejr</b></sub></a><br /><a href="#translation-swashb0ckler" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/akshatarora0013"><img src="https://avatars.githubusercontent.com/u/102645021?v=4?s=100" width="100px;" alt="akshatarora0013"/><br /><sub><b>akshatarora0013</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=akshatarora0013" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://mugheesqasimmq.wixsite.com/portfolio-website"><img src="https://avatars.githubusercontent.com/u/45170085?v=4?s=100" width="100px;" alt="Mughees Qasim"/><br /><sub><b>Mughees Qasim</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MugheesQasim" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/behappyleee"><img src="https://avatars.githubusercontent.com/u/72903623?v=4?s=100" width="100px;" alt="behappyleee"/><br /><sub><b>behappyleee</b></sub></a><br /><a href="#translation-behappyleee" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Ayush-Thakur-geek"><img src="https://avatars.githubusercontent.com/u/116510022?v=4?s=100" width="100px;" alt="Ayush Thakur"/><br /><sub><b>Ayush Thakur</b></sub></a><br /><a href="#translation-Ayush-Thakur-geek" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/boscha1"><img src="https://avatars.githubusercontent.com/u/55814237?v=4?s=100" width="100px;" alt="Anthony Bosch"/><br /><sub><b>Anthony Bosch</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=boscha1" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/AnsonTran"><img src="https://avatars.githubusercontent.com/u/37683428?v=4?s=100" width="100px;" alt="trananso"/><br /><sub><b>trananso</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AnsonTran" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/beef-e"><img src="https://avatars.githubusercontent.com/u/102854627?v=4?s=100" width="100px;" alt="Giammaria Biffi"/><br /><sub><b>Giammaria Biffi</b></sub></a><br /><a href="#translation-beef-e" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/saif7159"><img src="https://avatars.githubusercontent.com/u/36008396?v=4?s=100" width="100px;" alt="Saiful Haque"/><br /><sub><b>Saiful Haque</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=saif7159" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/JabezBrew"><img src="https://avatars.githubusercontent.com/u/74483609?v=4?s=100" width="100px;" alt="JabezBrew"/><br /><sub><b>JabezBrew</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JabezBrew" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/konstantin-goldman"><img src="https://avatars.githubusercontent.com/u/47669472?v=4?s=100" width="100px;" alt="konstantin-goldman"/><br /><sub><b>konstantin-goldman</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=konstantin-goldman" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/tiennm99"><img src="https://avatars.githubusercontent.com/u/39063457?v=4?s=100" width="100px;" alt="Tien Nguyen Minh"/><br /><sub><b>Tien Nguyen Minh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=tiennm99" title="Code">💻</a> <a href="#translation-tiennm99" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/VladimirCreator"><img src="https://avatars.githubusercontent.com/u/49140851?v=4?s=100" width="100px;" alt="Vladimir"/><br /><sub><b>Vladimir</b></sub></a><br /><a href="#translation-VladimirCreator" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://surjendu-pal.netlify.app/"><img src="https://avatars.githubusercontent.com/u/101238933?v=4?s=100" width="100px;" alt="Surjendu"/><br /><sub><b>Surjendu</b></sub></a><br /><a href="#translation-surjendu104" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=surjendu104" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/bakazhou"><img src="https://avatars.githubusercontent.com/u/81795984?v=4?s=100" width="100px;" alt="bakazhou"/><br /><sub><b>bakazhou</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=bakazhou" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Owen-CH-Leung"><img src="https://avatars.githubusercontent.com/u/43698890?v=4?s=100" width="100px;" alt="Owen Leung"/><br /><sub><b>Owen Leung</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Owen-CH-Leung" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/thestbar"><img src="https://avatars.githubusercontent.com/u/20283468?v=4?s=100" width="100px;" alt="Stavros Barousis"/><br /><sub><b>Stavros Barousis</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=thestbar" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ibrahim89"><img src="https://avatars.githubusercontent.com/u/20753671?v=4?s=100" width="100px;" alt="Syyed Ibrahim Abdullah"/><br /><sub><b>Syyed Ibrahim Abdullah</b></sub></a><br /><a href="#translation-ibrahim89" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/JanisZhang"><img src="https://avatars.githubusercontent.com/u/95570096?v=4?s=100" width="100px;" alt="JiaDi Zhang"/><br /><sub><b>JiaDi Zhang</b></sub></a><br /><a href="#translation-JanisZhang" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/sanchitbansal10"><img src="https://avatars.githubusercontent.com/u/16536741?v=4?s=100" width="100px;" alt="Sanchit Bansal"/><br /><sub><b>Sanchit Bansal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sanchitbansal10" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/mm-saiful6854"><img src="https://avatars.githubusercontent.com/u/48361160?v=4?s=100" width="100px;" alt="Md Saiful Islam"/><br /><sub><b>Md Saiful Islam</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mm-saiful6854" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/AddeusExMachina"><img src="https://avatars.githubusercontent.com/u/39912670?v=4?s=100" width="100px;" alt="Antonio Addeo"/><br /><sub><b>Antonio Addeo</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AddeusExMachina" title="Documentation">📖</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=AddeusExMachina" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Upendra-Allagadda"><img src="https://avatars.githubusercontent.com/u/25962010?v=4?s=100" width="100px;" alt="Allagadda Sai Upendranath"/><br /><sub><b>Allagadda Sai Upendranath</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Upendra-Allagadda" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/mobraga/"><img src="https://avatars.githubusercontent.com/u/31048764?v=4?s=100" width="100px;" alt="Matheus Braga"/><br /><sub><b>Matheus Braga</b></sub></a><br /><a href="#translation-mathbraga" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=mathbraga" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/satyabarghav"><img src="https://avatars.githubusercontent.com/u/36763910?v=4?s=100" width="100px;" alt="Appari Satya Barghav"/><br /><sub><b>Appari Satya Barghav</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=satyabarghav" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="http://mribeirodantas.me"><img src="https://avatars.githubusercontent.com/u/1023197?v=4?s=100" width="100px;" alt="Marcel Ribeiro-Dantas"/><br /><sub><b>Marcel Ribeiro-Dantas</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mribeirodantas" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/hamexhanif"><img src="https://avatars.githubusercontent.com/u/74542852?v=4?s=100" width="100px;" alt="Muhammad Hanif Amrullah"/><br /><sub><b>Muhammad Hanif Amrullah</b></sub></a><br /><a href="#translation-hamexhanif" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/JackH408"><img src="https://avatars.githubusercontent.com/u/141727294?v=4?s=100" width="100px;" alt="JackH408"/><br /><sub><b>JackH408</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JackH408" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/versus2004"><img src="https://avatars.githubusercontent.com/u/132815243?v=4?s=100" width="100px;" alt="Shubham"/><br /><sub><b>Shubham</b></sub></a><br /><a href="#translation-versus2004" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/inishantjain"><img src="https://avatars.githubusercontent.com/u/121454072?v=4?s=100" width="100px;" alt="Nishant Jain"/><br /><sub><b>Nishant Jain</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=inishantjain" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/hallowshaw"><img src="https://avatars.githubusercontent.com/u/90751158?v=4?s=100" width="100px;" alt="Rhitam Chaudhury"/><br /><sub><b>Rhitam Chaudhury</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hallowshaw" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/JerryZhao275"><img src="https://avatars.githubusercontent.com/u/132061401?v=4?s=100" width="100px;" alt="JerryZhao275"/><br /><sub><b>JerryZhao275</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JerryZhao275" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://twitter.com/llisant"><img src="https://avatars.githubusercontent.com/u/1445890?v=4?s=100" width="100px;" alt="Leonardo Lisanti"/><br /><sub><b>Leonardo Lisanti</b></sub></a><br /><a href="#translation-leonardol" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="http://www.linkedin.com/in/yenniferh"><img src="https://avatars.githubusercontent.com/u/19285706?v=4?s=100" width="100px;" alt="Yennifer Herrera"/><br /><sub><b>Yennifer Herrera</b></sub></a><br /><a href="#translation-Yenniferh" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AYenniferh" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/jnniu-n"><img src="https://avatars.githubusercontent.com/u/141746282?v=4?s=100" width="100px;" alt="jnniu-n"/><br /><sub><b>jnniu-n</b></sub></a><br /><a href="#translation-jnniu-n" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=jnniu-n" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/miguel-is-coding"><img src="https://avatars.githubusercontent.com/u/48435117?v=4?s=100" width="100px;" alt="Miguel Angel Perez Garcia"/><br /><sub><b>Miguel Angel Perez Garcia</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Amiguel-is-coding" title="Reviewed Pull Requests">👀</a> <a href="#translation-miguel-is-coding" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/SuwanSankaja"><img src="https://avatars.githubusercontent.com/u/86839778?v=4?s=100" width="100px;" alt="Suwan Sankaja"/><br /><sub><b>Suwan Sankaja</b></sub></a><br /><a href="#translation-SuwanSankaja" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Iamalok007"><img src="https://avatars.githubusercontent.com/u/97467835?v=4?s=100" width="100px;" alt="alok"/><br /><sub><b>alok</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Iamalok007" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/dlvideira"><img src="https://avatars.githubusercontent.com/u/53951425?v=4?s=100" width="100px;" alt="Daniel Lisboa"/><br /><sub><b>Daniel Lisboa</b></sub></a><br /><a href="#translation-dlvideira" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ComplexOW"><img src="https://avatars.githubusercontent.com/u/105279107?v=4?s=100" width="100px;" alt="Sam Powell"/><br /><sub><b>Sam Powell</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ComplexOW" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/jppf22"><img src="https://avatars.githubusercontent.com/u/104360594?v=4?s=100" width="100px;" alt="João Fernandes"/><br /><sub><b>João Fernandes</b></sub></a><br /><a href="#translation-jppf22" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/HongGeonUi"><img src="https://avatars.githubusercontent.com/u/89684956?v=4?s=100" width="100px;" alt="Hong Geon-ui"/><br /><sub><b>Hong Geon-ui</b></sub></a><br /><a href="#translation-HongGeonUi" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ylcn91"><img src="https://avatars.githubusercontent.com/u/7249450?v=4?s=100" width="100px;" alt="Doksanbir"/><br /><sub><b>Doksanbir</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ylcn91" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=ylcn91" title="Documentation">📖</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aylcn91" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Chant3ll3"><img src="https://avatars.githubusercontent.com/u/141697333?v=4?s=100" width="100px;" alt="Chant3ll3"/><br /><sub><b>Chant3ll3</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Chant3ll3" title="Documentation">📖</a> <a href="#translation-Chant3ll3" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://hwan33.tistory.com/"><img src="https://avatars.githubusercontent.com/u/67625677?v=4?s=100" width="100px;" alt="YongHwan Kwon"/><br /><sub><b>YongHwan Kwon</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hwan33" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/takikuba"><img src="https://avatars.githubusercontent.com/u/58841343?v=4?s=100" width="100px;" alt="Jakub Klimek"/><br /><sub><b>Jakub Klimek</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=takikuba" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/bachbil"><img src="https://avatars.githubusercontent.com/u/28935461?v=4?s=100" width="100px;" alt="believe"/><br /><sub><b>believe</b></sub></a><br /><a href="#translation-bachbil" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/egg0102030405"><img src="https://avatars.githubusercontent.com/u/59650695?v=4?s=100" width="100px;" alt="egg0102030405"/><br /><sub><b>egg0102030405</b></sub></a><br /><a href="#translation-egg0102030405" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=egg0102030405" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ved-asole"><img src="https://avatars.githubusercontent.com/u/77259804?v=4?s=100" width="100px;" alt="Ved Asole"/><br /><sub><b>Ved Asole</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ved-asole" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Holiday-C"><img src="https://avatars.githubusercontent.com/u/95869761?v=4?s=100" width="100px;" alt="NewMorning"/><br /><sub><b>NewMorning</b></sub></a><br /><a href="#translation-Holiday-C" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Kiro-Young"><img src="https://avatars.githubusercontent.com/u/98251397?v=4?s=100" width="100px;" alt="资深老萌新"/><br /><sub><b>资深老萌新</b></sub></a><br /><a href="#translation-Kiro-Young" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://itistori.tistory.com/"><img src="https://avatars.githubusercontent.com/u/113348293?v=4?s=100" width="100px;" alt="Seunghwan Jeon"/><br /><sub><b>Seunghwan Jeon</b></sub></a><br /><a href="#translation-Nickolodeon98" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/sugan0tech"><img src="https://avatars.githubusercontent.com/u/71312159?v=4?s=100" width="100px;" alt="sugavanesh"/><br /><sub><b>sugavanesh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sugan0tech" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/FinnS-F"><img src="https://avatars.githubusercontent.com/u/126026830?v=4?s=100" width="100px;" alt="FinnS-F"/><br /><sub><b>FinnS-F</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=FinnS-F" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/jerryyummy"><img src="https://avatars.githubusercontent.com/u/62087610?v=4?s=100" width="100px;" alt="jerryyummy"/><br /><sub><b>jerryyummy</b></sub></a><br /><a href="#translation-jerryyummy" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://manojkumarchow.github.io/"><img src="https://avatars.githubusercontent.com/u/28005510?v=4?s=100" width="100px;" alt="Manoj Chowdary"/><br /><sub><b>Manoj Chowdary</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Manojkumarchow" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/MaverickWingman"><img src="https://avatars.githubusercontent.com/u/76624290?v=4?s=100" width="100px;" alt="Aditya"/><br /><sub><b>Aditya</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MaverickWingman" title="Documentation">📖</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=MaverickWingman" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/nooynayr"><img src="https://avatars.githubusercontent.com/u/141696269?v=4?s=100" width="100px;" alt="nooynayr"/><br /><sub><b>nooynayr</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nooynayr" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/pushpander1010"><img src="https://avatars.githubusercontent.com/u/41006191?v=4?s=100" width="100px;" alt="CYBERCRUX2"/><br /><sub><b>CYBERCRUX2</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=pushpander1010" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/luismateoh"><img src="https://avatars.githubusercontent.com/u/44934142?v=4?s=100" width="100px;" alt="Luis Mateo Hincapié Martinez"/><br /><sub><b>Luis Mateo Hincapié Martinez</b></sub></a><br /><a href="#translation-luismateoh" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aluismateoh" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://guqing.io"><img src="https://avatars.githubusercontent.com/u/38999863?v=4?s=100" width="100px;" alt="guqing"/><br /><sub><b>guqing</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=guqing" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/sashirestela"><img src="https://avatars.githubusercontent.com/u/14045506?v=4?s=100" width="100px;" alt="Sashir Estela"/><br /><sub><b>Sashir Estela</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sashirestela" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/omahs"><img src="https://avatars.githubusercontent.com/u/73983677?v=4?s=100" width="100px;" alt="omahs"/><br /><sub><b>omahs</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=omahs" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/leiferksn"><img src="https://avatars.githubusercontent.com/u/4026636?v=4?s=100" width="100px;" alt="leif e."/><br /><sub><b>leif e.</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=leiferksn" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://junhkang.tistory.com/"><img src="https://avatars.githubusercontent.com/u/20232155?v=4?s=100" width="100px;" alt="Jun Kang"/><br /><sub><b>Jun Kang</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=junhkang" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/KishalayP"><img src="https://avatars.githubusercontent.com/u/71012321?v=4?s=100" width="100px;" alt="Kishalay Pandey"/><br /><sub><b>Kishalay Pandey</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=KishalayP" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/drishtii7"><img src="https://avatars.githubusercontent.com/u/82076566?v=4?s=100" width="100px;" alt="drishtii7"/><br /><sub><b>drishtii7</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=drishtii7" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/DavidMedinaO"><img src="https://avatars.githubusercontent.com/u/53974843?v=4?s=100" width="100px;" alt="David Medina Orozco"/><br /><sub><b>David Medina Orozco</b></sub></a><br /><a href="#translation-DavidMedinaO" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3ADavidMedinaO" title="Reviewed Pull Requests">👀</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Romo4ka-bot"><img src="https://avatars.githubusercontent.com/u/61774094?v=4?s=100" width="100px;" alt="Roman Leontev"/><br /><sub><b>Roman Leontev</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Romo4ka-bot" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Ehspresso"><img src="https://avatars.githubusercontent.com/u/144370752?v=4?s=100" width="100px;" alt="Riley"/><br /><sub><b>Riley</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Ehspresso" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/k1w1dev"><img src="https://avatars.githubusercontent.com/u/121696782?v=4?s=100" width="100px;" alt="k1w1dev"/><br /><sub><b>k1w1dev</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=k1w1dev" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/dev-yugantar"><img src="https://avatars.githubusercontent.com/u/153066190?v=4?s=100" width="100px;" alt="dev-yugantar"/><br /><sub><b>dev-yugantar</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dev-yugantar" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Adelechka"><img src="https://avatars.githubusercontent.com/u/65678470?v=4?s=100" width="100px;" alt="Adelya"/><br /><sub><b>Adelya</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Adelechka" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/gatlanagaprasanna"><img src="https://avatars.githubusercontent.com/u/154739216?v=4?s=100" width="100px;" alt="gatlanagaprasanna"/><br /><sub><b>gatlanagaprasanna</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=gatlanagaprasanna" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Avinash2110"><img src="https://avatars.githubusercontent.com/u/37360069?v=4?s=100" width="100px;" alt="Avinash Shukla"/><br /><sub><b>Avinash Shukla</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Avinash2110" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Mayankchoudhary294"><img src="https://avatars.githubusercontent.com/u/97609699?v=4?s=100" width="100px;" alt="Mayank Choudhary"/><br /><sub><b>Mayank Choudhary</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Mayankchoudhary294" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/romannimets"><img src="https://avatars.githubusercontent.com/u/137268574?v=4?s=100" width="100px;" alt="romannimets"/><br /><sub><b>romannimets</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=romannimets" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Joel-Dandin"><img src="https://avatars.githubusercontent.com/u/60149879?v=4?s=100" width="100px;" alt="Joel"/><br /><sub><b>Joel</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Joel-Dandin" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/244Walyson"><img src="https://avatars.githubusercontent.com/u/125759796?v=4?s=100" width="100px;" alt="Walyson Moises"/><br /><sub><b>Walyson Moises</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=244Walyson" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Xcyq"><img src="https://avatars.githubusercontent.com/u/39086666?v=4?s=100" width="100px;" alt="Xcyq"/><br /><sub><b>Xcyq</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Xcyq" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Ritabrata1080"><img src="https://avatars.githubusercontent.com/u/60834250?v=4?s=100" width="100px;" alt="Ritabrata"/><br /><sub><b>Ritabrata</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3ARitabrata1080" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/trivikr"><img src="https://avatars.githubusercontent.com/u/16024985?v=4?s=100" width="100px;" alt="Trivikram Kamat"/><br /><sub><b>Trivikram Kamat</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=trivikr" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/vvanghelle"><img src="https://avatars.githubusercontent.com/u/3204600?v=4?s=100" width="100px;" alt="Vincent Vanghelle"/><br /><sub><b>Vincent Vanghelle</b></sub></a><br /><a href="#translation-vvanghelle" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/antoheri"><img src="https://avatars.githubusercontent.com/u/79988396?v=4?s=100" width="100px;" alt="Antoine Héritier"/><br /><sub><b>Antoine Héritier</b></sub></a><br /><a href="#translation-antoheri" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/fishandsheep"><img src="https://avatars.githubusercontent.com/u/43347407?v=4?s=100" width="100px;" alt="QinShower"/><br /><sub><b>QinShower</b></sub></a><br /><a href="#translation-fishandsheep" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/LakshyaPunyani-01"><img src="https://avatars.githubusercontent.com/u/103628913?v=4?s=100" width="100px;" alt="LakshyaPunyani-01"/><br /><sub><b>LakshyaPunyani-01</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=LakshyaPunyani-01" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/jasonjyu"><img src="https://avatars.githubusercontent.com/u/10333076?v=4?s=100" width="100px;" alt="jasonjyu"/><br /><sub><b>jasonjyu</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=jasonjyu" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/jeffmorrison"><img src="https://avatars.githubusercontent.com/u/26047158?v=4?s=100" width="100px;" alt="jeffmorrison"/><br /><sub><b>jeffmorrison</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=jeffmorrison" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/dmgodoy"><img src="https://avatars.githubusercontent.com/u/10840681?v=4?s=100" width="100px;" alt="David M."/><br /><sub><b>David M.</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dmgodoy" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/apophizzz"><img src="https://avatars.githubusercontent.com/u/12052783?v=4?s=100" width="100px;" alt="Patrick Kleindienst"/><br /><sub><b>Patrick Kleindienst</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=apophizzz" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/proceane"><img src="https://avatars.githubusercontent.com/u/62143949?v=4?s=100" width="100px;" alt="Juyeon"/><br /><sub><b>Juyeon</b></sub></a><br /><a href="#translation-proceane" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://mammadyahya.vercel.app"><img src="https://avatars.githubusercontent.com/u/66476643?v=4?s=100" width="100px;" alt="Mammad Yahyayev"/><br /><sub><b>Mammad Yahyayev</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mammadyahyayev" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/SalmaAzeem"><img src="https://avatars.githubusercontent.com/u/121863224?v=4?s=100" width="100px;" alt="Salma"/><br /><sub><b>Salma</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=SalmaAzeem" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://codemaverick-143.github.io/My-Portfolio/"><img src="https://avatars.githubusercontent.com/u/182847716?v=4?s=100" width="100px;" alt="Arpit Sarang"/><br /><sub><b>Arpit Sarang</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=CodeMaverick-143" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/mayatarek"><img src="https://avatars.githubusercontent.com/u/111644421?v=4?s=100" width="100px;" alt="Maya"/><br /><sub><b>Maya</b></sub></a><br /><a href="#translation-mayatarek" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/HabibaMekay"><img src="https://avatars.githubusercontent.com/u/133516736?v=4?s=100" width="100px;" alt="HabibaMekay"/><br /><sub><b>HabibaMekay</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=HabibaMekay" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Ahmed-Taha-981"><img src="https://avatars.githubusercontent.com/u/122402269?v=4?s=100" width="100px;" alt="Ahmed-Taha-981"/><br /><sub><b>Ahmed-Taha-981</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Ahmed-Taha-981" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://malakelbanna.netlify.app/"><img src="https://avatars.githubusercontent.com/u/67643605?v=4?s=100" width="100px;" alt="Malak Elbanna"/><br /><sub><b>Malak Elbanna</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=malak-elbanna" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/depthlending"><img src="https://avatars.githubusercontent.com/u/164312726?v=4?s=100" width="100px;" alt="BiKangNing"/><br /><sub><b>BiKangNing</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=depthlending" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/TarunVishwakarma1"><img src="https://avatars.githubusercontent.com/u/138651451?v=4?s=100" width="100px;" alt="Tarun Vishwakarma"/><br /><sub><b>Tarun Vishwakarma</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=TarunVishwakarma1" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/shahdhoss"><img src="https://avatars.githubusercontent.com/u/132148556?v=4?s=100" width="100px;" alt="Shahd Hossam"/><br /><sub><b>Shahd Hossam</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=shahdhoss" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://mehdirahimi.github.io"><img src="https://avatars.githubusercontent.com/u/24210842?v=4?s=100" width="100px;" alt="Mehdi Rahimi"/><br /><sub><b>Mehdi Rahimi</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mehdirahimi" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/clintaire"><img src="https://avatars.githubusercontent.com/u/111376518?v=4?s=100" width="100px;" alt="Clint Airé"/><br /><sub><b>Clint Airé</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=clintaire" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/darkhyper24"><img src="https://avatars.githubusercontent.com/u/132711528?v=4?s=100" width="100px;" alt="darkhyper24"/><br /><sub><b>darkhyper24</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=darkhyper24" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/MohanedAtef238"><img src="https://avatars.githubusercontent.com/u/105852138?v=4?s=100" width="100px;" alt="Mohaned Atef"/><br /><sub><b>Mohaned Atef</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MohanedAtef238" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/maximevtush"><img src="https://avatars.githubusercontent.com/u/154841002?v=4?s=100" width="100px;" alt="Maxim Evtush"/><br /><sub><b>Maxim Evtush</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=maximevtush" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/hvgh88"><img src="https://avatars.githubusercontent.com/u/65297242?v=4?s=100" width="100px;" alt="Harshita Vidapanakal"/><br /><sub><b>Harshita Vidapanakal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hvgh88" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/smile-ab"><img src="https://avatars.githubusercontent.com/u/202159894?v=4?s=100" width="100px;" alt="smile-ab"/><br /><sub><b>smile-ab</b></sub></a><br /><a href="#translation-smile-ab" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=smile-ab" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Francisco-G-P"><img src="https://avatars.githubusercontent.com/u/186766789?v=4?s=100" width="100px;" alt="Francisco-G-P"/><br /><sub><b>Francisco-G-P</b></sub></a><br /><a href="#translation-Francisco-G-P" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Duartegdm"><img src="https://avatars.githubusercontent.com/u/137895372?v=4?s=100" width="100px;" alt="Gabriel Duarte"/><br /><sub><b>Gabriel Duarte</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Duartegdm" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/DenizAltunkapan"><img src="https://avatars.githubusercontent.com/u/93663085?v=4?s=100" width="100px;" alt="Deniz Altunkapan"/><br /><sub><b>Deniz Altunkapan</b></sub></a><br /><a href="#translation-DenizAltunkapan" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/johnklint81"><img src="https://avatars.githubusercontent.com/u/70539458?v=4?s=100" width="100px;" alt="John Klint"/><br /><sub><b>John Klint</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=johnklint81" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/sanurah"><img src="https://avatars.githubusercontent.com/u/16178588?v=4?s=100" width="100px;" alt="Sanura Hettiarachchi"/><br /><sub><b>Sanura Hettiarachchi</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sanurah" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/2897robo"><img src="https://avatars.githubusercontent.com/u/31699375?v=4?s=100" width="100px;" alt="Kim Gi Uk"/><br /><sub><b>Kim Gi Uk</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=2897robo" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Suchismita-Deb"><img src="https://avatars.githubusercontent.com/u/68535074?v=4?s=100" width="100px;" alt="Suchismita Deb"/><br /><sub><b>Suchismita Deb</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Suchismita-Deb" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ssrijan-007-sys"><img src="https://avatars.githubusercontent.com/u/137605821?v=4?s=100" width="100px;" alt="ssrijan-007-sys"/><br /><sub><b>ssrijan-007-sys</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ssrijan-007-sys" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/e5LA"><img src="https://avatars.githubusercontent.com/u/208197507?v=4?s=100" width="100px;" alt="e5LA"/><br /><sub><b>e5LA</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=e5LA" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=e5LA" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="http://maziyar-gerami.github.io/portfolio/"><img src="https://avatars.githubusercontent.com/u/122622721?v=4?s=100" width="100px;" alt="Maziyar Gerami"/><br /><sub><b>Maziyar Gerami</b></sub></a><br /><a href="#translation-maziyar-gerami" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/yybmion"><img src="https://avatars.githubusercontent.com/u/113106136?v=4?s=100" width="100px;" alt="yoobin_mion"/><br /><sub><b>yoobin_mion</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yybmion" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://ronodhirsoumik.github.io"><img src="https://avatars.githubusercontent.com/u/46843689?v=4?s=100" width="100px;" alt="Soumik Sarker"/><br /><sub><b>Soumik Sarker</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ronodhirSoumik" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/naman-sriv"><img src="https://avatars.githubusercontent.com/u/82610773?v=4?s=100" width="100px;" alt="Naman Srivastava"/><br /><sub><b>Naman Srivastava</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=naman-sriv" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/letdtcode"><img src="https://avatars.githubusercontent.com/u/92111552?v=4?s=100" width="100px;" alt="Thanh Nguyen Duc"/><br /><sub><b>Thanh Nguyen Duc</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=letdtcode" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/skamble2"><img src="https://avatars.githubusercontent.com/u/121136639?v=4?s=100" width="100px;" alt="Soham Kamble"/><br /><sub><b>Soham Kamble</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=skamble2" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Olexandr88"><img src="https://avatars.githubusercontent.com/u/93856062?v=4?s=100" width="100px;" alt="Olexandr88"/><br /><sub><b>Olexandr88</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Olexandr88" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/nilsreichardt"><img src="https://avatars.githubusercontent.com/u/24459435?v=4?s=100" width="100px;" alt="Nils Reichardt"/><br /><sub><b>Nils Reichardt</b></sub></a><br /><a href="#security-nilsreichardt" title="Security">🛡️</a></td>
<td align="center" valign="top" width="16.66%"><a href="http://www.northecho.dev"><img src="https://avatars.githubusercontent.com/u/122107484?v=4?s=100" width="100px;" alt="Christopher Lusk"/><br /><sub><b>Christopher Lusk</b></sub></a><br /><a href="#security-north-echo" title="Security">🛡️</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/dagecko"><img src="https://avatars.githubusercontent.com/u/6371704?v=4?s=100" width="100px;" alt="dagecko"/><br /><sub><b>dagecko</b></sub></a><br /><a href="#security-dagecko" title="Security">🛡️</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/jackmisbach"><img src="https://avatars.githubusercontent.com/u/183796460?v=4?s=100" width="100px;" alt="jackmisbach"/><br /><sub><b>jackmisbach</b></sub></a><br /><a href="#security-jackmisbach" title="Security">🛡️</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/avivdon"><img src="https://avatars.githubusercontent.com/u/74790003?v=4?s=100" width="100px;" alt="avivdon"/><br /><sub><b>avivdon</b></sub></a><br /><a href="#security-avivdon" title="Security">🛡️</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/quantdevv"><img src="https://avatars.githubusercontent.com/u/56085648?v=4?s=100" width="100px;" alt="Aditya Kumawat"/><br /><sub><b>Aditya Kumawat</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=quantdevv" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/devch37"><img src="https://avatars.githubusercontent.com/u/72903623?v=4?s=100" width="100px;" alt="devch37"/><br /><sub><b>devch37</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=devch37" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/HY-love-sleep"><img src="https://avatars.githubusercontent.com/u/73268470?v=4?s=100" width="100px;" alt="HY-love-sleep"/><br /><sub><b>HY-love-sleep</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=HY-love-sleep" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="http://www.cmd137blog.top/"><img src="https://avatars.githubusercontent.com/u/56242956?v=4?s=100" width="100px;" alt="CMD137"/><br /><sub><b>CMD137</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=CMD137" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/QuantumRange"><img src="https://avatars.githubusercontent.com/u/49843948?v=4?s=100" width="100px;" alt="QuantumRange"/><br /><sub><b>QuantumRange</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=QuantumRange" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Dhiraj-birajdar"><img src="https://avatars.githubusercontent.com/u/114354331?v=4?s=100" width="100px;" alt="Dhiraj Birajdar"/><br /><sub><b>Dhiraj Birajdar</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Dhiraj-birajdar" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/sieberss"><img src="https://avatars.githubusercontent.com/u/178474619?v=4?s=100" width="100px;" alt="Stefan Siebers"/><br /><sub><b>Stefan Siebers</b></sub></a><br /><a href="#translation-sieberss" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://orbisappsec.com/"><img src="https://avatars.githubusercontent.com/u/242526317?v=4?s=100" width="100px;" alt="OrbisAI Security"/><br /><sub><b>OrbisAI Security</b></sub></a><br /><a href="#security-orbisai0security" title="Security">🛡️</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://www.rajugupta.com/portfolio/"><img src="https://avatars.githubusercontent.com/u/64011583?v=4?s=100" width="100px;" alt="Raju Gupta"/><br /><sub><b>Raju Gupta</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=rranjangupta" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/alex052525"><img src="https://avatars.githubusercontent.com/u/116088682?v=4?s=100" width="100px;" alt="김정모"/><br /><sub><b>김정모</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=alex052525" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/AnakinYen0329"><img src="https://avatars.githubusercontent.com/u/122139183?v=4?s=100" width="100px;" alt="Anakin Yen"/><br /><sub><b>Anakin Yen</b></sub></a><br /><a href="#translation-AnakinYen0329" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/SrGiuliano77"><img src="https://avatars.githubusercontent.com/u/128543464?v=4?s=100" width="100px;" alt="Giuliano Oliveira"/><br /><sub><b>Giuliano Oliveira</b></sub></a><br /><a href="#translation-SrGiuliano77" title="Translation">🌍</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://www.priyanshu-portfolio.co.in"><img src="https://avatars.githubusercontent.com/u/222148451?v=4?s=100" width="100px;" alt="Priyanshu"/><br /><sub><b>Priyanshu</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=priyanshuvishwakarma273403" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/arnabnandy-cognizant"><img src="https://avatars.githubusercontent.com/u/5053648?v=4?s=100" width="100px;" alt="Arnab Nandy"/><br /><sub><b>Arnab Nandy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=arnabnandy7" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/MohamedMBG"><img src="https://avatars.githubusercontent.com/u/123114744?v=4?s=100" width="100px;" alt="BAGHDAD Mohamed"/><br /><sub><b>BAGHDAD Mohamed</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MohamedMBG" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/AnveshSrivastava"><img src="https://avatars.githubusercontent.com/u/170334970?v=4?s=100" width="100px;" alt="Anvesh Srivastava"/><br /><sub><b>Anvesh Srivastava</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AnveshSrivastava" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Mukul-Howale"><img src="https://avatars.githubusercontent.com/u/110479646?v=4?s=100" width="100px;" alt="Mukul Howale"/><br /><sub><b>Mukul Howale</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Mukul-Howale" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/SandhyaDevadiga"><img src="https://avatars.githubusercontent.com/u/128058717?v=4?s=100" width="100px;" alt="Sandhya"/><br /><sub><b>Sandhya</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=SandhyaDevadiga" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/devikae"><img src="https://avatars.githubusercontent.com/u/98100047?v=4?s=100" width="100px;" alt="dev-ikae"/><br /><sub><b>dev-ikae</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=devikae" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/zanarellidev"><img src="https://avatars.githubusercontent.com/u/268068569?v=4?s=100" width="100px;" alt="zanarelli"/><br /><sub><b>zanarelli</b></sub></a><br /><a href="#translation-zanarellidev" title="Translation">🌍</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
+84 -43
View File
@@ -1,25 +1,29 @@
--- ---
title: Abstract Document title: "Abstract Document Pattern in Java: Simplifying Data Handling with Flexibility"
shortTitle: Abstract Document
description: "Explore the Abstract Document design pattern in Java. Learn its intent, explanation, applicability, benefits, and see real-world examples to implement flexible and dynamic data structures."
category: Structural category: Structural
language: en language: en
tag: tag:
- Abstraction
- Decoupling
- Dynamic typing
- Encapsulation
- Extensibility - Extensibility
- Polymorphism
--- ---
## Intent ## Intent of Abstract Document Design Pattern
The "Abstract Document" design pattern is a structural design pattern that aims to provide a consistent way to handle The Abstract Document design pattern in Java is a crucial structural design pattern that provides a consistent way to handle hierarchical and tree-like data structures by defining a common interface for various document types. It separates the core document structure from specific data formats, enabling dynamic updates and simplified maintenance.
hierarchical and tree-like data structures by defining a common interface for various document types.
## Explanation ## Detailed Explanation of Abstract Document Pattern with Real-World Examples
The Abstract Document pattern enables handling additional, non-static properties. This pattern The Abstract Document design pattern in Java allows dynamic handling of non-static properties. This pattern uses concept of traits to enable type safety and separate properties of different classes into set of interfaces.
uses concept of traits to enable type safety and separate properties of different classes into
set of interfaces.
Real world example Real-world example
> Consider a car that consists of multiple parts. However, we don't know if the specific car really has all the parts, or just some of them. Our cars are dynamic and extremely flexible. > Consider a library system implementing the Abstract Document design pattern in Java, where books can have diverse formats and attributes: physical books, eBooks, and audiobooks. Each format has unique properties, such as page count for physical books, file size for eBooks, and duration for audiobooks. The Abstract Document design pattern allows the library system to manage these diverse formats flexibly. By using this pattern, the system can store and retrieve properties dynamically, without needing a rigid structure for each book type, making it easier to add new formats or attributes in the future without significant changes to the codebase.
In plain words In plain words
@@ -27,16 +31,18 @@ In plain words
Wikipedia says Wikipedia says
> An object-oriented structural design pattern for organizing objects in loosely typed key-value stores and exposing > An object-oriented structural design pattern for organizing objects in loosely typed key-value stores and exposing the data using typed views. The purpose of the pattern is to achieve a high degree of flexibility between components in a strongly typed language where new properties can be added to the object-tree on the fly, without losing the support of type-safety. The pattern makes use of traits to separate different properties of a class into different interfaces.
the data using typed views. The purpose of the pattern is to achieve a high degree of flexibility between components
in a strongly typed language where new properties can be added to the object-tree on the fly, without losing the
support of type-safety. The pattern makes use of traits to separate different properties of a class into different
interfaces.
**Programmatic Example** Class diagram
Let's first define the base classes `Document` and `AbstractDocument`. They basically make the object hold a property ![Abstract Document class diagram](./etc/abstract-document.png "Abstract Document class diagram")
map and any amount of child objects.
## Programmatic Example of Abstract Document Pattern in Java
Consider a car that consists of multiple parts. However, we don't know if the specific car really has all the parts, or just some of them. Our cars are dynamic and extremely flexible.
Let's first define the base classes `Document` and `AbstractDocument`. They basically make the object hold a property map and any amount of child objects.
```java ```java
public interface Document { public interface Document {
@@ -78,11 +84,12 @@ public abstract class AbstractDocument implements Document {
.flatMap(Collection::stream) .flatMap(Collection::stream)
.map(constructor); .map(constructor);
} }
...
// Other properties and methods...
} }
``` ```
Next we define an enum `Property` and a set of interfaces for type, price, model and parts. This allows us to create
static looking interface to our `Car` class. Next we define an enum `Property` and a set of interfaces for type, price, model and parts. This allows us to create static looking interface to our `Car` class.
```java ```java
public enum Property { public enum Property {
@@ -103,6 +110,7 @@ public interface HasPrice extends Document {
return Optional.ofNullable((Number) get(Property.PRICE.toString())); return Optional.ofNullable((Number) get(Property.PRICE.toString()));
} }
} }
public interface HasModel extends Document { public interface HasModel extends Document {
default Optional<String> getModel() { default Optional<String> getModel() {
@@ -116,6 +124,13 @@ public interface HasParts extends Document {
return children(Property.PARTS.toString(), Part::new); return children(Property.PARTS.toString(), Part::new);
} }
} }
public class Part extends AbstractDocument implements HasType, HasModel, HasPrice {
public Part(Map<String, Object> properties) {
super(properties);
}
}
``` ```
Now we are ready to introduce the `Car`. Now we are ready to introduce the `Car`.
@@ -132,6 +147,7 @@ public class Car extends AbstractDocument implements HasModel, HasPrice, HasPart
And finally here's how we construct and use the `Car` in a full example. And finally here's how we construct and use the `Car` in a full example.
```java ```java
public static void main(String[] args) {
LOGGER.info("Constructing parts and car"); LOGGER.info("Constructing parts and car");
var wheelProperties = Map.of( var wheelProperties = Map.of(
@@ -160,25 +176,24 @@ And finally here's how we construct and use the `Car` in a full example.
p.getModel().orElse(null), p.getModel().orElse(null),
p.getPrice().orElse(null)) p.getPrice().orElse(null))
); );
}
// Constructing parts and car
// Here is our car:
// model: 300SL
// price: 10000
// parts:
// wheel/15C/100
// door/Lambo/300
``` ```
## Class diagram The program output:
![alt text](./etc/abstract-document.png "Abstract Document Traits and Domain") ```
07:21:57.391 [main] INFO com.iluwatar.abstractdocument.App -- Constructing parts and car
07:21:57.393 [main] INFO com.iluwatar.abstractdocument.App -- Here is our car:
07:21:57.393 [main] INFO com.iluwatar.abstractdocument.App -- -> model: 300SL
07:21:57.394 [main] INFO com.iluwatar.abstractdocument.App -- -> price: 10000
07:21:57.394 [main] INFO com.iluwatar.abstractdocument.App -- -> parts:
07:21:57.395 [main] INFO com.iluwatar.abstractdocument.App -- wheel/15C/100
07:21:57.395 [main] INFO com.iluwatar.abstractdocument.App -- door/Lambo/300
```
## Applicability ## When to Use the Abstract Document Pattern in Java
This pattern is particularly useful in scenarios where you have different types of documents that share some common The Abstract Document design pattern is especially beneficial in scenarios requiring management of different document types in Java that share some common attributes or behaviors, but also have unique attributes or behaviors specific to their individual types. Here are some scenarios where the Abstract Document design pattern can be applicable:
attributes or behaviors, but also have unique attributes or behaviors specific to their individual types. Here are
some scenarios where the Abstract Document design pattern can be applicable:
* Content Management Systems (CMS): In a CMS, you might have various types of content such as articles, images, videos, etc. Each type of content could have shared attributes like creation date, author, and tags, while also having specific attributes like image dimensions for images or video duration for videos. * Content Management Systems (CMS): In a CMS, you might have various types of content such as articles, images, videos, etc. Each type of content could have shared attributes like creation date, author, and tags, while also having specific attributes like image dimensions for images or video duration for videos.
@@ -194,13 +209,39 @@ some scenarios where the Abstract Document design pattern can be applicable:
* Project Management Tools: In project management applications, you could have different types of tasks like to-do items, milestones, and issues. The Abstract Document pattern could be used to handle general attributes like task name and assignee, while allowing for specific attributes like milestone date or issue priority. * Project Management Tools: In project management applications, you could have different types of tasks like to-do items, milestones, and issues. The Abstract Document pattern could be used to handle general attributes like task name and assignee, while allowing for specific attributes like milestone date or issue priority.
The key idea behind the Abstract Document design pattern is to provide a flexible and extensible way to manage different * Documents have diverse and evolving attribute structures.
types of documents or entities with shared and distinct attributes. By defining a common interface and implementing it
across various document types, you can achieve a more organized and consistent approach to handling complex data
structures.
## Credits * Dynamically adding new properties is a common requirement.
* [Wikipedia: Abstract Document Pattern](https://en.wikipedia.org/wiki/Abstract_Document_Pattern) * Decoupling data access from specific formats is crucial.
* [Martin Fowler: Dealing with properties](http://martinfowler.com/apsupp/properties.pdf)
* [Pattern-Oriented Software Architecture Volume 4: A Pattern Language for Distributed Computing (v. 4)](https://www.amazon.com/gp/product/0470059028/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0470059028&linkId=e3aacaea7017258acf184f9f3283b492) * Maintainability and flexibility are critical for the codebase.
The key idea behind the Abstract Document design pattern is to provide a flexible and extensible way to manage different types of documents or entities with shared and distinct attributes. By defining a common interface and implementing it across various document types, you can achieve a more organized and consistent approach to handling complex data structures.
## Benefits and Trade-offs of Abstract Document Pattern
Benefits:
* Flexibility: Accommodates varied document structures and properties.
* Extensibility: Dynamically add new attributes without breaking existing code.
* Maintainability: Promotes clean and adaptable code due to separation of concerns.
* Reusability: Typed views enable code reuse for accessing specific attribute types.
Trade-offs:
* Complexity: Requires defining interfaces and views, adding implementation overhead.
* Performance: Might introduce slight performance overhead compared to direct data access.
## References and Credits
* [Design Patterns: Elements of Reusable Object-Oriented Software](https://amzn.to/3w0pvKI)
* [Java Design Patterns: A Hands-On Experience with Real-World Examples](https://amzn.to/3yhh525)
* [Pattern-Oriented Software Architecture Volume 4: A Pattern Language for Distributed Computing (v. 4)](https://amzn.to/49zRP4R)
* [Patterns of Enterprise Application Architecture](https://amzn.to/3WfKBPR)
* [Abstract Document Pattern (Wikipedia)](https://en.wikipedia.org/wiki/Abstract_Document_Pattern)
* [Dealing with Properties (Martin Fowler)](http://martinfowler.com/apsupp/properties.pdf)
+8
View File
@@ -34,6 +34,14 @@
</parent> </parent>
<artifactId>abstract-document</artifactId> <artifactId>abstract-document</artifactId>
<dependencies> <dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.junit.jupiter</groupId> <groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId> <artifactId>junit-jupiter-engine</artifactId>
@@ -31,48 +31,71 @@ import java.util.Objects;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Stream; import java.util.stream.Stream;
/** /** Abstract implementation of Document interface. */
* Abstract implementation of Document interface.
*/
public abstract class AbstractDocument implements Document { public abstract class AbstractDocument implements Document {
private final Map<String, Object> properties; private final Map<String, Object> documentProperties;
protected AbstractDocument(Map<String, Object> properties) { protected AbstractDocument(Map<String, Object> properties) {
Objects.requireNonNull(properties, "properties map is required"); Objects.requireNonNull(properties, "properties map is required");
this.properties = properties; this.documentProperties = properties;
} }
@Override @Override
public Void put(String key, Object value) { public Void put(String key, Object value) {
properties.put(key, value); documentProperties.put(key, value);
return null; return null;
} }
@Override @Override
public Object get(String key) { public Object get(String key) {
return properties.get(key); return documentProperties.get(key);
} }
@Override @Override
public <T> Stream<T> children(String key, Function<Map<String, Object>, T> constructor) { public <T> Stream<T> children(String key, Function<Map<String, Object>, T> childConstructor) {
return Stream.ofNullable(get(key)) return Stream.ofNullable(get(key))
.filter(Objects::nonNull) .filter(Objects::nonNull)
.map(el -> (List<Map<String, Object>>) el) .map(el -> (List<Map<String, Object>>) el)
.findAny() .findAny()
.stream() .stream()
.flatMap(Collection::stream) .flatMap(Collection::stream)
.map(constructor); .map(childConstructor);
} }
@Override @Override
public String toString() { public String toString() {
return buildStringRepresentation();
}
private String buildStringRepresentation() {
var builder = new StringBuilder(); var builder = new StringBuilder();
builder.append(getClass().getName()).append("["); builder.append(getClass().getName()).append("[");
properties.forEach((key, value) -> builder.append("[").append(key).append(" : ").append(value)
.append("]")); // Explaining variable for document properties map
Map<String, Object> documentProperties = this.documentProperties;
// Explaining variable for the size of document properties map
int numProperties = documentProperties.size();
// Explaining variable for tracking the current property index
int currentPropertyIndex = 0;
// Iterate over document properties map
for (Map.Entry<String, Object> entry : documentProperties.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
// Append key-value pair
builder.append("[").append(key).append(" : ").append(value).append("]");
// Add comma if not last property
if (++currentPropertyIndex < numProperties) {
builder.append(", ");
}
}
builder.append("]"); builder.append("]");
return builder.toString(); return builder.toString();
} }
} }
@@ -49,20 +49,26 @@ public class App {
public static void main(String[] args) { public static void main(String[] args) {
LOGGER.info("Constructing parts and car"); LOGGER.info("Constructing parts and car");
var wheelProperties = Map.of( var wheelProperties =
Map.of(
Property.TYPE.toString(), "wheel", Property.TYPE.toString(), "wheel",
Property.MODEL.toString(), "15C", Property.MODEL.toString(), "15C",
Property.PRICE.toString(), 100L); Property.PRICE.toString(), 100L);
var doorProperties = Map.of( var doorProperties =
Map.of(
Property.TYPE.toString(), "door", Property.TYPE.toString(), "door",
Property.MODEL.toString(), "Lambo", Property.MODEL.toString(), "Lambo",
Property.PRICE.toString(), 300L); Property.PRICE.toString(), 300L);
var carProperties = Map.of( var carProperties =
Property.MODEL.toString(), "300SL", Map.of(
Property.PRICE.toString(), 10000L, Property.MODEL.toString(),
Property.PARTS.toString(), List.of(wheelProperties, doorProperties)); "300SL",
Property.PRICE.toString(),
10000L,
Property.PARTS.toString(),
List.of(wheelProperties, doorProperties));
var car = new Car(carProperties); var car = new Car(carProperties);
@@ -70,10 +76,13 @@ public class App {
LOGGER.info("-> model: {}", car.getModel().orElseThrow()); LOGGER.info("-> model: {}", car.getModel().orElseThrow());
LOGGER.info("-> price: {}", car.getPrice().orElseThrow()); LOGGER.info("-> price: {}", car.getPrice().orElseThrow());
LOGGER.info("-> parts: "); LOGGER.info("-> parts: ");
car.getParts().forEach(p -> LOGGER.info("\t{}/{}/{}", car.getParts()
.forEach(
p ->
LOGGER.info(
"\t{}/{}/{}",
p.getType().orElse(null), p.getType().orElse(null),
p.getModel().orElse(null), p.getModel().orElse(null),
p.getPrice().orElse(null)) p.getPrice().orElse(null)));
);
} }
} }
@@ -28,9 +28,7 @@ import java.util.Map;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Stream; import java.util.stream.Stream;
/** /** Document interface. */
* Document interface.
*/
public interface Document { public interface Document {
/** /**
@@ -27,13 +27,10 @@ package com.iluwatar.abstractdocument.domain;
import com.iluwatar.abstractdocument.AbstractDocument; import com.iluwatar.abstractdocument.AbstractDocument;
import java.util.Map; import java.util.Map;
/** /** Car entity. */
* Car entity.
*/
public class Car extends AbstractDocument implements HasModel, HasPrice, HasParts { public class Car extends AbstractDocument implements HasModel, HasPrice, HasParts {
public Car(Map<String, Object> properties) { public Car(Map<String, Object> properties) {
super(properties); super(properties);
} }
} }
@@ -28,13 +28,10 @@ import com.iluwatar.abstractdocument.Document;
import com.iluwatar.abstractdocument.domain.enums.Property; import com.iluwatar.abstractdocument.domain.enums.Property;
import java.util.Optional; import java.util.Optional;
/** /** HasModel trait for static access to 'model' property. */
* HasModel trait for static access to 'model' property.
*/
public interface HasModel extends Document { public interface HasModel extends Document {
default Optional<String> getModel() { default Optional<String> getModel() {
return Optional.ofNullable((String) get(Property.MODEL.toString())); return Optional.ofNullable((String) get(Property.MODEL.toString()));
} }
} }
@@ -28,13 +28,10 @@ import com.iluwatar.abstractdocument.Document;
import com.iluwatar.abstractdocument.domain.enums.Property; import com.iluwatar.abstractdocument.domain.enums.Property;
import java.util.stream.Stream; import java.util.stream.Stream;
/** /** HasParts trait for static access to 'parts' property. */
* HasParts trait for static access to 'parts' property.
*/
public interface HasParts extends Document { public interface HasParts extends Document {
default Stream<Part> getParts() { default Stream<Part> getParts() {
return children(Property.PARTS.toString(), Part::new); return children(Property.PARTS.toString(), Part::new);
} }
} }
@@ -28,13 +28,10 @@ import com.iluwatar.abstractdocument.Document;
import com.iluwatar.abstractdocument.domain.enums.Property; import com.iluwatar.abstractdocument.domain.enums.Property;
import java.util.Optional; import java.util.Optional;
/** /** HasPrice trait for static access to 'price' property. */
* HasPrice trait for static access to 'price' property.
*/
public interface HasPrice extends Document { public interface HasPrice extends Document {
default Optional<Number> getPrice() { default Optional<Number> getPrice() {
return Optional.ofNullable((Number) get(Property.PRICE.toString())); return Optional.ofNullable((Number) get(Property.PRICE.toString()));
} }
} }
@@ -28,13 +28,10 @@ import com.iluwatar.abstractdocument.Document;
import com.iluwatar.abstractdocument.domain.enums.Property; import com.iluwatar.abstractdocument.domain.enums.Property;
import java.util.Optional; import java.util.Optional;
/** /** HasType trait for static access to 'type' property. */
* HasType trait for static access to 'type' property.
*/
public interface HasType extends Document { public interface HasType extends Document {
default Optional<String> getType() { default Optional<String> getType() {
return Optional.ofNullable((String) get(Property.TYPE.toString())); return Optional.ofNullable((String) get(Property.TYPE.toString()));
} }
} }
@@ -27,13 +27,10 @@ package com.iluwatar.abstractdocument.domain;
import com.iluwatar.abstractdocument.AbstractDocument; import com.iluwatar.abstractdocument.AbstractDocument;
import java.util.Map; import java.util.Map;
/** /** Part entity. */
* Part entity.
*/
public class Part extends AbstractDocument implements HasType, HasModel, HasPrice { public class Part extends AbstractDocument implements HasType, HasModel, HasPrice {
public Part(Map<String, Object> properties) { public Part(Map<String, Object> properties) {
super(properties); super(properties);
} }
} }
@@ -24,10 +24,10 @@
*/ */
package com.iluwatar.abstractdocument.domain.enums; package com.iluwatar.abstractdocument.domain.enums;
/** /** Enum To Describe Property type. */
* Enum To Describe Property type.
*/
public enum Property { public enum Property {
PARTS,
PARTS, TYPE, PRICE, MODEL TYPE,
PRICE,
MODEL
} }
@@ -24,16 +24,14 @@
*/ */
package com.iluwatar.abstractdocument; package com.iluwatar.abstractdocument;
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*; /** AbstractDocument test class */
/**
* AbstractDocument test class
*/
class AbstractDocumentTest { class AbstractDocumentTest {
private static final String KEY = "key"; private static final String KEY = "key";
@@ -80,4 +78,53 @@ class AbstractDocumentTest {
assertTrue(document.toString().contains(VALUE)); assertTrue(document.toString().contains(VALUE));
} }
@Test
void shouldHandleExceptionDuringConstruction() {
Map<String, Object> invalidProperties =
null; // Invalid properties, causing NullPointerException
// Throw null pointer exception
assertThrows(
NullPointerException.class,
() -> {
// Attempt to construct a document with invalid properties
new DocumentImplementation(invalidProperties);
});
}
@Test
void shouldPutAndGetNestedDocument() {
// Creating a nested document
DocumentImplementation nestedDocument = new DocumentImplementation(new HashMap<>());
nestedDocument.put("nestedKey", "nestedValue");
document.put("nested", nestedDocument);
// Retrieving the nested document
DocumentImplementation retrievedNestedDocument =
(DocumentImplementation) document.get("nested");
assertNotNull(retrievedNestedDocument);
assertEquals("nestedValue", retrievedNestedDocument.get("nestedKey"));
}
@Test
void shouldUpdateExistingValue() {
// Arrange
final String key = "key";
final String originalValue = "originalValue";
final String updatedValue = "updatedValue";
// Initializing the value
document.put(key, originalValue);
// Verifying that the initial value is retrieved correctly
assertEquals(originalValue, document.get(key));
// Updating the value
document.put(key, updatedValue);
// Verifying that the updated value is retrieved correctly
assertEquals(updatedValue, document.get(key));
}
} }
@@ -24,25 +24,21 @@
*/ */
package com.iluwatar.abstractdocument; package com.iluwatar.abstractdocument;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
/** import org.junit.jupiter.api.Test;
* Simple App test
*/ /** Simple App test */
class AppTest { class AppTest {
/** /**
* Issue: Add at least one assertion to this test case. * Issue: Add at least one assertion to this test case.
* *
* Solution: Inserted assertion to check whether the execution of the main method in {@link App} * <p>Solution: Inserted assertion to check whether the execution of the main method in {@link
* throws an exception. * App} throws an exception.
*/ */
@Test @Test
void shouldExecuteAppWithoutException() { void shouldExecuteAppWithoutException() {
assertDoesNotThrow(() -> App.main(null)); assertDoesNotThrow(() -> App.main(null));
} }
} }
@@ -24,18 +24,16 @@
*/ */
package com.iluwatar.abstractdocument; package com.iluwatar.abstractdocument;
import static org.junit.jupiter.api.Assertions.assertEquals;
import com.iluwatar.abstractdocument.domain.Car; import com.iluwatar.abstractdocument.domain.Car;
import com.iluwatar.abstractdocument.domain.Part; import com.iluwatar.abstractdocument.domain.Part;
import com.iluwatar.abstractdocument.domain.enums.Property; import com.iluwatar.abstractdocument.domain.enums.Property;
import org.junit.jupiter.api.Test;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals; /** Test for Part and Car */
/**
* Test for Part and Car
*/
class DomainTest { class DomainTest {
private static final String TEST_PART_TYPE = "test-part-type"; private static final String TEST_PART_TYPE = "test-part-type";
@@ -47,11 +45,11 @@ class DomainTest {
@Test @Test
void shouldConstructPart() { void shouldConstructPart() {
var partProperties = Map.of( var partProperties =
Map.of(
Property.TYPE.toString(), TEST_PART_TYPE, Property.TYPE.toString(), TEST_PART_TYPE,
Property.MODEL.toString(), TEST_PART_MODEL, Property.MODEL.toString(), TEST_PART_MODEL,
Property.PRICE.toString(), (Object) TEST_PART_PRICE Property.PRICE.toString(), (Object) TEST_PART_PRICE);
);
var part = new Part(partProperties); var part = new Part(partProperties);
assertEquals(TEST_PART_TYPE, part.getType().orElseThrow()); assertEquals(TEST_PART_TYPE, part.getType().orElseThrow());
assertEquals(TEST_PART_MODEL, part.getModel().orElseThrow()); assertEquals(TEST_PART_MODEL, part.getModel().orElseThrow());
@@ -60,15 +58,14 @@ class DomainTest {
@Test @Test
void shouldConstructCar() { void shouldConstructCar() {
var carProperties = Map.of( var carProperties =
Map.of(
Property.MODEL.toString(), TEST_CAR_MODEL, Property.MODEL.toString(), TEST_CAR_MODEL,
Property.PRICE.toString(), TEST_CAR_PRICE, Property.PRICE.toString(), TEST_CAR_PRICE,
Property.PARTS.toString(), List.of(Map.of(), Map.of()) Property.PARTS.toString(), List.of(Map.of(), Map.of()));
);
var car = new Car(carProperties); var car = new Car(carProperties);
assertEquals(TEST_CAR_MODEL, car.getModel().orElseThrow()); assertEquals(TEST_CAR_MODEL, car.getModel().orElseThrow());
assertEquals(TEST_CAR_PRICE, car.getPrice().orElseThrow()); assertEquals(TEST_CAR_PRICE, car.getPrice().orElseThrow());
assertEquals(2, car.getParts().count()); assertEquals(2, car.getParts().count());
} }
} }
+96 -98
View File
@@ -1,25 +1,32 @@
--- ---
title: Abstract Factory title: "Abstract Factory Pattern in Java: Mastering Object Creation Elegantly"
shortTitle: Abstract Factory
description: "Learn the Abstract Factory pattern in Java with real-world examples, class diagrams, and tutorials. Understand its intent, applicability, benefits, and known uses to enhance your design pattern knowledge."
category: Creational category: Creational
language: en language: en
tag: tag:
- Abstraction
- Decoupling
- Gang of Four - Gang of Four
- Instantiation
- Polymorphism
--- ---
## Also known as ## Also known as
Kit * Kit
## Intent ## Intent of Abstract Factory Design Pattern
Provide an interface for creating families of related or dependent The Abstract Factory pattern in Java provides an interface for creating families of related or dependent objects without specifying their concrete classes, enhancing modularity and flexibility in software design.
objects without specifying their concrete classes.
## Explanation ## Detailed Explanation of Abstract Factory Pattern with Real-World Examples
Real-world example Real-world example
> To create a kingdom we need objects with a common theme. The elven kingdom needs an elven king, elven castle, and elven army whereas the orcish kingdom needs an orcish king, orcish castle, and orcish army. There is a dependency between the objects in the kingdom. > Imagine a furniture company that uses the Abstract Factory pattern in Java to produce various styles of furniture: modern, Victorian, and rustic. Each style includes products like chairs, tables, and sofas. To ensure consistency within each style, the company uses an Abstract Factory pattern.
>
> In this scenario, the Abstract Factory is an interface for creating families of related furniture objects (chairs, tables, sofas). Each concrete factory (ModernFurnitureFactory, VictorianFurnitureFactory, RusticFurnitureFactory) implements the Abstract Factory interface and creates a set of products that match the specific style. This way, clients can create a whole set of modern or Victorian furniture without worrying about the details of their instantiation. This maintains a consistent style and allows easy swapping of one style of furniture for another.
In plain words In plain words
@@ -29,10 +36,15 @@ Wikipedia says
> The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme without specifying their concrete classes > The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme without specifying their concrete classes
**Programmatic Example** Class diagram
Translating the kingdom example above. First of all, we have some interfaces and implementation for the objects in the ![Abstract Factory class diagram](./etc/abstract-factory.urm.png "Abstract Factory class diagram")
kingdom.
## Programmatic Example of Abstract Factory in Java
To create a kingdom using the Abstract Factory pattern in Java, we need objects with a common theme. The elven kingdom needs an elven king, elven castle, and elven army whereas the orcish kingdom needs an orcish king, orcish castle, and orcish army. There is a dependency between the objects in the kingdom.
Translating the kingdom example above. First of all, we have some interfaces and implementation for the objects in the kingdom.
```java ```java
public interface Castle { public interface Castle {
@@ -50,20 +62,25 @@ public interface Army {
// Elven implementations -> // Elven implementations ->
public class ElfCastle implements Castle { public class ElfCastle implements Castle {
static final String DESCRIPTION = "This is the elven castle!"; static final String DESCRIPTION = "This is the elven castle!";
@Override @Override
public String getDescription() { public String getDescription() {
return DESCRIPTION; return DESCRIPTION;
} }
} }
public class ElfKing implements King { public class ElfKing implements King {
static final String DESCRIPTION = "This is the elven king!"; static final String DESCRIPTION = "This is the elven king!";
@Override @Override
public String getDescription() { public String getDescription() {
return DESCRIPTION; return DESCRIPTION;
} }
} }
public class ElfArmy implements Army { public class ElfArmy implements Army {
static final String DESCRIPTION = "This is the elven Army!"; static final String DESCRIPTION = "This is the elven Army!";
@Override @Override
public String getDescription() { public String getDescription() {
return DESCRIPTION; return DESCRIPTION;
@@ -71,7 +88,6 @@ public class ElfArmy implements Army {
} }
// Orcish implementations similarly -> ... // Orcish implementations similarly -> ...
``` ```
Then we have the abstraction and implementations for the kingdom factory. Then we have the abstraction and implementations for the kingdom factory.
@@ -79,7 +95,9 @@ Then we have the abstraction and implementations for the kingdom factory.
```java ```java
public interface KingdomFactory { public interface KingdomFactory {
Castle createCastle(); Castle createCastle();
King createKing(); King createKing();
Army createArmy(); Army createArmy();
} }
@@ -101,49 +119,10 @@ public class ElfKingdomFactory implements KingdomFactory {
} }
} }
public class OrcKingdomFactory implements KingdomFactory { // Orcish implementations similarly -> ...
@Override
public Castle createCastle() {
return new OrcCastle();
}
@Override
public King createKing() {
return new OrcKing();
}
@Override
public Army createArmy() {
return new OrcArmy();
}
}
``` ```
Now we have the abstract factory that lets us make a family of related objects i.e. elven kingdom factory creates elven castle, king and army, etc. Now, we can design a factory for our different kingdom factories. In this example, we created `FactoryMaker`, responsible for returning an instance of either `ElfKingdomFactory` or `OrcKingdomFactory`. The client can use `FactoryMaker` to create the desired concrete factory which, in turn, will produce different concrete objects (derived from `Army`, `King`, `Castle`). In this example, we also used an enum to parameterize which type of kingdom factory the client will ask for.
```java
var factory = new ElfKingdomFactory();
var castle = factory.createCastle();
var king = factory.createKing();
var army = factory.createArmy();
castle.getDescription();
king.getDescription();
army.getDescription();
```
Program output:
```java
This is the elven castle!
This is the elven king!
This is the elven Army!
```
Now, we can design a factory for our different kingdom factories. In this example, we created `FactoryMaker`, responsible for returning an instance of either `ElfKingdomFactory` or `OrcKingdomFactory`.
The client can use `FactoryMaker` to create the desired concrete factory which, in turn, will produce different concrete objects (derived from `Army`, `King`, `Castle`).
In this example, we also used an enum to parameterize which type of kingdom factory the client will ask for.
```java ```java
public static class FactoryMaker { public static class FactoryMaker {
@@ -156,74 +135,93 @@ public static class FactoryMaker {
return switch (type) { return switch (type) {
case ELF -> new ElfKingdomFactory(); case ELF -> new ElfKingdomFactory();
case ORC -> new OrcKingdomFactory(); case ORC -> new OrcKingdomFactory();
default -> throw new IllegalArgumentException("KingdomType not supported.");
}; };
} }
} }
public static void main(String[] args) {
var app = new App();
LOGGER.info("Elf Kingdom");
app.createKingdom(FactoryMaker.makeFactory(KingdomType.ELF));
LOGGER.info(app.getArmy().getDescription());
LOGGER.info(app.getCastle().getDescription());
LOGGER.info(app.getKing().getDescription());
LOGGER.info("Orc Kingdom");
app.createKingdom(FactoryMaker.makeFactory(KingdomType.ORC));
--similar use of the orc factory
}
``` ```
## Class diagram Here is the main function of our example application:
![alt text](./etc/abstract-factory.urm.png "Abstract Factory class diagram") ```java
LOGGER.info("elf kingdom");
createKingdom(Kingdom.FactoryMaker.KingdomType.ELF);
LOGGER.info(kingdom.getArmy().getDescription());
LOGGER.info(kingdom.getCastle().getDescription());
LOGGER.info(kingdom.getKing().getDescription());
LOGGER.info("orc kingdom");
createKingdom(Kingdom.FactoryMaker.KingdomType.ORC);
LOGGER.info(kingdom.getArmy().getDescription());
LOGGER.info(kingdom.getCastle().getDescription());
LOGGER.info(kingdom.getKing().getDescription());
```
## Applicability The program output:
Use the Abstract Factory pattern when ```
07:35:46.340 [main] INFO com.iluwatar.abstractfactory.App -- elf kingdom
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the elven army!
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the elven castle!
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the elven king!
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- orc kingdom
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the orc army!
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the orc castle!
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the orc king!
```
* The system should be independent of how its products are created, composed, and represented ## When to Use the Abstract Factory Pattern in Java
* The system should be configured with one of the multiple families of products
* The family of related product objects is designed to be used together, and you need to enforce this constraint
* You want to provide a class library of products, and you want to reveal just their interfaces, not their implementations
* The lifetime of the dependency is conceptually shorter than the lifetime of the consumer.
* You need a run-time value to construct a particular dependency
* You want to decide which product to call from a family at runtime.
* You need to supply one or more parameters only known at run-time before you can resolve a dependency.
* When you need consistency among products
* You don’t want to change existing code when adding new products or families of products to the program.
Example use cases Use the Abstract Factory pattern in Java when:
* Selecting to call to the appropriate implementation of FileSystemAcmeService or DatabaseAcmeService or NetworkAcmeService at runtime. * The system should be independent of how its products are created, composed, and represented.
* Unit test case writing becomes much easier * You need to configure the system with one of multiple families of products.
* UI tools for different OS * A family of related product objects must be used together, enforcing consistency.
* You want to provide a class library of products, exposing only their interfaces, not their implementations.
* The lifetime of dependencies is shorter than the consumer's lifetime.
* Dependencies need to be constructed using runtime values or parameters.
* You need to choose which product to use from a family at runtime.
* Adding new products or families should not require changes to existing code.
## Consequences ## Abstract Factory Pattern Java Tutorials
* Dependency injection in java hides the service class dependencies that can lead to runtime errors that would have been caught at compile time. * [Abstract Factory Design Pattern in Java (DigitalOcean)](https://www.digitalocean.com/community/tutorials/abstract-factory-design-pattern-in-java)
* While the pattern is great when creating predefined objects, adding the new ones might be challenging. * [Abstract Factory(Refactoring Guru)](https://refactoring.guru/design-patterns/abstract-factory)
* The code becomes more complicated than it should be since a lot of new interfaces and classes are introduced along with the pattern.
## Tutorials ## Benefits and Trade-offs of Abstract Factory Pattern
* [Abstract Factory Pattern Tutorial](https://www.journaldev.com/1418/abstract-factory-design-pattern-in-java) Benefits:
## Known uses * Flexibility: Easily switch between product families without code modifications.
* Decoupling: Client code only interacts with abstract interfaces, promoting portability and maintainability.
* Reusability: Abstract factories and products facilitate component reuse across projects.
* Maintainability: Changes to individual product families are localized, simplifying updates.
Trade-offs:
* Complexity: Defining abstract interfaces and concrete factories adds initial overhead.
* Indirectness: Client code interacts with products indirectly through factories, potentially reducing transparency.
## Real-World Applications of Abstract Factory Pattern in Java
* Java Swing's `LookAndFeel` classes for providing different look-and-feel options.
* Various implementations in the Java Abstract Window Toolkit (AWT) for creating different GUI components.
* [javax.xml.parsers.DocumentBuilderFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/parsers/DocumentBuilderFactory.html) * [javax.xml.parsers.DocumentBuilderFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/parsers/DocumentBuilderFactory.html)
* [javax.xml.transform.TransformerFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newInstance--) * [javax.xml.transform.TransformerFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newInstance--)
* [javax.xml.xpath.XPathFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/xpath/XPathFactory.html#newInstance--) * [javax.xml.xpath.XPathFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/xpath/XPathFactory.html#newInstance--)
## Related patterns ## Related Java Design Patterns
* [Factory Method](https://java-design-patterns.com/patterns/factory-method/) * [Factory Method](https://java-design-patterns.com/patterns/factory-method/): Abstract Factory uses Factory Methods to create products.
* [Factory Kit](https://java-design-patterns.com/patterns/factory-kit/) * [Singleton](https://java-design-patterns.com/patterns/singleton/): Abstract Factory classes are often implemented as Singletons.
* [Factory Kit](https://java-design-patterns.com/patterns/factory-kit/): Similar to Abstract Factory but focuses on configuring and managing a set of related objects in a flexible way.
## Credits ## References and Credits
* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) * [Design Patterns: Elements of Reusable Object-Oriented Software](https://amzn.to/3w0pvKI)
* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) * [Design Patterns in Java](https://amzn.to/3Syw0vC)
* [Head First Design Patterns: Building Extensible and Maintainable Object-Oriented Software](https://amzn.to/49NGldq)
* [Java Design Patterns: A Hands-On Experience with Real-World Examples](https://amzn.to/3HWNf4U)
+8
View File
@@ -34,6 +34,14 @@
</parent> </parent>
<artifactId>abstract-factory</artifactId> <artifactId>abstract-factory</artifactId>
<dependencies> <dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.junit.jupiter</groupId> <groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId> <artifactId>junit-jupiter-engine</artifactId>
@@ -24,6 +24,7 @@
*/ */
package com.iluwatar.abstractfactory; package com.iluwatar.abstractfactory;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
/** /**
@@ -41,14 +42,11 @@ import lombok.extern.slf4j.Slf4j;
* both concrete implementations to create a king, a castle, and an army. * both concrete implementations to create a king, a castle, and an army.
*/ */
@Slf4j @Slf4j
@Getter
public class App implements Runnable { public class App implements Runnable {
private final Kingdom kingdom = new Kingdom(); private final Kingdom kingdom = new Kingdom();
public Kingdom getKingdom() {
return kingdom;
}
/** /**
* Program entry point. * Program entry point.
* *
@@ -76,6 +74,7 @@ public class App implements Runnable {
/** /**
* Creates kingdom. * Creates kingdom.
*
* @param kingdomType type of Kingdom * @param kingdomType type of Kingdom
*/ */
public void createKingdom(final Kingdom.FactoryMaker.KingdomType kingdomType) { public void createKingdom(final Kingdom.FactoryMaker.KingdomType kingdomType) {
@@ -24,9 +24,7 @@
*/ */
package com.iluwatar.abstractfactory; package com.iluwatar.abstractfactory;
/** /** Army interface. */
* Army interface.
*/
public interface Army { public interface Army {
String getDescription(); String getDescription();
@@ -24,9 +24,7 @@
*/ */
package com.iluwatar.abstractfactory; package com.iluwatar.abstractfactory;
/** /** Castle interface. */
* Castle interface.
*/
public interface Castle { public interface Castle {
String getDescription(); String getDescription();
@@ -24,9 +24,7 @@
*/ */
package com.iluwatar.abstractfactory; package com.iluwatar.abstractfactory;
/** /** ElfArmy. */
* ElfArmy.
*/
public class ElfArmy implements Army { public class ElfArmy implements Army {
static final String DESCRIPTION = "This is the elven army!"; static final String DESCRIPTION = "This is the elven army!";
@@ -24,9 +24,7 @@
*/ */
package com.iluwatar.abstractfactory; package com.iluwatar.abstractfactory;
/** /** ElfCastle. */
* ElfCastle.
*/
public class ElfCastle implements Castle { public class ElfCastle implements Castle {
static final String DESCRIPTION = "This is the elven castle!"; static final String DESCRIPTION = "This is the elven castle!";
@@ -24,9 +24,7 @@
*/ */
package com.iluwatar.abstractfactory; package com.iluwatar.abstractfactory;
/** /** ElfKing. */
* ElfKing.
*/
public class ElfKing implements King { public class ElfKing implements King {
static final String DESCRIPTION = "This is the elven king!"; static final String DESCRIPTION = "This is the elven king!";
@@ -24,9 +24,7 @@
*/ */
package com.iluwatar.abstractfactory; package com.iluwatar.abstractfactory;
/** /** ElfKingdomFactory concrete factory. */
* ElfKingdomFactory concrete factory.
*/
public class ElfKingdomFactory implements KingdomFactory { public class ElfKingdomFactory implements KingdomFactory {
@Override @Override
@@ -43,5 +41,4 @@ public class ElfKingdomFactory implements KingdomFactory {
public Army createArmy() { public Army createArmy() {
return new ElfArmy(); return new ElfArmy();
} }
} }
@@ -24,9 +24,7 @@
*/ */
package com.iluwatar.abstractfactory; package com.iluwatar.abstractfactory;
/** /** King interface. */
* King interface.
*/
public interface King { public interface King {
String getDescription(); String getDescription();
@@ -27,9 +27,7 @@ package com.iluwatar.abstractfactory;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
/** /** Helper class to manufacture {@link KingdomFactory} beans. */
* Helper class to manufacture {@link KingdomFactory} beans.
*/
@Getter @Getter
@Setter @Setter
public class Kingdom { public class Kingdom {
@@ -38,26 +36,20 @@ public class Kingdom {
private Castle castle; private Castle castle;
private Army army; private Army army;
/** /** The factory of kingdom factories. */
* The factory of kingdom factories.
*/
public static class FactoryMaker { public static class FactoryMaker {
/** /** Enumeration for the different types of Kingdoms. */
* Enumeration for the different types of Kingdoms.
*/
public enum KingdomType { public enum KingdomType {
ELF, ORC ELF,
ORC
} }
/** /** The factory method to create KingdomFactory concrete objects. */
* The factory method to create KingdomFactory concrete objects.
*/
public static KingdomFactory makeFactory(KingdomType type) { public static KingdomFactory makeFactory(KingdomType type) {
return switch (type) { return switch (type) {
case ELF -> new ElfKingdomFactory(); case ELF -> new ElfKingdomFactory();
case ORC -> new OrcKingdomFactory(); case ORC -> new OrcKingdomFactory();
default -> throw new IllegalArgumentException("KingdomType not supported.");
}; };
} }
} }
@@ -24,9 +24,7 @@
*/ */
package com.iluwatar.abstractfactory; package com.iluwatar.abstractfactory;
/** /** KingdomFactory factory interface. */
* KingdomFactory factory interface.
*/
public interface KingdomFactory { public interface KingdomFactory {
Castle createCastle(); Castle createCastle();
@@ -34,5 +32,4 @@ public interface KingdomFactory {
King createKing(); King createKing();
Army createArmy(); Army createArmy();
} }
@@ -24,9 +24,7 @@
*/ */
package com.iluwatar.abstractfactory; package com.iluwatar.abstractfactory;
/** /** OrcArmy. */
* OrcArmy.
*/
public class OrcArmy implements Army { public class OrcArmy implements Army {
static final String DESCRIPTION = "This is the orc army!"; static final String DESCRIPTION = "This is the orc army!";
@@ -24,9 +24,7 @@
*/ */
package com.iluwatar.abstractfactory; package com.iluwatar.abstractfactory;
/** /** OrcCastle. */
* OrcCastle.
*/
public class OrcCastle implements Castle { public class OrcCastle implements Castle {
static final String DESCRIPTION = "This is the orc castle!"; static final String DESCRIPTION = "This is the orc castle!";
@@ -24,9 +24,7 @@
*/ */
package com.iluwatar.abstractfactory; package com.iluwatar.abstractfactory;
/** /** OrcKing. */
* OrcKing.
*/
public class OrcKing implements King { public class OrcKing implements King {
static final String DESCRIPTION = "This is the orc king!"; static final String DESCRIPTION = "This is the orc king!";
@@ -24,9 +24,7 @@
*/ */
package com.iluwatar.abstractfactory; package com.iluwatar.abstractfactory;
/** /** OrcKingdomFactory concrete factory. */
* OrcKingdomFactory concrete factory.
*/
public class OrcKingdomFactory implements KingdomFactory { public class OrcKingdomFactory implements KingdomFactory {
@Override @Override
@@ -24,14 +24,12 @@
*/ */
package com.iluwatar.abstractfactory; package com.iluwatar.abstractfactory;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
/** import org.junit.jupiter.api.Test;
* Tests for abstract factory.
*/ /** Tests for abstract factory. */
class AbstractFactoryTest { class AbstractFactoryTest {
private final App app = new App(); private final App app = new App();
@@ -24,18 +24,16 @@
*/ */
package com.iluwatar.abstractfactory; package com.iluwatar.abstractfactory;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
/** import org.junit.jupiter.api.Test;
* Check whether the execution of the main method in {@link App} throws an exception.
*/ /** Check whether the execution of the main method in {@link App} throws an exception. */
class AppTest { class AppTest {
@Test @Test
void shouldExecuteApplicationWithoutException() { void shouldExecuteApplicationWithoutException() {
assertDoesNotThrow(() -> App.main(new String[]{})); assertDoesNotThrow(() -> App.main(new String[] {}));
} }
} }
+123 -28
View File
@@ -1,30 +1,59 @@
--- ---
title: Active Object title: "Active Object Pattern in Java: Achieving Efficient Asynchronous Processing"
shortTitle: Active Object
description: "Learn about the Active Object design pattern in Java. This guide covers asynchronous behavior, concurrency, and practical examples to enhance your Java applications' performance."
category: Concurrency category: Concurrency
language: en language: en
tag: tag:
- Performance - Asynchronous
- Decoupling
- Messaging
- Synchronization
- Thread management
--- ---
## Intent of Active Object Design Pattern
## Intent The Active Object pattern provides a reliable method for asynchronous processing in Java, ensuring responsive applications and efficient thread management. It achieves this by encapsulating tasks within objects that have their own thread and message queue. This separation keeps the main thread responsive and avoids issues like direct thread manipulation or shared state access.
The active object design pattern decouples method execution from method invocation for objects that each reside in their thread of control. The goal is to introduce concurrency, by using asynchronous method invocation, and a scheduler for handling requests.
## Explanation ## Detailed Explanation of Active Object Pattern with Real-World Examples
The class that implements the active object pattern will contain a self-synchronization mechanism without using 'synchronized' methods.
Real-world example Real-world example
>The Orcs are known for their wildness and untameable soul. It seems like they have their own thread of control based on previous behavior. > Imagine a busy restaurant where customers place orders with waiters. Instead of the waiters going to the kitchen to prepare the food themselves, they write the orders on slips and hand them to a dispatcher. The dispatcher manages a pool of chefs who prepare the meals asynchronously. Once a chef is free, they pick up the next order from the queue, prepare the dish, and notify the waiter when it's ready for serving.
>
> In this analogy, the waiters represent the client threads, the dispatcher represents the scheduler, and the chefs represent the method execution in separate threads. This setup allows the waiters to continue taking orders without being blocked by the food preparation process, much like the Active Object pattern decouples method invocation from execution to enhance concurrency.
To implement a creature that has its own thread of control mechanism and expose its API only and not the execution itself, we can use the Active Object pattern. In plain words
> The Active Object pattern decouples method execution from method invocation to improve concurrency and responsiveness in multithreaded applications.
Wikipedia says
> The active object design pattern decouples method execution from method invocation for objects that each reside in their own thread of control.[1] The goal is to introduce concurrency, by using asynchronous method invocation and a scheduler for handling requests.
>
> The pattern consists of six elements:
>
> * A proxy, which provides an interface towards clients with publicly accessible methods.
> * An interface which defines the method request on an active object.
> * A list of pending requests from clients.
> * A scheduler, which decides which request to execute next.
> * The implementation of the active object method.
> * A callback or variable for the client to receive the result.
Sequence diagram
![Active Object sequence diagram](./etc/active-object-sequence-diagram.png)
**Programmatic Example** ## Programmatic Example of Active Object in Java
This section explains how the Active Object design pattern works in Java, highlighting its use in asynchronous task management and concurrency control.
The Orcs are known for their wildness and untameable soul. It seems like they have their own thread of control based on previous behavior. To implement a creature that has its own thread of control mechanism and expose its API only and not the execution itself, we can use the Active Object pattern.
```java ```java
public abstract class ActiveCreature{ public abstract class ActiveCreature {
private final Logger logger = LoggerFactory.getLogger(ActiveCreature.class.getName()); private final Logger logger = LoggerFactory.getLogger(ActiveCreature.class.getName());
private BlockingQueue<Runnable> requests; private BlockingQueue<Runnable> requests;
@@ -56,8 +85,8 @@ public abstract class ActiveCreature{
requests.put(new Runnable() { requests.put(new Runnable() {
@Override @Override
public void run() { public void run() {
logger.info("{} is eating!",name()); logger.info("{} is eating!", name());
logger.info("{} has finished eating!",name()); logger.info("{} has finished eating!", name());
} }
} }
); );
@@ -67,7 +96,7 @@ public abstract class ActiveCreature{
requests.put(new Runnable() { requests.put(new Runnable() {
@Override @Override
public void run() { public void run() {
logger.info("{} has started to roam the wastelands.",name()); logger.info("{} has started to roam the wastelands.", name());
} }
} }
); );
@@ -79,9 +108,9 @@ public abstract class ActiveCreature{
} }
``` ```
We can see that any class that will extend the ActiveCreature class will have its own thread of control to invoke and execute methods. We can see that any class that will extend the `ActiveCreature` class will have its own thread of control to invoke and execute methods.
For example, the Orc class: For example, the `Orc` class:
```java ```java
public class Orc extends ActiveCreature { public class Orc extends ActiveCreature {
@@ -89,13 +118,18 @@ public class Orc extends ActiveCreature {
public Orc(String name) { public Orc(String name) {
super(name); super(name);
} }
} }
``` ```
Now, we can create multiple creatures such as Orcs, tell them to eat and roam, and they will execute it on their own thread of control: Now, we can create multiple creatures such as orcs, tell them to eat and roam, and they will execute it on their own thread of control:
```java ```java
public class App implements Runnable {
private static final Logger logger = LoggerFactory.getLogger(App.class.getName());
private static final int NUM_CREATURES = 3;
public static void main(String[] args) { public static void main(String[] args) {
var app = new App(); var app = new App();
app.run(); app.run();
@@ -103,25 +137,86 @@ Now, we can create multiple creatures such as Orcs, tell them to eat and roam, a
@Override @Override
public void run() { public void run() {
ActiveCreature creature; List<ActiveCreature> creatures = new ArrayList<>();
try { try {
for (int i = 0;i < creatures;i++) { for (int i = 0; i < NUM_CREATURES; i++) {
creature = new Orc(Orc.class.getSimpleName().toString() + i); creatures.add(new Orc(Orc.class.getSimpleName() + i));
creature.eat(); creatures.get(i).eat();
creature.roam(); creatures.get(i).roam();
} }
Thread.sleep(1000); Thread.sleep(1000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
logger.error(e.getMessage()); logger.error(e.getMessage());
Thread.currentThread().interrupt();
} finally {
for (int i = 0; i < NUM_CREATURES; i++) {
creatures.get(i).kill(0);
} }
Runtime.getRuntime().exit(1);
} }
}
}
``` ```
## Class diagram Program output:
![alt text](./etc/active-object.urm.png "Active Object class diagram") ```
09:00:02.501 [Thread-0] INFO com.iluwatar.activeobject.ActiveCreature -- Orc0 is eating!
09:00:02.501 [Thread-2] INFO com.iluwatar.activeobject.ActiveCreature -- Orc2 is eating!
09:00:02.501 [Thread-1] INFO com.iluwatar.activeobject.ActiveCreature -- Orc1 is eating!
09:00:02.504 [Thread-0] INFO com.iluwatar.activeobject.ActiveCreature -- Orc0 has finished eating!
09:00:02.504 [Thread-1] INFO com.iluwatar.activeobject.ActiveCreature -- Orc1 has finished eating!
09:00:02.504 [Thread-0] INFO com.iluwatar.activeobject.ActiveCreature -- Orc0 has started to roam in the wastelands.
09:00:02.504 [Thread-2] INFO com.iluwatar.activeobject.ActiveCreature -- Orc2 has finished eating!
09:00:02.504 [Thread-1] INFO com.iluwatar.activeobject.ActiveCreature -- Orc1 has started to roam in the wastelands.
09:00:02.504 [Thread-2] INFO com.iluwatar.activeobject.ActiveCreature -- Orc2 has started to roam in the wastelands.
```
## Tutorials ## When to Use the Active Object Pattern in Java
* [Android and Java Concurrency: The Active Object Pattern](https://www.youtube.com/watch?v=Cd8t2u5Qmvc) Use the Active Object pattern in Java when:
* when you need to handle asynchronous tasks without blocking the main thread, ensuring better performance and responsiveness.
* When you need to interact with external resources asynchronously.
* When you want to improve the responsiveness of your application.
* When you need to manage concurrent tasks in a modular and maintainable way.
## Active Object Pattern Java Tutorials
* [Android and Java Concurrency: The Active Object Pattern(Douglas Schmidt)](https://www.youtube.com/watch?v=Cd8t2u5Qmvc)
## Real-World Applications of Active Object Pattern in Java
* Real-time trading systems where transaction requests are handled asynchronously.
* GUIs where long-running tasks are executed in the background without freezing the user interface.
* Game programming to handle concurrent updates to game state or AI computations.
## Benefits and Trade-offs of Active Object Pattern
Discover the benefits and trade-offs of using the Active Object pattern in Java, including improved thread safety and potential overhead concerns.
Benefits:
* Improves responsiveness of the main thread.
* Encapsulates concurrency concerns within objects.
* Promotes better code organization and maintainability.
* Provides thread safety and avoids shared state access problems.
Trade-offs:
* Introduces additional overhead due to message passing and thread management.
* May not be suitable for all types of concurrency problems.
## Related Java Design Patterns
* [Command](https://java-design-patterns.com/patterns/command/): Encapsulates a request as an object, similarly to how the Active Object pattern encapsulates method calls.
* [Promise](https://java-design-patterns.com/patterns/promise/): Provides a means to retrieve the result of an asynchronous method call, often used in conjunction with Active Object.
* [Proxy](https://java-design-patterns.com/patterns/proxy/): The Active Object pattern can use a proxy to handle method invocations asynchronously.
## References and Credits
* [Design Patterns: Elements of Reusable Object Software](https://amzn.to/3HYqrBE)
* [Concurrent Programming in Java: Design Principles and Patterns](https://amzn.to/498SRVq)
* [Java Concurrency in Practice](https://amzn.to/4aRMruW)
* [Learning Concurrent Programming in Scala](https://amzn.to/3UE07nV)
* [Pattern Languages of Program Design 3](https://amzn.to/3OI1j61)
* [Pattern-Oriented Software Architecture Volume 2: Patterns for Concurrent and Networked Objects](https://amzn.to/3UgC24V)
Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

+8
View File
@@ -34,6 +34,14 @@
</parent> </parent>
<artifactId>active-object</artifactId> <artifactId>active-object</artifactId>
<dependencies> <dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.junit.jupiter</groupId> <groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId> <artifactId>junit-jupiter-engine</artifactId>
@@ -29,11 +29,7 @@ import java.util.concurrent.LinkedBlockingQueue;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
/** /** ActiveCreature class is the base of the active object example. */
* ActiveCreature class is the base of the active object example.
* @author Noam Greenshtain
*
*/
public abstract class ActiveCreature { public abstract class ActiveCreature {
private static final Logger logger = LoggerFactory.getLogger(ActiveCreature.class.getName()); private static final Logger logger = LoggerFactory.getLogger(ActiveCreature.class.getName());
@@ -46,14 +42,14 @@ public abstract class ActiveCreature {
private int status; // status of the thread of execution. private int status; // status of the thread of execution.
/** /** Constructor and initialization. */
* Constructor and initialization.
*/
protected ActiveCreature(String name) { protected ActiveCreature(String name) {
this.name = name; this.name = name;
this.status = 0; this.status = 0;
this.requests = new LinkedBlockingQueue<>(); this.requests = new LinkedBlockingQueue<>();
thread = new Thread(() -> { thread =
new Thread(
() -> {
boolean infinite = true; boolean infinite = true;
while (infinite) { while (infinite) {
try { try {
@@ -72,10 +68,12 @@ public abstract class ActiveCreature {
/** /**
* Eats the porridge. * Eats the porridge.
*
* @throws InterruptedException due to firing a new Runnable. * @throws InterruptedException due to firing a new Runnable.
*/ */
public void eat() throws InterruptedException { public void eat() throws InterruptedException {
requests.put(() -> { requests.put(
() -> {
logger.info("{} is eating!", name()); logger.info("{} is eating!", name());
logger.info("{} has finished eating!", name()); logger.info("{} has finished eating!", name());
}); });
@@ -83,16 +81,16 @@ public abstract class ActiveCreature {
/** /**
* Roam the wastelands. * Roam the wastelands.
*
* @throws InterruptedException due to firing a new Runnable. * @throws InterruptedException due to firing a new Runnable.
*/ */
public void roam() throws InterruptedException { public void roam() throws InterruptedException {
requests.put(() -> requests.put(() -> logger.info("{} has started to roam in the wastelands.", name()));
logger.info("{} has started to roam in the wastelands.", name())
);
} }
/** /**
* Returns the name of the creature. * Returns the name of the creature.
*
* @return the name of the creature. * @return the name of the creature.
*/ */
public String name() { public String name() {
@@ -101,6 +99,7 @@ public abstract class ActiveCreature {
/** /**
* Kills the thread of execution. * Kills the thread of execution.
*
* @param status of the thread of execution. 0 == OK, the rest is logging an error. * @param status of the thread of execution. 0 == OK, the rest is logging an error.
*/ */
public void kill(int status) { public void kill(int status) {
@@ -110,6 +109,7 @@ public abstract class ActiveCreature {
/** /**
* Returns the status of the thread of execution. * Returns the status of the thread of execution.
*
* @return the status of the thread of execution. * @return the status of the thread of execution.
*/ */
public int getStatus() { public int getStatus() {
@@ -31,9 +31,9 @@ import org.slf4j.LoggerFactory;
/** /**
* The Active Object pattern helps to solve synchronization difficulties without using * The Active Object pattern helps to solve synchronization difficulties without using
* 'synchronized' methods. The active object will contain a thread-safe data structure * 'synchronized' methods. The active object will contain a thread-safe data structure (such as
* (such as BlockingQueue) and use to synchronize method calls by moving the logic of the method * BlockingQueue) and use to synchronize method calls by moving the logic of the method into an
* into an invocator(usually a Runnable) and store it in the DSA. * invocator(usually a Runnable) and store it in the DSA.
* *
* <p>In this example, we fire 20 threads to modify a value in the target class. * <p>In this example, we fire 20 threads to modify a value in the target class.
*/ */
@@ -24,15 +24,10 @@
*/ */
package com.iluwatar.activeobject; package com.iluwatar.activeobject;
/** /** An implementation of the ActiveCreature class. */
* An implementation of the ActiveCreature class.
* @author Noam Greenshtain
*
*/
public class Orc extends ActiveCreature { public class Orc extends ActiveCreature {
public Orc(String name) { public Orc(String name) {
super(name); super(name);
} }
} }
@@ -27,17 +27,16 @@ package com.iluwatar.activeobject;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
class ActiveCreatureTest { class ActiveCreatureTest {
@Test @Test
void executionTest() throws InterruptedException { void executionTest() throws InterruptedException {
ActiveCreature orc = new Orc("orc1"); ActiveCreature orc = new Orc("orc1");
assertEquals("orc1",orc.name()); assertEquals("orc1", orc.name());
assertEquals(0,orc.getStatus()); assertEquals(0, orc.getStatus());
orc.eat(); orc.eat();
orc.roam(); orc.roam();
orc.kill(0); orc.kill(0);
} }
} }
@@ -28,11 +28,10 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
class AppTest { class AppTest {
@Test @Test
void shouldExecuteApplicationWithoutException() { void shouldExecuteApplicationWithoutException() {
assertDoesNotThrow(() -> App.main(new String[]{})); assertDoesNotThrow(() -> App.main(new String[] {}));
} }
} }
+201
View File
@@ -0,0 +1,201 @@
---
title: "Actor Model Pattern in Java: Building Concurrent Systems with Elegance"
shortTitle: Actor Model
description: "Explore the Actor Model pattern in Java with real-world examples and practical implementation. Learn how to build scalable, message-driven systems using actors, messages, and asynchronous communication."
category: Concurrency
language: en
tag:
- Concurrency
- Messaging
- Isolation
- Asynchronous
- Distributed Systems
- Actor Model
---
## Also Known As
- Message-passing concurrency
- Actor-based concurrency
---
## Intent of Actor Model Pattern
The Actor Model pattern enables the construction of highly concurrent, distributed, and fault-tolerant systems by using isolated components (actors) that interact exclusively through asynchronous message passing.
---
## Detailed Explanation of Actor Model Pattern with Real-World Examples
### 📦 Real-world Example
Imagine a customer service system:
- Each **customer support agent** is an **actor**.
- Customers **send questions (messages)** to agents.
- Each agent handles one request at a time and can **respond asynchronously** without interfering with other agents.
---
### 🧠 In Plain Words
> "Actors are like independent workers that never share memory and only communicate through messages."
---
### 📖 Wikipedia Says
> [Actor model](https://en.wikipedia.org/wiki/Actor_model) is a mathematical model of concurrent computation that treats "actors" as the universal primitives of concurrent computation.
---
### 🧹 Architecture Diagram
![UML Class Diagram](./etc/Actor_Model_UML_Class_Diagram.png)
---
## Programmatic Example of Actor Model Pattern in Java
### Actor.java
```java
public abstract class Actor implements Runnable {
@Setter @Getter private String actorId;
private final BlockingQueue<Message> mailbox = new LinkedBlockingQueue<>();
private volatile boolean active = true;
public void send(Message message) {
mailbox.add(message);
}
public void stop() {
active = false;
}
@Override
public void run() {
}
protected abstract void onReceive(Message message);
}
```
### Message.java
```java
@AllArgsConstructor
@Getter
@Setter
public class Message {
private final String content;
private final String senderId;
}
```
### ActorSystem.java
```java
public class ActorSystem {
public void startActor(Actor actor) {
String actorId = "actor-" + idCounter.incrementAndGet(); // Generate a new and unique ID
actor.setActorId(actorId); // assign the actor it's ID
actorRegister.put(actorId, actor); // Register and save the actor with it's ID
executor.submit(actor); // Run the actor in a thread
}
public Actor getActorById(String actorId) {
return actorRegister.get(actorId); // Find by Id
}
public void shutdown() {
executor.shutdownNow(); // Stop all threads
}
}
```
### App.java
```java
public class App {
public static void main(String[] args) {
ActorSystem system = new ActorSystem();
Actor srijan = new ExampleActor(system);
Actor ansh = new ExampleActor2(system);
system.startActor(srijan);
system.startActor(ansh);
ansh.send(new Message("Hello ansh", srijan.getActorId()));
srijan.send(new Message("Hello srijan!", ansh.getActorId()));
Thread.sleep(1000); // Give time for messages to process
srijan.stop(); // Stop the actor gracefully
ansh.stop();
system.shutdown(); // Stop the actor system
}
}
```
---
## When to Use the Actor Model Pattern in Java
- When building **concurrent or distributed systems**
- When you want **no shared mutable state**
- When you need **asynchronous, message-driven communication**
- When components should be **isolated and loosely coupled**
---
## Actor Model Pattern Java Tutorials
- [Baeldung – Akka with Java](https://www.baeldung.com/java-akka)
- [Vaughn Vernon – Reactive Messaging Patterns](https://vaughnvernon.co/?p=1143)
---
## Real-World Applications of Actor Model Pattern in Java
- [Akka Framework](https://akka.io/)
- [Erlang and Elixir concurrency](https://www.erlang.org/)
- [Microsoft Orleans](https://learn.microsoft.com/en-us/dotnet/orleans/)
- JVM-based game engines and simulators
---
## Benefits and Trade-offs of Actor Model Pattern
### ✅ Benefits
- High concurrency support
- Easy scaling across threads or machines
- Fault isolation and recovery
- Message ordering within actors
### ⚠️ Trade-offs
- Harder to debug due to asynchronous behavior
- Slight performance overhead due to message queues
- More complex to design than simple method calls
---
## Related Java Design Patterns
- [Command Pattern](../command)
- [Mediator Pattern](../mediator)
- [Event-Driven Architecture](../event-driven-architecture)
- [Observer Pattern](../observer)
---
## References and Credits
- *Programming Erlang*, Joe Armstrong
- *Reactive Design Patterns*, Roland Kuhn
- *The Actor Model in 10 Minutes*, [InfoQ Article](https://www.infoq.com/articles/actor-model/)
- [Akka Documentation](https://doc.akka.io/docs/akka/current/index.html)
Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

+35
View File
@@ -0,0 +1,35 @@
@startuml actor-model
title Actor Model - UML Class Diagram
class ActorSystem {
+actorOf(actor: Actor): Actor
+shutdown(): void
}
class Actor {
-mailbox: BlockingQueue<Message>
-active: boolean
+send(message: Message): void
+stop(): void
+run(): void
#onReceive(message: Message): void
}
class ExampleActor {
+onReceive(message: Message): void
}
class Message {
-content: String
-sender: Actor
+getContent(): String
+getSender(): Actor
}
ActorSystem --> Actor : creates
Actor <|-- ExampleActor : extends
Actor --> Message : processes
ExampleActor --> Message : uses
@enduml
+114
View File
@@ -0,0 +1,114 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
The MIT License
Copyright © 2014-2022 Ilkka Seppälä
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.iluwatar</groupId>
<artifactId>java-design-patterns</artifactId>
<version>1.26.0-SNAPSHOT</version>
</parent>
<artifactId>actor-model</artifactId>
<name>Actor Model</name>
<!-- Force unified JUnit version to avoid classpath mismatches -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.11.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Assembly plugin for creating fat JARs -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.iluwatar.actormodel.App</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,63 @@
/*
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
*
* The MIT License
* Copyright © 2014-2022 Ilkka Seppälä
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.iluwatar.actormodel;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import lombok.Getter;
import lombok.Setter;
public abstract class Actor implements Runnable {
@Setter @Getter private String actorId;
private final BlockingQueue<Message> mailbox = new LinkedBlockingQueue<>();
private volatile boolean active =
true; // always read from main memory and written back to main memory,
// rather than being cached in a thread's local memory. To make it consistent to all Actors
public void send(Message message) {
mailbox.add(message); // Add message to queue
}
public void stop() {
active = false; // Stop the actor loop
}
@Override
public void run() {
while (active) {
try {
Message message = mailbox.take(); // Wait for a message
onReceive(message); // Process it
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
// Child classes must define what to do with a message
protected abstract void onReceive(Message message);
}
@@ -0,0 +1,51 @@
/*
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
*
* The MIT License
* Copyright © 2014-2022 Ilkka Seppälä
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.iluwatar.actormodel;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
public class ActorSystem {
private final ExecutorService executor = Executors.newCachedThreadPool();
private final ConcurrentHashMap<String, Actor> actorRegister = new ConcurrentHashMap<>();
private final AtomicInteger idCounter = new AtomicInteger(0);
public void startActor(Actor actor) {
String actorId = "actor-" + idCounter.incrementAndGet(); // Generate a new and unique ID
actor.setActorId(actorId); // assign the actor it's ID
actorRegister.put(actorId, actor); // Register and save the actor with it's ID
executor.submit(actor); // Run the actor in a thread
}
public Actor getActorById(String actorId) {
return actorRegister.get(actorId); // Find by Id
}
public void shutdown() {
executor.shutdownNow(); // Stop all threads
}
}
@@ -0,0 +1,64 @@
/*
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
*
* The MIT License
* Copyright © 2014-2022 Ilkka Seppälä
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
/**
* The Actor Model is a design pattern used to handle concurrency in a safe, scalable, and
* message-driven way.
*
* <p>In the Actor Model: - An **Actor** is an independent unit that has its own state and behavior.
* - Actors **communicate only through messages** — they do not share memory. - An **ActorSystem**
* is responsible for creating, starting, and managing the lifecycle of actors. - Messages are
* delivered asynchronously, and each actor processes them one at a time.
*
* <p>💡 Key benefits: - No shared memory = no need for complex thread-safety - Easy to scale with
* many actors - Suitable for highly concurrent or distributed systems
*
* <p>🔍 This example demonstrates the Actor Model: - `ActorSystem` starts two actors: `srijan` and
* `ansh`. - `ExampleActor` and `ExampleActor2` extend the `Actor` class and override the
* `onReceive()` method to handle messages. - Actors communicate using `send()` to pass `Message`
* objects that include the message content and sender's ID. - The actors process messages
* **asynchronously in separate threads**, and we allow a short delay (`Thread.sleep`) to let them
* run. - The system is shut down gracefully at the end.
*/
package com.iluwatar.actormodel;
public class App {
public static void main(String[] args) throws InterruptedException {
ActorSystem system = new ActorSystem();
Actor srijan = new ExampleActor(system);
Actor ansh = new ExampleActor2(system);
system.startActor(srijan);
system.startActor(ansh);
ansh.send(new Message("Hello ansh", srijan.getActorId()));
srijan.send(new Message("Hello srijan!", ansh.getActorId()));
Thread.sleep(1000); // Give time for messages to process
srijan.stop(); // Stop the actor gracefully
ansh.stop();
system.shutdown(); // Stop the actor system
}
}
@@ -0,0 +1,53 @@
/*
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
*
* The MIT License
* Copyright © 2014-2022 Ilkka Seppälä
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.iluwatar.actormodel;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ExampleActor extends Actor {
private final ActorSystem actorSystem;
@Getter private final List<String> receivedMessages = new ArrayList<>();
public ExampleActor(ActorSystem actorSystem) {
this.actorSystem = actorSystem;
}
// Logger log = Logger.getLogger(getClass().getName());
@Override
protected void onReceive(Message message) {
LOGGER.info(
"[{}]Received : {} from : [{}]", getActorId(), message.getContent(), message.getSenderId());
Actor sender = actorSystem.getActorById(message.getSenderId()); // sender actor id
// Reply of the message
if (sender != null && !message.getSenderId().equals(getActorId())) {
sender.send(new Message("I got your message ", getActorId()));
}
}
}
@@ -22,30 +22,25 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
package com.iluwatar.threadpool; package com.iluwatar.actormodel;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
/**
* Worker implements {@link Runnable} and thus can be executed by {@link
* java.util.concurrent.ExecutorService}.
*/
@Slf4j @Slf4j
public class Worker implements Runnable { public class ExampleActor2 extends Actor {
private final ActorSystem actorSystem;
@Getter private final List<String> receivedMessages = new ArrayList<>();
private final Task task; public ExampleActor2(ActorSystem actorSystem) {
this.actorSystem = actorSystem;
public Worker(final Task task) {
this.task = task;
} }
@Override @Override
public void run() { protected void onReceive(Message message) {
LOGGER.info("{} processing {}", Thread.currentThread().getName(), task.toString()); receivedMessages.add(message.getContent());
try { LOGGER.info("[{}]Received : {}", getActorId(), message.getContent());
Thread.sleep(task.getTimeMs());
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
} }
@@ -0,0 +1,35 @@
/*
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
*
* The MIT License
* Copyright © 2014-2022 Ilkka Seppälä
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.iluwatar.actormodel;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public class Message {
private final String content;
private final String senderId;
}
@@ -0,0 +1,63 @@
/*
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
*
* The MIT License
* Copyright © 2014-2022 Ilkka Seppälä
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.iluwatar.actor;
import static org.junit.jupiter.api.Assertions.*;
import com.iluwatar.actormodel.ActorSystem;
import com.iluwatar.actormodel.App;
import com.iluwatar.actormodel.ExampleActor;
import com.iluwatar.actormodel.ExampleActor2;
import com.iluwatar.actormodel.Message;
import org.junit.jupiter.api.Test;
public class ActorModelTest {
@Test
void testMainMethod() throws InterruptedException {
App.main(new String[] {});
}
@Test
public void testMessagePassing() throws InterruptedException {
ActorSystem system = new ActorSystem();
ExampleActor srijan = new ExampleActor(system);
ExampleActor2 ansh = new ExampleActor2(system);
system.startActor(srijan);
system.startActor(ansh);
// Ansh recieves a message from Srijan
ansh.send(new Message("Hello ansh", srijan.getActorId()));
// Wait briefly to allow async processing
Thread.sleep(200);
// Check that Srijan received the message
assertTrue(
ansh.getReceivedMessages().contains("Hello ansh"),
"ansh should receive the message from Srijan");
}
}
+68 -44
View File
@@ -1,22 +1,25 @@
--- ---
title: Acyclic Visitor title: "Acyclic Visitor Pattern in Java: Streamlining Object Interactions"
shortTitle: Acyclic Visitor
description: "Learn about the Acyclic Visitor pattern in Java. This guide explains how it decouples operations from object hierarchies, providing examples and real-world applications."
category: Behavioral category: Behavioral
language: en language: en
tag: tag:
- Decoupling
- Extensibility - Extensibility
- Interface
- Object composition
--- ---
## Intent ## Intent of Acyclic Visitor Design Pattern
Allow new functions to be added to existing class hierarchies without affecting those hierarchies, and without creating The Acyclic Visitor pattern in Java decouples operations from an object hierarchy, providing a flexible design for various applications.
the troublesome dependency cycles that are inherent to the GoF Visitor Pattern.
## Explanation ## Detailed Explanation of Acyclic Visitor Pattern with Real-World Examples
Real world example Real-world example
> We have a hierarchy of modem classes. The modems in this hierarchy need to be visited by an external algorithm based > An analogous real-world example of the Acyclic Visitor pattern in Java is a museum guide system, demonstrating the practical application of this design pattern. Imagine a museum with various exhibits like paintings, sculptures, and historical artifacts. The museum has different types of guides (audio guide, human guide, virtual reality guide) that provide information about each exhibit. Instead of modifying the exhibits every time a new guide type is introduced, each guide implements an interface to visit different exhibit types. This way, the museum can add new types of guides without altering the existing exhibits, ensuring that the system remains extensible and maintainable without forming any dependency cycles.
> on filtering criteria (is it Unix or DOS compatible modem).
In plain words In plain words
@@ -24,10 +27,16 @@ In plain words
[WikiWikiWeb](https://wiki.c2.com/?AcyclicVisitor) says [WikiWikiWeb](https://wiki.c2.com/?AcyclicVisitor) says
> The Acyclic Visitor pattern allows new functions to be added to existing class hierarchies without affecting those > The Acyclic Visitor pattern allows new functions to be added to existing class hierarchies without affecting those hierarchies, and without creating the dependency cycles that are inherent to the GangOfFour VisitorPattern.
> hierarchies, and without creating the dependency cycles that are inherent to the GangOfFour VisitorPattern.
**Programmatic Example** Sequence diagram
![Acyclic Visitor sequence diagram](./etc/acyclic-visitor-sequence-diagram.png "Acyclic Visitor sequence diagram")
## Programmatic Example of Acyclic Visitor in Java
In this Java example, we have a hierarchy of modem classes illustrating the Acyclic Visitor pattern. The modems in this hierarchy need to be visited by an external algorithm based on filtering criteria (is it Unix or DOS compatible modem).
Here's the `Modem` hierarchy. Here's the `Modem` hierarchy.
@@ -37,7 +46,9 @@ public abstract class Modem {
} }
public class Zoom extends Modem { public class Zoom extends Modem {
...
// Other properties and methods...
@Override @Override
public void accept(ModemVisitor modemVisitor) { public void accept(ModemVisitor modemVisitor) {
if (modemVisitor instanceof ZoomVisitor) { if (modemVisitor instanceof ZoomVisitor) {
@@ -49,7 +60,9 @@ public class Zoom extends Modem {
} }
public class Hayes extends Modem { public class Hayes extends Modem {
...
// Other properties and methods...
@Override @Override
public void accept(ModemVisitor modemVisitor) { public void accept(ModemVisitor modemVisitor) {
if (modemVisitor instanceof HayesVisitor) { if (modemVisitor instanceof HayesVisitor) {
@@ -61,7 +74,7 @@ public class Hayes extends Modem {
} }
``` ```
Next we introduce the `ModemVisitor` hierarchy. Next, we introduce the `ModemVisitor` hierarchy.
```java ```java
public interface ModemVisitor { public interface ModemVisitor {
@@ -79,11 +92,14 @@ public interface AllModemVisitor extends ZoomVisitor, HayesVisitor {
} }
public class ConfigureForDosVisitor implements AllModemVisitor { public class ConfigureForDosVisitor implements AllModemVisitor {
...
// Other properties and methods...
@Override @Override
public void visit(Hayes hayes) { public void visit(Hayes hayes) {
LOGGER.info(hayes + " used with Dos configurator."); LOGGER.info(hayes + " used with Dos configurator.");
} }
@Override @Override
public void visit(Zoom zoom) { public void visit(Zoom zoom) {
LOGGER.info(zoom + " used with Dos configurator."); LOGGER.info(zoom + " used with Dos configurator.");
@@ -91,7 +107,9 @@ public class ConfigureForDosVisitor implements AllModemVisitor {
} }
public class ConfigureForUnixVisitor implements ZoomVisitor { public class ConfigureForUnixVisitor implements ZoomVisitor {
...
// Other properties and methods...
@Override @Override
public void visit(Zoom zoom) { public void visit(Zoom zoom) {
LOGGER.info(zoom + " used with Unix configurator."); LOGGER.info(zoom + " used with Unix configurator.");
@@ -102,30 +120,30 @@ public class ConfigureForUnixVisitor implements ZoomVisitor {
Finally, here are the visitors in action. Finally, here are the visitors in action.
```java ```java
public static void main(String[] args) {
var conUnix = new ConfigureForUnixVisitor(); var conUnix = new ConfigureForUnixVisitor();
var conDos = new ConfigureForDosVisitor(); var conDos = new ConfigureForDosVisitor();
var zoom = new Zoom(); var zoom = new Zoom();
var hayes = new Hayes(); var hayes = new Hayes();
hayes.accept(conDos);
zoom.accept(conDos); hayes.accept(conDos); // Hayes modem with Dos configurator
hayes.accept(conUnix); zoom.accept(conDos); // Zoom modem with Dos configurator
zoom.accept(conUnix); hayes.accept(conUnix); // Hayes modem with Unix configurator
zoom.accept(conUnix); // Zoom modem with Unix configurator
}
``` ```
Program output: Program output:
``` ```
// Hayes modem used with Dos configurator. 09:15:11.125 [main] INFO com.iluwatar.acyclicvisitor.ConfigureForDosVisitor -- Hayes modem used with Dos configurator.
// Zoom modem used with Dos configurator. 09:15:11.127 [main] INFO com.iluwatar.acyclicvisitor.ConfigureForDosVisitor -- Zoom modem used with Dos configurator.
// Only HayesVisitor is allowed to visit Hayes modem 09:15:11.127 [main] INFO com.iluwatar.acyclicvisitor.Hayes -- Only HayesVisitor is allowed to visit Hayes modem
// Zoom modem used with Unix configurator. 09:15:11.127 [main] INFO com.iluwatar.acyclicvisitor.ConfigureForUnixVisitor -- Zoom modem used with Unix configurator.
``` ```
## Class diagram ## When to Use the Acyclic Visitor Pattern in Java
![alt text](./etc/acyclic-visitor.png "Acyclic Visitor")
## Applicability
This pattern can be used: This pattern can be used:
@@ -135,28 +153,34 @@ This pattern can be used:
* When the visited class hierarchy will be frequently extended with new derivatives of the Element class. * When the visited class hierarchy will be frequently extended with new derivatives of the Element class.
* When the recompilation, relinking, retesting or redistribution of the derivatives of Element is very expensive. * When the recompilation, relinking, retesting or redistribution of the derivatives of Element is very expensive.
## Tutorial ## Acyclic Visitor Pattern Java Tutorials
* [Acyclic Visitor Pattern Example](https://codecrafter.blogspot.com/2012/12/the-acyclic-visitor-pattern.html) * [The Acyclic Visitor Pattern (Code Crafter)](https://codecrafter.blogspot.com/2012/12/the-acyclic-visitor-pattern.html)
## Consequences ## Benefits and Trade-offs of Acyclic Visitor Pattern
The good: Benefits:
* No dependency cycles between class hierarchies. * Extensible: New operations can be added easily without changing the object structure.
* No need to recompile all the visitors if a new one is added. * Decoupled: Reduces coupling between the objects and the operations on them.
* Does not cause compilation failure in existing visitors if class hierarchy has a new member. * No dependency cycles: Ensures acyclic dependencies, improving maintainability and reducing complexity.
The bad: Trade-offs:
* Violates [Liskov's Substitution Principle](https://java-design-patterns.com/principles/#liskov-substitution-principle) by showing that it can accept all visitors but actually only being interested in particular visitors. * Increased complexity: Can introduce additional complexity with the need for multiple visitor interfaces.
* Parallel hierarchy of visitors has to be created for all members in visitable class hierarchy. * Maintenance overhead: Modifying the object hierarchy requires updating all visitors.
## Related patterns ## Related Java Design Patterns
* [Visitor Pattern](https://java-design-patterns.com/patterns/visitor/) * [Composite](https://java-design-patterns.com/patterns/composite/): Often used in conjunction with Acyclic Visitor to allow treating individual objects and compositions uniformly.
* [Decorator](https://java-design-patterns.com/patterns/decorator/): Can be used alongside to add responsibilities to objects dynamically.
* [Visitor](https://java-design-patterns.com/patterns/visitor/): The Acyclic Visitor pattern is a variation of the Visitor pattern that avoids cyclic dependencies.
## Credits ## References and Credits
* [Acyclic Visitor by Robert C. Martin](http://condor.depaul.edu/dmumaugh/OOT/Design-Principles/acv.pdf) * [Design Patterns: Elements of Reusable Object-Oriented Software](https://amzn.to/3w0pvKI)
* [Acyclic Visitor in WikiWikiWeb](https://wiki.c2.com/?AcyclicVisitor) * [Head First Design Patterns: Building Extensible and Maintainable Object-Oriented Software](https://amzn.to/49NGldq)
* [Java Design Patterns: A Hands-On Experience with Real-World Examples](https://amzn.to/3yhh525)
* [Patterns in Java: A Catalog of Reusable Design Patterns Illustrated with UML](https://amzn.to/4bOtzwF)
* [Acyclic Visitor (Robert C. Martin)](http://condor.depaul.edu/dmumaugh/OOT/Design-Principles/acv.pdf)
* [Acyclic Visitor (WikiWikiWeb)](https://wiki.c2.com/?AcyclicVisitor)
Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

+8
View File
@@ -34,6 +34,14 @@
</parent> </parent>
<artifactId>acyclic-visitor</artifactId> <artifactId>acyclic-visitor</artifactId>
<dependencies> <dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.junit.jupiter</groupId> <groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId> <artifactId>junit-jupiter-engine</artifactId>
@@ -28,6 +28,4 @@ package com.iluwatar.acyclicvisitor;
* All ModemVisitor interface extends all visitor interfaces. This interface provides ease of use * All ModemVisitor interface extends all visitor interfaces. This interface provides ease of use
* when a visitor needs to visit all modem types. * when a visitor needs to visit all modem types.
*/ */
public interface AllModemVisitor extends ZoomVisitor, HayesVisitor { public interface AllModemVisitor extends ZoomVisitor, HayesVisitor {}
}
@@ -37,9 +37,7 @@ package com.iluwatar.acyclicvisitor;
*/ */
public class App { public class App {
/** /** Program's entry point. */
* Program's entry point.
*/
public static void main(String[] args) { public static void main(String[] args) {
var conUnix = new ConfigureForUnixVisitor(); var conUnix = new ConfigureForUnixVisitor();
var conDos = new ConfigureForDosVisitor(); var conDos = new ConfigureForDosVisitor();
@@ -27,8 +27,7 @@ package com.iluwatar.acyclicvisitor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
/** /**
* ConfigureForDosVisitor class implements both zoom's and hayes' visit method for Dos * ConfigureForDosVisitor class implements both zoom's and hayes' visit method for Dos manufacturer.
* manufacturer.
*/ */
@Slf4j @Slf4j
public class ConfigureForDosVisitor implements AllModemVisitor { public class ConfigureForDosVisitor implements AllModemVisitor {
@@ -26,15 +26,11 @@ package com.iluwatar.acyclicvisitor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
/** /** Hayes class implements its accept method. */
* Hayes class implements its accept method.
*/
@Slf4j @Slf4j
public class Hayes implements Modem { public class Hayes implements Modem {
/** /** Accepts all visitors but honors only HayesVisitor. */
* Accepts all visitors but honors only HayesVisitor.
*/
@Override @Override
public void accept(ModemVisitor modemVisitor) { public void accept(ModemVisitor modemVisitor) {
if (modemVisitor instanceof HayesVisitor) { if (modemVisitor instanceof HayesVisitor) {
@@ -42,12 +38,9 @@ public class Hayes implements Modem {
} else { } else {
LOGGER.info("Only HayesVisitor is allowed to visit Hayes modem"); LOGGER.info("Only HayesVisitor is allowed to visit Hayes modem");
} }
} }
/** /** Hayes' modem's toString method. */
* Hayes' modem's toString method.
*/
@Override @Override
public String toString() { public String toString() {
return "Hayes modem"; return "Hayes modem";
@@ -24,9 +24,7 @@
*/ */
package com.iluwatar.acyclicvisitor; package com.iluwatar.acyclicvisitor;
/** /** HayesVisitor interface. */
* HayesVisitor interface.
*/
public interface HayesVisitor extends ModemVisitor { public interface HayesVisitor extends ModemVisitor {
void visit(Hayes hayes); void visit(Hayes hayes);
} }
@@ -24,10 +24,7 @@
*/ */
package com.iluwatar.acyclicvisitor; package com.iluwatar.acyclicvisitor;
/** /** //Modem abstract class. converted to an interface */
* //Modem abstract class.
* converted to an interface
*/
public interface Modem { public interface Modem {
void accept(ModemVisitor modemVisitor); void accept(ModemVisitor modemVisitor);
} }
@@ -26,15 +26,11 @@ package com.iluwatar.acyclicvisitor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
/** /** Zoom class implements its accept method. */
* Zoom class implements its accept method.
*/
@Slf4j @Slf4j
public class Zoom implements Modem { public class Zoom implements Modem {
/** /** Accepts all visitors but honors only ZoomVisitor. */
* Accepts all visitors but honors only ZoomVisitor.
*/
@Override @Override
public void accept(ModemVisitor modemVisitor) { public void accept(ModemVisitor modemVisitor) {
if (modemVisitor instanceof ZoomVisitor) { if (modemVisitor instanceof ZoomVisitor) {
@@ -44,9 +40,7 @@ public class Zoom implements Modem {
} }
} }
/** /** Zoom modem's toString method. */
* Zoom modem's toString method.
*/
@Override @Override
public String toString() { public String toString() {
return "Zoom modem"; return "Zoom modem";
@@ -24,9 +24,7 @@
*/ */
package com.iluwatar.acyclicvisitor; package com.iluwatar.acyclicvisitor;
/** /** ZoomVisitor interface. */
* ZoomVisitor interface.
*/
public interface ZoomVisitor extends ModemVisitor { public interface ZoomVisitor extends ModemVisitor {
void visit(Zoom zoom); void visit(Zoom zoom);
} }
@@ -24,25 +24,22 @@
*/ */
package com.iluwatar.acyclicvisitor; package com.iluwatar.acyclicvisitor;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
/** import org.junit.jupiter.api.Test;
* Tests that the Acyclic Visitor example runs without errors.
*/ /** Tests that the Acyclic Visitor example runs without errors. */
class AppTest { class AppTest {
/** /**
* Issue: Add at least one assertion to this test case. * Issue: Add at least one assertion to this test case.
* *
* Solution: Inserted assertion to check whether the execution of the main method in {@link App} * <p>Solution: Inserted assertion to check whether the execution of the main method in {@link
* throws an exception. * App} throws an exception.
*/ */
@Test @Test
void shouldExecuteApplicationWithoutException() { void shouldExecuteApplicationWithoutException() {
assertDoesNotThrow(() -> App.main(new String[]{})); assertDoesNotThrow(() -> App.main(new String[] {}));
} }
} }
@@ -24,14 +24,12 @@
*/ */
package com.iluwatar.acyclicvisitor; package com.iluwatar.acyclicvisitor;
import org.junit.jupiter.api.Test;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
/** import org.junit.jupiter.api.Test;
* Hayes test class
*/ /** Hayes test class */
class HayesTest { class HayesTest {
@Test @Test
@@ -24,16 +24,13 @@
*/ */
package com.iluwatar.acyclicvisitor; package com.iluwatar.acyclicvisitor;
import org.junit.jupiter.api.Test;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
/** import org.junit.jupiter.api.Test;
* Zoom test class
*/ /** Zoom test class */
class ZoomTest { class ZoomTest {
@Test @Test
+58 -43
View File
@@ -1,25 +1,31 @@
--- ---
title: Adapter title: "Adapter Pattern in Java: Seamless Integration of Incompatible Systems"
shortTitle: Adapter
description: "Learn how the Adapter Design Pattern works in Java with detailed examples and use cases. Understand how it enables compatibility between incompatible interfaces."
category: Structural category: Structural
language: en language: en
tag: tag:
- Compatibility
- Decoupling
- Gang of Four - Gang of Four
- Interface
- Object composition
- Wrapping
--- ---
## Also known as ## Also known as
Wrapper
## Intent * Wrapper
Convert the interface of a class into another interface the clients expect. Adapter lets classes work together that
couldn't otherwise because of incompatible interfaces.
## Explanation ## Intent of Adapter Design Pattern
The Adapter Design Pattern in Java converts the interface of a class into another interface that clients expect, enabling compatibility.
## Detailed Explanation of Adapter Pattern with Real-World Examples
Real-world example Real-world example
> Consider that you have some pictures on your memory card and you need to transfer them to your computer. To transfer them, you need some kind of adapter that is compatible with your computer ports so that you can attach a memory card to your computer. In this case card reader is an adapter. > Consider that you have some pictures on your memory card and you need to transfer them to your computer. To transfer them, you need some kind of adapter that is compatible with your computer ports so that you can attach a memory card to your computer. In this case card reader is an adapter. Another example would be the famous power adapter; a three-legged plug can't be connected to a two-pronged outlet, it needs to use a power adapter that makes it compatible with the two-pronged outlets. Yet another example would be a translator translating words spoken by one person to another
> Another example would be the famous power adapter; a three-legged plug can't be connected to a two-pronged outlet, it needs to use a power adapter that makes it compatible with the two-pronged outlets.
> Yet another example would be a translator translating words spoken by one person to another
In plain words In plain words
@@ -29,9 +35,15 @@ Wikipedia says
> In software engineering, the adapter pattern is a software design pattern that allows the interface of an existing class to be used as another interface. It is often used to make existing classes work with others without modifying their source code. > In software engineering, the adapter pattern is a software design pattern that allows the interface of an existing class to be used as another interface. It is often used to make existing classes work with others without modifying their source code.
**Programmatic Example** Sequence diagram
Consider a captain that can only use rowing boats and cannot sail at all. ![Adapter sequence diagram](./etc/adapter-sequence-diagram.png "Adapter sequence diagram")
## Programmatic Example of Adapter Pattern in Java
The Adapter Pattern example in Java shows how a class with an incompatible interface can be adapted to work with another class.
Consider a wannabe captain that can only use rowing boats but can't sail at all.
First, we have interfaces `RowingBoat` and `FishingBoat` First, we have interfaces `RowingBoat` and `FishingBoat`
@@ -48,12 +60,13 @@ public class FishingBoat {
} }
``` ```
And captain expects an implementation of `RowingBoat` interface to be able to move The captain expects an implementation of `RowingBoat` interface to be able to move.
```java ```java
public class Captain { public class Captain {
private final RowingBoat rowingBoat; private final RowingBoat rowingBoat;
// default constructor and setter for rowingBoat // default constructor and setter for rowingBoat
public Captain(RowingBoat rowingBoat) { public Captain(RowingBoat rowingBoat) {
this.rowingBoat = rowingBoat; this.rowingBoat = rowingBoat;
@@ -65,7 +78,7 @@ public class Captain {
} }
``` ```
Now let's say the pirates are coming and our captain needs to escape but there is only a fishing boat available. We need to create an adapter that allows the captain to operate the fishing boat with his rowing boat skills. Now, let's say the pirates are coming and our captain needs to escape but there is only a fishing boat available. We need to create an adapter that allows the captain to operate the fishing boat with his rowing boat skills.
```java ```java
@Slf4j @Slf4j
@@ -84,56 +97,58 @@ public class FishingBoatAdapter implements RowingBoat {
} }
``` ```
And now the `Captain` can use the `FishingBoat` to escape the pirates. Now the `Captain` can use the `FishingBoat` to escape the pirates.
```java ```java
var captain = new Captain(new FishingBoatAdapter()); public static void main(final String[] args) {
captain.row(); // The captain can only operate rowing boats but with adapter he is able to
// use fishing boats as well
var captain = new Captain(new FishingBoatAdapter());
captain.row();
}
``` ```
## Class diagram The program outputs:
![alt text](./etc/adapter.urm.png "Adapter class diagram")
## Applicability ```
Use the Adapter pattern when 10:25:08.074 [main] INFO com.iluwatar.adapter.FishingBoat -- The fishing boat is sailing
```
## When to Use the Adapter Pattern in Java
Use the Adapter pattern in Java when
* You want to use an existing class, and its interface does not match the one you need * You want to use an existing class, and its interface does not match the one you need
* You want to create a reusable class that cooperates with unrelated or unforeseen classes, that is, classes that don't necessarily have compatible interfaces * You want to create a reusable class that cooperates with unrelated or unforeseen classes, that is, classes that don't necessarily have compatible interfaces
* You need to use several existing subclasses, but it's impractical to adapt their interface by subclassing everyone. An object adapter can adapt the interface of its parent class. * You need to use several existing subclasses, but it's impractical to adapt their interface by subclassing everyone. An object adapter can adapt the interface of its parent class.
* Most of the applications using third-party libraries use adapters as a middle layer between the application and the 3rd party library to decouple the application from the library. If another library has to be used only an adapter for the new library is required without having to change the application code. * Most of the applications using third-party libraries use adapters as a middle layer between the application and the 3rd party library to decouple the application from the library. If another library has to be used only an adapter for the new library is required without having to change the application code.
## Tutorials ## Adapter Pattern Java Tutorials
* [Dzone](https://dzone.com/articles/adapter-design-pattern-in-java) * [Using the Adapter Design Pattern in Java (Dzone)](https://dzone.com/articles/adapter-design-pattern-in-java)
* [Refactoring Guru](https://refactoring.guru/design-patterns/adapter/java/example) * [Adapter in Java (Refactoring Guru)](https://refactoring.guru/design-patterns/adapter/java/example)
* [Baeldung](https://www.baeldung.com/java-adapter-pattern) * [The Adapter Pattern in Java (Baeldung)](https://www.baeldung.com/java-adapter-pattern)
* [GeeksforGeeks](https://www.geeksforgeeks.org/adapter-pattern/) * [Adapter Design Pattern (GeeksForGeeks)](https://www.geeksforgeeks.org/adapter-pattern/)
## Benefits and Trade-offs of Adapter Pattern
## Consequences Class and object adapters offer different benefits and drawbacks. A class adapter adapts the Adaptee to the Target by binding to a specific Adaptee class, which means it cannot adapt a class and all its subclasses. This type of adapter allows the Adapter to override some of the Adaptee’s behavior because the Adapter is a subclass of the Adaptee. Additionally, it introduces only one object without needing extra pointer indirection to reach the Adaptee.
Class and object adapters have different trade-offs. A class adapter
* Adapts Adaptee to Target by committing to a concrete Adaptee class. As a consequence, a class adapter won’t work when we want to adapt a class and all its subclasses. On the other hand, an object adapter allows a single Adapter to work with multiple Adaptees, including the Adaptee and all its subclasses. This type of adapter can add functionality to all Adaptees simultaneously. However, it makes overriding the Adaptee’s behavior more difficult, as it requires subclassing the Adaptee and having the Adapter refer to this subclass instead of the Adaptee itself.
* Lets Adapter override some of Adaptee’s behavior since Adapter is a subclass of Adaptee.
* Introduces only one object, and no additional pointer indirection is needed to get to the adaptee.
An object adapter ## Real-World Applications of Adapter Pattern in Java
* Lets a single Adapter work with many Adaptees, that is, the Adaptee itself and all of its subclasses (if any). The Adapter can also add functionality to all Adaptees at once.
* Makes it harder to override Adaptee behavior. It will require subclassing Adaptee and making the Adapter refer to the subclass rather than the Adaptee itself.
## Real-world examples
* `java.io.InputStreamReader` and `java.io.OutputStreamWriter` in the Java IO library.
* GUI component libraries that allow for plug-ins or adapters to convert between different GUI component interfaces.
* [java.util.Arrays#asList()](http://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#asList%28T...%29) * [java.util.Arrays#asList()](http://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#asList%28T...%29)
* [java.util.Collections#list()](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#list-java.util.Enumeration-) * [java.util.Collections#list()](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#list-java.util.Enumeration-)
* [java.util.Collections#enumeration()](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#enumeration-java.util.Collection-) * [java.util.Collections#enumeration()](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#enumeration-java.util.Collection-)
* [javax.xml.bind.annotation.adapters.XMLAdapter](http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html#marshal-BoundType-) * [javax.xml.bind.annotation.adapters.XMLAdapter](http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html#marshal-BoundType-)
## References and Credits
## Credits * [Design Patterns: Elements of Reusable Object-Oriented Software](https://amzn.to/3w0pvKI)
* [Effective Java](https://amzn.to/4cGk2Jz)
* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) * [Head First Design Patterns: Building Extensible and Maintainable Object-Oriented Software](https://amzn.to/49NGldq)
* [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=48d37c67fb3d845b802fa9b619ad8f31) * [J2EE Design Patterns](https://amzn.to/4dpzgmx)
* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) * [Refactoring to Patterns](https://amzn.to/3VOO4F5)
* [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7)
Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

+9 -1
View File
@@ -4,7 +4,7 @@
This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
The MIT License The MIT License
Copyright © 2014-2023 Ilkka Seppälä Copyright © 2014-2022 Ilkka Seppälä
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
@@ -34,6 +34,14 @@
</parent> </parent>
<artifactId>adapter</artifactId> <artifactId>adapter</artifactId>
<dependencies> <dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.junit.jupiter</groupId> <groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId> <artifactId>junit-jupiter-engine</artifactId>
@@ -37,16 +37,15 @@ package com.iluwatar.adapter;
* <p>The Adapter ({@link FishingBoatAdapter}) converts the interface of the adaptee class ({@link * <p>The Adapter ({@link FishingBoatAdapter}) converts the interface of the adaptee class ({@link
* FishingBoat}) into a suitable one expected by the client ({@link RowingBoat}). * FishingBoat}) into a suitable one expected by the client ({@link RowingBoat}).
* *
* <p>The story of this implementation is this. <br> Pirates are coming! we need a {@link * <p>The story of this implementation is this. <br>
* RowingBoat} to flee! We have a {@link FishingBoat} and our captain. We have no time to make up a * Pirates are coming! we need a {@link RowingBoat} to flee! We have a {@link FishingBoat} and our
* new ship! we need to reuse this {@link FishingBoat}. The captain needs a rowing boat which he can * captain. We have no time to make up a new ship! we need to reuse this {@link FishingBoat}. The
* operate. The spec is in {@link RowingBoat}. We will use the Adapter pattern to reuse {@link * captain needs a rowing boat which he can operate. The spec is in {@link RowingBoat}. We will use
* FishingBoat}. * the Adapter pattern to reuse {@link FishingBoat}.
*/ */
public final class App { public final class App {
private App() { private App() {}
}
/** /**
* Program entry point. * Program entry point.
@@ -29,7 +29,8 @@ import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
/** /**
* The Captain uses {@link RowingBoat} to sail. <br> This is the client in the pattern. * The Captain uses {@link RowingBoat} to sail. <br>
* This is the client in the pattern.
*/ */
@Setter @Setter
@NoArgsConstructor @NoArgsConstructor
@@ -41,5 +42,4 @@ public final class Captain {
void row() { void row() {
rowingBoat.row(); rowingBoat.row();
} }
} }
@@ -36,5 +36,4 @@ final class FishingBoat {
void sail() { void sail() {
LOGGER.info("The fishing boat is sailing"); LOGGER.info("The fishing boat is sailing");
} }
} }
@@ -25,10 +25,10 @@
package com.iluwatar.adapter; package com.iluwatar.adapter;
/** /**
* The interface expected by the client.<br> A rowing boat is rowed to move. * The interface expected by the client.<br>
* A rowing boat is rowed to move.
*/ */
public interface RowingBoat { public interface RowingBoat {
void row(); void row();
} }
@@ -24,17 +24,15 @@
*/ */
package com.iluwatar.adapter; package com.iluwatar.adapter;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
import java.util.Map;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
/** import java.util.HashMap;
* Tests for the adapter pattern. import java.util.Map;
*/ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
/** Tests for the adapter pattern. */
class AdapterPatternTest { class AdapterPatternTest {
private Map<String, Object> beans; private Map<String, Object> beans;
@@ -43,9 +41,7 @@ class AdapterPatternTest {
private static final String ROWING_BEAN = "captain"; private static final String ROWING_BEAN = "captain";
/** /** This method runs before the test execution and sets the bean objects in the beans Map. */
* This method runs before the test execution and sets the bean objects in the beans Map.
*/
@BeforeEach @BeforeEach
void setup() { void setup() {
beans = new HashMap<>(); beans = new HashMap<>();
@@ -24,23 +24,17 @@
*/ */
package com.iluwatar.adapter; package com.iluwatar.adapter;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
/** import org.junit.jupiter.api.Test;
* Tests that Adapter example runs without errors.
*/ /** Tests that Adapter example runs without errors. */
class AppTest { class AppTest {
/** /** Check whether the execution of the main method in {@link App} throws an exception. */
* Check whether the execution of the main method in {@link App}
* throws an exception.
*/
@Test @Test
void shouldExecuteApplicationWithoutException() { void shouldExecuteApplicationWithoutException() {
assertDoesNotThrow(() -> App.main(new String[]{})); assertDoesNotThrow(() -> App.main(new String[] {}));
} }
} }
+84 -50
View File
@@ -1,41 +1,49 @@
--- ---
title: Ambassador title: "Ambassador Pattern in Java: Simplifying Remote Resource Management"
category: Structural shortTitle: Ambassador
description: "Explore the Ambassador Pattern in Java, its benefits, use cases, and practical examples. Learn how to decouple and offload common functionalities to improve system performance and maintainability."
category: Integration
language: en language: en
tag: tag:
- API design
- Decoupling - Decoupling
- Cloud distributed - Fault tolerance
- Proxy
- Resilience
- Scalability
--- ---
## Intent ## Intent of Ambassador Design Pattern
Provide a helper service instance on a client and offload common functionality away from a shared resource. The Ambassador Pattern in Java helps offload common functionalities such as monitoring, logging, and routing from a shared resource to a helper service instance, enhancing performance and maintainability in distributed systems.
## Explanation ## Detailed Explanation of Ambassador Pattern with Real-World Examples
Real world example Real-world example
> A remote service has many clients accessing a function it provides. The service is a legacy application and is > Imagine a busy hotel where guests frequently request restaurant reservations, event tickets, or transportation arrangements. Instead of each guest individually contacting these services, the hotel provides a concierge. The concierge handles these tasks on behalf of the guests, ensuring that reservations are made smoothly, tickets are booked on time, and transportation is scheduled efficiently.
> impossible to update. Large numbers of requests from users are causing connectivity issues. New rules for request >
> frequency should be implemented along with latency checks and client-side logging. > In this analogy, the guests are the client services, the external providers (restaurants, ticket vendors, transportation) are the remote services, and the concierge represents the ambassador service. This setup allows the guests to focus on enjoying their stay while the concierge manages the complexities of external interactions, providing a seamless and enhanced experience.
In plain words In plain words
> With the Ambassador pattern, we can implement less-frequent polling from clients along with latency checks and > With the Ambassador pattern, we can implement less-frequent polling from clients along with latency checks and logging.
> logging.
Microsoft documentation states Microsoft documentation states
> An ambassador service can be thought of as an out-of-process proxy which is co-located with the client. This pattern > An ambassador service can be thought of as an out-of-process proxy which is co-located with the client. This pattern can be useful for offloading common client connectivity tasks such as monitoring, logging, routing, security (such as TLS), and resiliency patterns in a language agnostic way. It is often used with legacy applications, or other applications that are difficult to modify, in order to extend their networking capabilities. It can also enable a specialized team to implement those features.
> can be useful for offloading common client connectivity tasks such as monitoring, logging, routing,
> security (such as TLS), and resiliency patterns in a language agnostic way. It is often used with legacy applications,
> or other applications that are difficult to modify, in order to extend their networking capabilities. It can also
> enable a specialized team to implement those features.
**Programmatic Example** Sequence diagram
With the above introduction in mind we will imitate the functionality in this example. We have an interface implemented ![Ambassador sequence diagram](./etc/ambassador-sequence-diagram.png "Ambassador sequence diagram")
by the remote service as well as the ambassador service:
## Programmatic Example of Ambassador Pattern in Java
In this example of the Ambassador Pattern in Java, we demonstrate how to implement latency checks, logging, and retry mechanisms to improve system reliability.
A remote service has many clients accessing a function it provides. The service is a legacy application and is impossible to update. Large numbers of requests from users are causing connectivity issues. New rules for request frequency should be implemented along with latency checks and client-side logging.
With the above introduction in mind we will imitate the functionality in this example. We have an interface implemented by the remote service as well as the ambassador service.
```java ```java
interface RemoteServiceInterface { interface RemoteServiceInterface {
@@ -46,6 +54,7 @@ interface RemoteServiceInterface {
A remote services represented as a singleton. A remote services represented as a singleton.
```java ```java
@Slf4j @Slf4j
public class RemoteService implements RemoteServiceInterface { public class RemoteService implements RemoteServiceInterface {
private static RemoteService service = null; private static RemoteService service = null;
@@ -57,7 +66,8 @@ public class RemoteService implements RemoteServiceInterface {
return service; return service;
} }
private RemoteService() {} private RemoteService() {
}
@Override @Override
public long doRemoteFunction(int value) { public long doRemoteFunction(int value) {
@@ -74,9 +84,10 @@ public class RemoteService implements RemoteServiceInterface {
} }
``` ```
A service ambassador adding additional features such as logging, latency checks A service ambassador adds additional features such as logging and latency checks.
```java ```java
@Slf4j @Slf4j
public class ServiceAmbassador implements RemoteServiceInterface { public class ServiceAmbassador implements RemoteServiceInterface {
private static final int RETRIES = 3; private static final int RETRIES = 3;
@@ -125,9 +136,10 @@ public class ServiceAmbassador implements RemoteServiceInterface {
} }
``` ```
A client has a local service ambassador used to interact with the remote service: A client has a local service ambassador used to interact with the remote service.
```java ```java
@Slf4j @Slf4j
public class Client { public class Client {
private final ServiceAmbassador serviceAmbassador = new ServiceAmbassador(); private final ServiceAmbassador serviceAmbassador = new ServiceAmbassador();
@@ -156,31 +168,24 @@ public class App {
Here's the output for running the example: Here's the output for running the example:
```java ```java
Time taken (ms): 111 Time taken(ms):111
Service result: 120 Service result:120
Time taken (ms): 931 Time taken(ms):931
Failed to reach remote: (1) Failed to reach remote:(1)
Time taken (ms): 665 Time taken(ms):665
Failed to reach remote: (2) Failed to reach remote:(2)
Time taken (ms): 538 Time taken(ms):538
Failed to reach remote: (3) Failed to reach remote:(3)
Service result: -1 Service result:-1
``` ```
## Class diagram ## When to Use the Ambassador Pattern in Java
![alt text](./etc/ambassador.urm.png "Ambassador class diagram") * The Ambassador Pattern is particularly beneficial for Cloud Native and Microservices Architectures in Java. It helps in monitoring, logging, and securing inter-service communication, making it ideal for distributed systems.
* Legacy System Integration: Facilitates communication with newer services by handling necessary but non-core functionalities.
* Performance Enhancement: Can be used to cache results or compress data to improve communication efficiency.
## Applicability Typical use cases include:
Ambassador is applicable when working with a legacy remote service which cannot be modified or would be extremely
difficult to modify. Connectivity features can be implemented on the client avoiding the need for changes on the remote
service.
* Ambassador provides a local interface for a remote service.
* Ambassador provides logging, circuit breaking, retries and security on the client.
## Typical Use Case
* Control access to another object * Control access to another object
* Implement logging * Implement logging
@@ -188,15 +193,44 @@ service.
* Offload remote service tasks * Offload remote service tasks
* Facilitate network connection * Facilitate network connection
## Known uses ## Benefits and Trade-offs of Ambassador Pattern
Benefits:
* Separation of Concerns: Offloads cross-cutting concerns from the service logic, leading to cleaner, more maintainable code.
* Reusable Infrastructure Logic: The ambassador pattern allows the same logic (e.g., logging, monitoring) to be reused across multiple services.
* Improved Security: Centralizes security features like SSL termination or authentication, reducing the risk of misconfiguration.
* Flexibility: Makes it easier to update or replace infrastructure concerns without modifying the service code.
Trade-offs:
* Increased Complexity: Adds another layer to the architecture, which can complicate the system design and debugging.
* Potential Performance Overhead: The additional network hop can introduce latency and overhead, particularly if not optimized.
* Deployment Overhead: Requires additional resources and management for deploying and scaling ambassador services.
## Real-World Applications of Ambassador Pattern in Java
* Service Mesh Implementations: In a service mesh architecture, like Istio or Linkerd, the Ambassador pattern is often employed as a sidecar proxy that handles inter-service communications. This includes tasks such as service discovery, routing, load balancing, telemetry (metrics and tracing), and security (authentication and authorization).
* API Gateways: API gateways can use the Ambassador pattern to encapsulate common functionalities like rate limiting, caching, request shaping, and authentication. This allows backend services to focus on their core business logic without being burdened by these cross-cutting concerns.
* Logging and Monitoring: An Ambassador can aggregate logs and metrics from various services and forward them to centralized monitoring tools like Prometheus or ELK Stack (Elasticsearch, Logstash, Kibana). This simplifies the logging and monitoring setup for each service and provides a unified view of the system's health.
* Security: Security-related functionalities such as SSL/TLS termination, identity verification, and encryption can be managed by an Ambassador. This ensures consistent security practices across services and reduces the likelihood of security breaches due to misconfigurations.
* Resilience: The Ambassador can implement resilience patterns like circuit breakers, retries, and timeouts. For instance, Netflix's Hystrix library can be used within an Ambassador to prevent cascading failures in a microservices ecosystem.
* Database Proxy: Ambassadors can act as proxies for database connections, providing functionalities like connection pooling, read/write splitting for replicas, and query caching. This offloads significant complexity from the application services.
* Legacy System Integration: In scenarios where modern microservices need to communicate with legacy systems, an Ambassador can serve as an intermediary that translates protocols, handles necessary transformations, and implements modern security practices, easing the integration process.
* Network Optimization: For services deployed across different geographical locations or cloud regions, Ambassadors can optimize communication by compressing data, batching requests, or even implementing smart routing to reduce latency and costs.
* [Kubernetes-native API gateway for microservices](https://github.com/datawire/ambassador) * [Kubernetes-native API gateway for microservices](https://github.com/datawire/ambassador)
## Related patterns ## Related Java Design Patterns
* [Proxy](https://java-design-patterns.com/patterns/proxy/) * [Circuit Breaker](https://java-design-patterns.com/patterns/circuit-breaker/): Often used in conjunction to manage fault tolerance by stopping calls to an unresponsive service.
* [Decorator](https://java-design-patterns.com/patterns/decorator/): The decorator pattern is used to add functionality to an object dynamically, while the ambassador pattern is used to offload functionality to a separate object.
* [Proxy](https://java-design-patterns.com/patterns/proxy/): Shares similarities with the proxy pattern, but the ambassador pattern specifically focuses on offloading ancillary functionalities.
* Sidecar: A similar pattern used in the context of containerized applications, where a sidecar container provides additional functionality to the main application container.
## Credits ## References and Credits
* [Ambassador pattern](https://docs.microsoft.com/en-us/azure/architecture/patterns/ambassador) * [Building Microservices: Designing Fine-Grained Systems](https://amzn.to/43aGpSR)
* [Designing Distributed Systems: Patterns and Paradigms for Scalable, Reliable Services](https://www.amazon.com/s?k=designing+distributed+systems&sprefix=designing+distri%2Caps%2C156&linkCode=ll2&tag=javadesignpat-20&linkId=a12581e625462f9038557b01794e5341&language=en_US&ref_=as_li_ss_tl) * [Cloud Native Patterns: Designing Change-tolerant Software](https://amzn.to/3wUAl4O)
* [Designing Distributed Systems: Patterns and Paradigms for Scalable, Reliable Services](https://amzn.to/3T9g9Uj)
* [Microservices Patterns: With examples in Java](https://amzn.to/3UyWD5O)
* [Ambassador pattern (Microsoft)](https://docs.microsoft.com/en-us/azure/architecture/patterns/ambassador)
Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

+8
View File
@@ -34,6 +34,14 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>ambassador</artifactId> <artifactId>ambassador</artifactId>
<dependencies> <dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.junit.jupiter</groupId> <groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId> <artifactId>junit-jupiter-engine</artifactId>
@@ -28,8 +28,8 @@ package com.iluwatar.ambassador;
* The ambassador pattern creates a helper service that sends network requests on behalf of a * The ambassador pattern creates a helper service that sends network requests on behalf of a
* client. It is often used in cloud-based applications to offload features of a remote service. * client. It is often used in cloud-based applications to offload features of a remote service.
* *
* <p>An ambassador service can be thought of as an out-of-process proxy that is co-located with * <p>An ambassador service can be thought of as an out-of-process proxy that is co-located with the
* the client. Similar to the proxy design pattern, the ambassador service provides an interface for * client. Similar to the proxy design pattern, the ambassador service provides an interface for
* another remote service. In addition to the interface, the ambassador provides extra functionality * another remote service. In addition to the interface, the ambassador provides extra functionality
* and features, specifically offloaded common connectivity tasks. This usually consists of * and features, specifically offloaded common connectivity tasks. This usually consists of
* monitoring, logging, routing, security etc. This is extremely useful in legacy applications where * monitoring, logging, routing, security etc. This is extremely useful in legacy applications where
@@ -37,14 +37,11 @@ package com.iluwatar.ambassador;
* capabilities. * capabilities.
* *
* <p>In this example, we will the ({@link ServiceAmbassador}) class represents the ambassador while * <p>In this example, we will the ({@link ServiceAmbassador}) class represents the ambassador while
* the * the ({@link RemoteService}) class represents a remote application.
* ({@link RemoteService}) class represents a remote application.
*/ */
public class App { public class App {
/** /** Entry point. */
* Entry point.
*/
public static void main(String[] args) { public static void main(String[] args) {
var host1 = new Client(); var host1 = new Client();
var host2 = new Client(); var host2 = new Client();
@@ -26,9 +26,7 @@ package com.iluwatar.ambassador;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
/** /** A simple Client. */
* A simple Client.
*/
@Slf4j @Slf4j
public class Client { public class Client {
@@ -29,9 +29,7 @@ import static java.lang.Thread.sleep;
import com.iluwatar.ambassador.util.RandomProvider; import com.iluwatar.ambassador.util.RandomProvider;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
/** /** A remote legacy application represented by a Singleton implementation. */
* A remote legacy application represented by a Singleton implementation.
*/
@Slf4j @Slf4j
public class RemoteService implements RemoteServiceInterface { public class RemoteService implements RemoteServiceInterface {
private static final int THRESHOLD = 200; private static final int THRESHOLD = 200;
@@ -49,9 +47,7 @@ public class RemoteService implements RemoteServiceInterface {
this(Math::random); this(Math::random);
} }
/** /** This constructor is used for testing purposes only. */
* This constructor is used for testing purposes only.
*/
RemoteService(RandomProvider randomProvider) { RemoteService(RandomProvider randomProvider) {
this.randomProvider = randomProvider; this.randomProvider = randomProvider;
} }
@@ -75,7 +71,8 @@ public class RemoteService implements RemoteServiceInterface {
LOGGER.error("Thread sleep state interrupted", e); LOGGER.error("Thread sleep state interrupted", e);
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }
return waitTime <= THRESHOLD ? value * 10 return waitTime <= THRESHOLD
? value * 10
: RemoteServiceStatus.FAILURE.getRemoteServiceStatusValue(); : RemoteServiceStatus.FAILURE.getRemoteServiceStatusValue();
} }
} }
@@ -24,9 +24,7 @@
*/ */
package com.iluwatar.ambassador; package com.iluwatar.ambassador;
/** /** Interface shared by ({@link RemoteService}) and ({@link ServiceAmbassador}). */
* Interface shared by ({@link RemoteService}) and ({@link ServiceAmbassador}).
*/
interface RemoteServiceInterface { interface RemoteServiceInterface {
long doRemoteFunction(int value); long doRemoteFunction(int value);
@@ -24,25 +24,21 @@
*/ */
package com.iluwatar.ambassador; package com.iluwatar.ambassador;
import lombok.Getter;
/** /**
* Holds information regarding the status of the Remote Service. * Holds information regarding the status of the Remote Service.
* *
* <p> This Enum replaces the integer value previously * <p>This Enum replaces the integer value previously stored in {@link RemoteServiceInterface} as
* stored in {@link RemoteServiceInterface} as SonarCloud was identifying * SonarCloud was identifying it as an issue. All test cases have been checked after changes,
* it as an issue. All test cases have been checked after changes, * without failures.
* without failures. </p>
*/ */
public enum RemoteServiceStatus { public enum RemoteServiceStatus {
FAILURE(-1); FAILURE(-1);
private final long remoteServiceStatusValue; @Getter private final long remoteServiceStatusValue;
RemoteServiceStatus(long remoteServiceStatusValue) { RemoteServiceStatus(long remoteServiceStatusValue) {
this.remoteServiceStatusValue = remoteServiceStatusValue; this.remoteServiceStatusValue = remoteServiceStatusValue;
} }
public long getRemoteServiceStatusValue() {
return remoteServiceStatusValue;
}
} }
@@ -40,8 +40,7 @@ public class ServiceAmbassador implements RemoteServiceInterface {
private static final int RETRIES = 3; private static final int RETRIES = 3;
private static final int DELAY_MS = 3000; private static final int DELAY_MS = 3000;
ServiceAmbassador() { ServiceAmbassador() {}
}
@Override @Override
public long doRemoteFunction(int value) { public long doRemoteFunction(int value) {
Loaded 100 of 3261 files, more files were not shown because too many files have changed in this diff. Show more