From fb507110442bc2a132704c45bdc6364197c0119d Mon Sep 17 00:00:00 2001 From: Chant3ll3 <141697333+Chant3ll3@users.noreply.github.com> Date: Wed, 27 Dec 2023 16:57:24 +1100 Subject: [PATCH 001/763] docs: Update README.md for monadPattern (#2717) * Update README.md for monadPattern * Added space in Monad README.md --- monad/README.md | 101 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/monad/README.md b/monad/README.md index f53632faee70..9ccaaebb98ce 100644 --- a/monad/README.md +++ b/monad/README.md @@ -15,6 +15,107 @@ operations: bind - that takes monadic object and a function from plain object to monadic value and returns monadic value return - that takes plain type object and returns this object wrapped in a monadic value. +## Explanation + +The Monad pattern provides a way to chain operations together and manage sequencing, +side effects, and exception handling in a consistent manner. + +Real-world example + +> Consider a conveyor belt in a factory: items move from one station to another, +> and each station performs a specific task, with the assurance that every task will be carried out, +> even if some items are rejected at certain stations. + +In plain words + +> Monad pattern ensures that each operation is executed regardless of the success or failure of previous ones. + +Wikipedia says + +> In functional programming, a monad is a structure that combines program fragments (functions) +> and wraps their return values in a type with additional computation. In addition to defining a +> wrapping monadic type, monads define two operators: one to wrap a value in the monad type, and +> another to compose together functions that output values of the monad type (these are known as +> monadic functions). General-purpose languages use monads to reduce boilerplate code needed for +> common operations (such as dealing with undefined values or fallible functions, or encapsulating +> bookkeeping code). Functional languages use monads to turn complicated sequences of functions into +> succinct pipelines that abstract away control flow, and side-effects. + +**Programmatic Example** + +Here’s the Monad implementation in Java. + +The `Validator` takes an object, validates it against specified predicates, and collects any +validation errors. The `validate` method allows you to add validation steps, and the `get` method +either returns the validated object or throws an `IllegalStateException` with a list of validation +exceptions if any of the validation steps fail. + +```java +public class Validator { + private final T obj; + private final List exceptions = new ArrayList<>(); + + private Validator(T obj) { + this.obj = obj; + } + public static Validator of(T t) { + return new Validator<>(Objects.requireNonNull(t)); + } + + public Validator validate(Predicate validation, String message) { + if (!validation.test(obj)) { + exceptions.add(new IllegalStateException(message)); + } + return this; + } + + public Validator validate( + Function projection, + Predicate validation, + String message + ) { + return validate(projection.andThen(validation::test)::apply, message); + } + + public T get() throws IllegalStateException { + if (exceptions.isEmpty()) { + return obj; + } + var e = new IllegalStateException(); + exceptions.forEach(e::addSuppressed); + throw e; + } +} +``` + +Next we define an enum `Sex`. + +```java +public enum Sex { + MALE, FEMALE +} +``` + +Now we can introduce the `User`. + +```java +public record User(String name, int age, Sex sex, String email) { +} +``` + +And finally, a `User` object is validated for its name, email, and age using the `Validator` monad. + +```java +public static void main(String[] args) { + var user = new User("user", 24, Sex.FEMALE, "foobar.com"); + LOGGER.info(Validator.of(user).validate(User::name, Objects::nonNull, "name is null") + .validate(User::name, name -> !name.isEmpty(), "name is empty") + .validate(User::email, email -> !email.contains("@"), "email doesn't contains '@'") + .validate(User::age, age -> age > 20 && age < 30, "age isn't between...").get() + .toString()); +} +``` + ## Class diagram ![alt text](./etc/monad.png "Monad") From 5df1fb6f13d708457ea2a22e79c245fe34b82790 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 27 Dec 2023 07:58:15 +0200 Subject: [PATCH 002/763] docs: add Chant3ll3 as a contributor for doc (#2788) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0564a4153fcb..ff24dadd6399 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2834,6 +2834,15 @@ "contributions": [ "code" ] + }, + { + "login": "Chant3ll3", + "name": "Chant3ll3", + "avatar_url": "https://avatars.githubusercontent.com/u/141697333?v=4", + "profile": "https://github.com/Chant3ll3", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index f14fff2afcab..935352e3de8b 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![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) -[![All Contributors](https://img.shields.io/badge/all_contributors-311-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-312-orange.svg?style=flat-square)](#contributors-)
@@ -475,6 +475,7 @@ This project is licensed under the terms of the MIT license. João Fernandes
João Fernandes

🌍 Hong Geon-ui
Hong Geon-ui

🌍 Doksanbir
Doksanbir

💻 + Chant3ll3
Chant3ll3

📖 From cd2dbb72d7aca165d88cff5000f4175e2532e98b Mon Sep 17 00:00:00 2001 From: YongHwan Kwon <67625677+hwan33@users.noreply.github.com> Date: Wed, 27 Dec 2023 15:06:55 +0900 Subject: [PATCH 003/763] feat: Add Microservice Pattern, Log aggregation (#2690) (#2719) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: Add Microservice Pattern, Log aggregation. Related: #2690 * docs: Add javaDoc for public methods. Related: #2690 --------- Co-authored-by: Ilkka Seppälä --- log-aggregation/README.md | 59 +++++++++ log-aggregation/etc/log-aggregation.png | Bin 0 -> 69263 bytes log-aggregation/etc/log-aggregation.puml | 51 ++++++++ log-aggregation/pom.xml | 32 +++++ .../java/com/iluwatar/logaggregation/App.java | 53 ++++++++ .../logaggregation/CentralLogStore.java | 63 +++++++++ .../logaggregation/LogAggregator.java | 120 ++++++++++++++++++ .../com/iluwatar/logaggregation/LogEntry.java | 42 ++++++ .../com/iluwatar/logaggregation/LogLevel.java | 38 ++++++ .../iluwatar/logaggregation/LogProducer.java | 54 ++++++++ .../logaggregation/LogAggregatorTest.java | 80 ++++++++++++ pom.xml | 1 + 12 files changed, 593 insertions(+) create mode 100644 log-aggregation/README.md create mode 100644 log-aggregation/etc/log-aggregation.png create mode 100644 log-aggregation/etc/log-aggregation.puml create mode 100644 log-aggregation/pom.xml create mode 100644 log-aggregation/src/main/java/com/iluwatar/logaggregation/App.java create mode 100644 log-aggregation/src/main/java/com/iluwatar/logaggregation/CentralLogStore.java create mode 100644 log-aggregation/src/main/java/com/iluwatar/logaggregation/LogAggregator.java create mode 100644 log-aggregation/src/main/java/com/iluwatar/logaggregation/LogEntry.java create mode 100644 log-aggregation/src/main/java/com/iluwatar/logaggregation/LogLevel.java create mode 100644 log-aggregation/src/main/java/com/iluwatar/logaggregation/LogProducer.java create mode 100644 log-aggregation/src/test/java/com/iluwatar/logaggregation/LogAggregatorTest.java diff --git a/log-aggregation/README.md b/log-aggregation/README.md new file mode 100644 index 000000000000..f6d979517b9a --- /dev/null +++ b/log-aggregation/README.md @@ -0,0 +1,59 @@ +--- +title: Log aggregation +category: Architectural +language: en +tag: + - Microservices + - Extensibility +--- + +## Intent + +Centralize, streamline, and optimize the process of log management so that insights can be quickly +derived, problems can be swiftly identified and resolved, and the system's overall health can be +monitored efficiently. + +## Explanation + +Real-world example + +> AWS CloudWatch aggregates logs from various AWS services for monitoring and alerting. + + +In plain words + +> The primary goal is to consolidate logs from different sources, making them more accessible and +> actionable. Various tools and platforms, such as Elasticsearch-Logstash-Kibana (ELK) stack, +> Splunk, +> Graylog, and others, are employed in these real-world scenarios to facilitate log aggregation. + +Wikipedia says + +> You have applied the Microservice architecture pattern. The application consists of multiple +> services and service instances that are running on multiple machines. Requests often span multiple +> service instances. Each service instance generates writes information about what it is doing to a +> log file in a standardized format. The log file contains errors, warnings, information and debug +> messages. + + +## Class diagram + +![class diagram](./etc/log-aggregation.png) + +## Applicability + +1. Distributed Systems and Microservices + - In modern architectures where systems are split into smaller, independent microservices running across multiple servers or even data centers, aggregating logs from all these services is crucial for a holistic view of system health and activity. + +2. Troubleshooting and Debugging + - When system failures or unexpected behaviors occur, engineers need consolidated logs to trace and diagnose issues. Log aggregation makes this process efficient by collecting all relevant logs in one place. + +3. Security and Compliance Monitoring + - Many industries have regulatory requirements for log retention and analysis. Log aggregation helps in collecting, retaining, and analyzing logs for unauthorized access, potential breaches, and other security threats. + +4. Performance Monitoring + - Aggregated logs can be used to identify performance bottlenecks, slow database queries, or service endpoints experiencing high latencies. + +## Credits + +* [Pattern: Log aggregation](https://microservices.io/patterns/observability/application-logging.html) diff --git a/log-aggregation/etc/log-aggregation.png b/log-aggregation/etc/log-aggregation.png new file mode 100644 index 0000000000000000000000000000000000000000..4ce56be7064f52a216ce3d94152fa003f26bd3b3 GIT binary patch literal 69263 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 QF!9S$5^_fp#LnFKKjjnm)&Kwi literal 0 HcmV?d00001 diff --git a/log-aggregation/etc/log-aggregation.puml b/log-aggregation/etc/log-aggregation.puml new file mode 100644 index 000000000000..b35873e17ad7 --- /dev/null +++ b/log-aggregation/etc/log-aggregation.puml @@ -0,0 +1,51 @@ +@startuml + +package com.iluwatar.logaggregation { + + class App { + + main(args: String[]) {static} + } + + class CentralLogStore { + - logs: ConcurrentLinkedQueue + + storeLog(logEntry: LogEntry) + + displayLogs() + } + + class LogAggregator { + - BUFFER_THRESHOLD: int {static} + - centralLogStore: CentralLogStore + - buffer: ConcurrentLinkedQueue + - minLogLevel: LogLevel + - executorService: ExecutorService + - logCount: AtomicInteger + + collectLog(logEntry: LogEntry) + + stop() + } + + class LogEntry { + - serviceName: String + - level: LogLevel + - message: String + - timestamp: LocalDateTime + } + + enum LogLevel { + DEBUG + INFO + ERROR + } + + class LogProducer { + - serviceName: String + - aggregator: LogAggregator + + generateLog(level: LogLevel, message: String) + } +} + +LogProducer --> "-aggregator" LogAggregator +LogAggregator --> "-centralLogStore" CentralLogStore +LogAggregator --> "-buffer" LogEntry +CentralLogStore --> "-logs" LogEntry + +@enduml diff --git a/log-aggregation/pom.xml b/log-aggregation/pom.xml new file mode 100644 index 000000000000..886d712ff403 --- /dev/null +++ b/log-aggregation/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + + com.iluwatar + java-design-patterns + 1.26.0-SNAPSHOT + + + log-aggregation + + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.mockito + mockito-junit-jupiter + test + + + + 17 + 17 + UTF-8 + + + diff --git a/log-aggregation/src/main/java/com/iluwatar/logaggregation/App.java b/log-aggregation/src/main/java/com/iluwatar/logaggregation/App.java new file mode 100644 index 000000000000..ef9ca0a7ba87 --- /dev/null +++ b/log-aggregation/src/main/java/com/iluwatar/logaggregation/App.java @@ -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-2023 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.logaggregation; + +/** + * The main application class responsible for demonstrating the log aggregation mechanism. Creates + * services, generates logs, aggregates, and finally displays the logs. + */ +public class App { + + /** + * The entry point of the application. + * + * @param args Command line arguments. + * @throws InterruptedException If any thread has interrupted the current thread. + */ + public static void main(String[] args) throws InterruptedException { + final CentralLogStore centralLogStore = new CentralLogStore(); + final LogAggregator aggregator = new LogAggregator(centralLogStore, LogLevel.INFO); + + final LogProducer serviceA = new LogProducer("ServiceA", aggregator); + final LogProducer serviceB = new LogProducer("ServiceB", aggregator); + + serviceA.generateLog(LogLevel.INFO, "This is an INFO log from ServiceA"); + serviceB.generateLog(LogLevel.ERROR, "This is an ERROR log from ServiceB"); + serviceA.generateLog(LogLevel.DEBUG, "This is a DEBUG log from ServiceA"); + + aggregator.stop(); + centralLogStore.displayLogs(); + } +} diff --git a/log-aggregation/src/main/java/com/iluwatar/logaggregation/CentralLogStore.java b/log-aggregation/src/main/java/com/iluwatar/logaggregation/CentralLogStore.java new file mode 100644 index 000000000000..f7226638c98d --- /dev/null +++ b/log-aggregation/src/main/java/com/iluwatar/logaggregation/CentralLogStore.java @@ -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-2023 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.logaggregation; + +import java.util.concurrent.ConcurrentLinkedQueue; +import lombok.extern.slf4j.Slf4j; + +/** + * A centralized store for logs. It collects logs from various services and stores them. + * This class is thread-safe, ensuring that logs from different services are safely stored + * concurrently without data races. + */ +@Slf4j +public class CentralLogStore { + + private final ConcurrentLinkedQueue logs = new ConcurrentLinkedQueue<>(); + + /** + * Stores the given log entry into the central log store. + * + * @param logEntry The log entry to store. + */ + public void storeLog(LogEntry logEntry) { + if (logEntry == null) { + LOGGER.error("Received null log entry. Skipping."); + return; + } + logs.offer(logEntry); + } + + /** + * Displays all logs currently stored in the central log store. + */ + public void displayLogs() { + LOGGER.info("----- Centralized Logs -----"); + for (LogEntry logEntry : logs) { + LOGGER.info( + logEntry.getTimestamp() + " [" + logEntry.getLevel() + "] " + logEntry.getMessage()); + } + } +} diff --git a/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogAggregator.java b/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogAggregator.java new file mode 100644 index 000000000000..406ce144a03d --- /dev/null +++ b/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogAggregator.java @@ -0,0 +1,120 @@ +/* + * 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-2023 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.logaggregation; + +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import lombok.extern.slf4j.Slf4j; + +/** + * Responsible for collecting and buffering logs from different services. + * Once the logs reach a certain threshold or after a certain time interval, + * they are flushed to the central log store. This class ensures logs are collected + * and processed asynchronously and efficiently, providing both an immediate collection + * and periodic flushing. + */ +@Slf4j +public class LogAggregator { + + private static final int BUFFER_THRESHOLD = 3; + private final CentralLogStore centralLogStore; + private final ConcurrentLinkedQueue buffer = new ConcurrentLinkedQueue<>(); + private final LogLevel minLogLevel; + private final ExecutorService executorService = Executors.newSingleThreadExecutor(); + private final AtomicInteger logCount = new AtomicInteger(0); + + /** + * constructor of LogAggregator. + * + * @param centralLogStore central log store implement + * @param minLogLevel min log level to store log + */ + public LogAggregator(CentralLogStore centralLogStore, LogLevel minLogLevel) { + this.centralLogStore = centralLogStore; + this.minLogLevel = minLogLevel; + startBufferFlusher(); + } + + /** + * Collects a given log entry, and filters it by the defined log level. + * + * @param logEntry The log entry to collect. + */ + public void collectLog(LogEntry logEntry) { + if (logEntry.getLevel() == null || minLogLevel == null) { + LOGGER.warn("Log level or threshold level is null. Skipping."); + return; + } + + if (logEntry.getLevel().compareTo(minLogLevel) < 0) { + LOGGER.debug("Log level below threshold. Skipping."); + return; + } + + buffer.offer(logEntry); + + if (logCount.incrementAndGet() >= BUFFER_THRESHOLD) { + flushBuffer(); + } + } + + /** + * Stops the log aggregator service and flushes any remaining logs to + * the central log store. + * + * @throws InterruptedException If any thread has interrupted the current thread. + */ + public void stop() throws InterruptedException { + executorService.shutdownNow(); + if (!executorService.awaitTermination(10, TimeUnit.SECONDS)) { + LOGGER.error("Log aggregator did not terminate."); + } + flushBuffer(); + } + + private void flushBuffer() { + LogEntry logEntry; + while ((logEntry = buffer.poll()) != null) { + centralLogStore.storeLog(logEntry); + logCount.decrementAndGet(); + } + } + + private void startBufferFlusher() { + executorService.execute(() -> { + while (!Thread.currentThread().isInterrupted()) { + try { + Thread.sleep(5000); // Flush every 5 seconds. + flushBuffer(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + }); + } +} diff --git a/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogEntry.java b/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogEntry.java new file mode 100644 index 000000000000..bece65c64d21 --- /dev/null +++ b/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogEntry.java @@ -0,0 +1,42 @@ +/* + * 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-2023 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.logaggregation; + +import java.time.LocalDateTime; +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * Represents a single log entry, capturing essential details like the service name, + * log level, message, and the timestamp when the log was generated. + */ +@Data +@AllArgsConstructor +public class LogEntry { + private String serviceName; + private LogLevel level; + private String message; + private LocalDateTime timestamp; +} diff --git a/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogLevel.java b/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogLevel.java new file mode 100644 index 000000000000..ed9258649189 --- /dev/null +++ b/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogLevel.java @@ -0,0 +1,38 @@ +/* + * 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-2023 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.logaggregation; + +/** + * Enum representing different log levels. + * Defines the severity of a log message, helping in filtering and prioritization. + *
    + *
  • DEBUG: Detailed information, typically of interest only when diagnosing problems.
  • + *
  • INFO: Confirmation that things are working as expected.
  • + *
  • ERROR: Indicates a problem that needs attention.
  • + *
+ */ +public enum LogLevel { + DEBUG, INFO, ERROR +} diff --git a/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogProducer.java b/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogProducer.java new file mode 100644 index 000000000000..f6ca7f0ded12 --- /dev/null +++ b/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogProducer.java @@ -0,0 +1,54 @@ +/* + * 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-2023 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.logaggregation; + +import java.time.LocalDateTime; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +/** + * Represents a service that produces logs. + * The logs are generated based on certain activities or events within the service. + * Once a log is generated, it's passed on to the aggregator for further processing. + */ +@AllArgsConstructor +@Slf4j +public class LogProducer { + + private String serviceName; + private LogAggregator aggregator; + + /** + * Generates a log entry with the given log level and message. + * + * @param level The level of the log. + * @param message The message of the log. + */ + public void generateLog(LogLevel level, String message) { + final LogEntry logEntry = new LogEntry(serviceName, level, message, LocalDateTime.now()); + LOGGER.info("Producing log: " + logEntry.getMessage()); + aggregator.collectLog(logEntry); + } +} diff --git a/log-aggregation/src/test/java/com/iluwatar/logaggregation/LogAggregatorTest.java b/log-aggregation/src/test/java/com/iluwatar/logaggregation/LogAggregatorTest.java new file mode 100644 index 000000000000..182e7252769f --- /dev/null +++ b/log-aggregation/src/test/java/com/iluwatar/logaggregation/LogAggregatorTest.java @@ -0,0 +1,80 @@ +/* + * 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-2023 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.logaggregation; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import java.time.LocalDateTime; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class LogAggregatorTest { + + @Mock + private CentralLogStore centralLogStore; + private LogAggregator logAggregator; + + @BeforeEach + void setUp() { + logAggregator = new LogAggregator(centralLogStore, LogLevel.INFO); + } + + @Test + void whenThreeInfoLogsAreCollected_thenCentralLogStoreShouldStoreAllOfThem() { + logAggregator.collectLog(createLogEntry(LogLevel.INFO, "Sample log message 1")); + logAggregator.collectLog(createLogEntry(LogLevel.INFO, "Sample log message 2")); + + verifyNoInteractionsWithCentralLogStore(); + + logAggregator.collectLog(createLogEntry(LogLevel.INFO, "Sample log message 3")); + + verifyCentralLogStoreInvokedTimes(3); + } + + @Test + void whenDebugLogIsCollected_thenNoLogsShouldBeStored() { + logAggregator.collectLog(createLogEntry(LogLevel.DEBUG, "Sample debug log message")); + + verifyNoInteractionsWithCentralLogStore(); + } + + private static LogEntry createLogEntry(LogLevel logLevel, String message) { + return new LogEntry("ServiceA", logLevel, message, LocalDateTime.now()); + } + + private void verifyNoInteractionsWithCentralLogStore() { + verify(centralLogStore, times(0)).storeLog(any()); + } + + private void verifyCentralLogStoreInvokedTimes(int times) { + verify(centralLogStore, times(times)).storeLog(any()); + } +} diff --git a/pom.xml b/pom.xml index 133e8565dcf3..48e725a4f9bc 100644 --- a/pom.xml +++ b/pom.xml @@ -208,6 +208,7 @@ thread-local-storage optimistic-offline-lock crtp + log-aggregation health-check From 8ca7f686e98323f4de621684425c7b0e6c8880ec Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 27 Dec 2023 08:08:08 +0200 Subject: [PATCH 004/763] docs: add hwan33 as a contributor for code (#2789) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index ff24dadd6399..0aeafa60dcee 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2843,6 +2843,15 @@ "contributions": [ "doc" ] + }, + { + "login": "hwan33", + "name": "YongHwan Kwon", + "avatar_url": "https://avatars.githubusercontent.com/u/67625677?v=4", + "profile": "https://hwan33.tistory.com/", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 935352e3de8b..0b1249bb4516 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![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) -[![All Contributors](https://img.shields.io/badge/all_contributors-312-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-313-orange.svg?style=flat-square)](#contributors-)
@@ -476,6 +476,7 @@ This project is licensed under the terms of the MIT license. Hong Geon-ui
Hong Geon-ui

🌍 Doksanbir
Doksanbir

💻 Chant3ll3
Chant3ll3

📖 + YongHwan Kwon
YongHwan Kwon

💻 From a10aa40a0386cdad5e805cf66b71ad03afc2aa08 Mon Sep 17 00:00:00 2001 From: Leonardo Lisanti Date: Wed, 27 Dec 2023 07:25:02 +0100 Subject: [PATCH 005/763] translation: translation of adapter pattern to Italian (#2732) Co-authored-by: Leonardo Lisanti --- localization/it/adapter/README.md | 136 ++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 localization/it/adapter/README.md diff --git a/localization/it/adapter/README.md b/localization/it/adapter/README.md new file mode 100644 index 000000000000..520799f12b1a --- /dev/null +++ b/localization/it/adapter/README.md @@ -0,0 +1,136 @@ +--- +title: Adapter +category: Structural +language: it +tag: + - Gang of Four +--- + +## Anche conosciuto come +Wrapper + +## Intento +Convertire l'interfaccia di una classe in un'altra interfaccia attesa dal cliente. Il pattern Adapter consente a classi di collaborare con altre classi con cui altrimenti non potrebbero farlo a causa di problemi di compatibilità. + +## Spiegazione + +Esempio del mondo reale + +> Immagina di avere delle immagini su una scheda di memoria e desideri trasferirle sul tuo computer. Per effettuare il trasferimento, hai bisogno di un tipo di adattatore compatibile con le porte del tuo computer, in modo da poter inserire la tua scheda. In questo caso, il lettore di schede è un adattatore (adapter). +> Un altro esempio potrebbe essere l'ampiamente noto adattatore di corrente; una spina con tre pin non può essere collegata a una presa con due fori, è necessario un adattatore per renderla compatibile con la presa di corrente. +> Un altro esempio sarebbe un traduttore simultaneo che traduce le parole pronunciate da una persona a un'altra. + +In parole semplici + +> Il pattern Adapter permette di incapsulare un oggetto in un adattatore per renderlo compatibile con una classe con cui sarebbe altrimenti incompatibile. + +Wikipedia dice + +> In ingegneria del software, il pattern Adapter è un design pattern del software che consente all'interfaccia di una classe esistente di essere utilizzata come un'altra interfaccia. Spesso viene utilizzato per far sì che classi esistenti possano collaborare con altre senza dover modificare il loro codice sorgente. _(Testo tradotto dalla voce Adapter Pattern da Wikipedia in lingua inglese)._ + +**Esempio di codice** + +Immagina un capitano che sa utilizzare solo barche a remi e non sa navigare affatto. + +Innanzitutto, abbiamo le interfacce `RowingBoat` e `FishingBoat` + +```java +public interface RowingBoat { + void row(); +} + +@Slf4j +public class FishingBoat { + public void sail() { + LOGGER.info("The fishing boat is sailing"); + } +} +``` + +E il capitano si aspetta che ci sia un'implementazione dell'interfaccia `RowingBoat` per potersi muovere. + +```java +public class Captain { + + private final RowingBoat rowingBoat; + // default constructor and setter for rowingBoat + public Captain(RowingBoat rowingBoat) { + this.rowingBoat = rowingBoat; + } + + public void row() { + rowingBoat.row(); + } +} +``` + +Ora immaginiamo che i pirati stiano arrivando e il nostro capitano debba scappare, ma è disponibile solo una barca da pesca. Dobbiamo creare un adattatore che consenta al capitano di navigare con la barca da pesca con le sue abilità di saper utilizzare le barche a remi. +```java +@Slf4j +public class FishingBoatAdapter implements RowingBoat { + + private final FishingBoat boat; + + public FishingBoatAdapter() { + boat = new FishingBoat(); + } + + @Override + public void row() { + boat.sail(); + } +} +``` + +E ora il `Captain` può usare la `FishingBoat` per sfuggire ai pirati. + +```java +var captain = new Captain(new FishingBoatAdapter()); +captain.row(); +``` + +## Diagramma delle classi +![alt text](../../../adapter/etc/adapter.urm.png "Adapter class diagram") + +## Applicabilità +Utilizza il pattern Adapter quando + +* Vuoi utilizzare una classe esistente, ma la sua interfaccia non corrisponde a quella di cui hai bisogno +* Desideri creare una classe riutilizzabile che collabori con classi non correlate o non previste, ovvero classi che non necessariamente hanno interfacce compatibili. +* Hai bisogno di utilizzare diverse sottoclassi esistenti, ma sarebbe impraticabile adattare la loro interfaccia mediante la creazione di sottoclassi per ognuna di esse. Un adapter può adattare l'interfaccia della sua classe padre. +* Nella maggior parte delle applicazioni che utilizzano librerie di terze parti, si utilizzano adapter come strato intermedio tra l'applicazione e la libreria di terze parti per disaccoppiare l'applicazione dalla libreria stessa. Se è necessario utilizzare un'altra libreria, è sufficiente creare un nuovo adapter per la nuova libreria senza dover modificare il codice dell'applicazione. + +## Tutorial + +* [Dzone](https://dzone.com/articles/adapter-design-pattern-in-java) +* [Refactoring Guru](https://refactoring.guru/design-patterns/adapter/java/example) +* [Baeldung](https://www.baeldung.com/java-adapter-pattern) +* [GeeksforGeeks](https://www.geeksforgeeks.org/adapter-pattern/) + + +## Conseguenze +Gli adapter di classe e oggetti comportano scelte diverse. Un adapter di classe + +* Effettua l'adattamento rimanendo legato a una classe adattata specifica. Di conseguenza, un adapter di classe non funzionerà quando desideriamo adattare una classe e le sue sottoclassi. +* Permette all'Adapater di modificare il comportamento della classe adattata perché l'adpater è una sottoclasse della classe adattata. +* Utilizza un solo oggetto e non richiede l'uso di puntatori aggiuntivi per fare riferimento alla classe adattata. + +Un adapter di oggetto + +* Permette a un singolo Adapter di lavorare con diverse classi adattate, ovvero con la classe adattata e tutte le sue sottoclassi (se ne ha). L'Adapter può anche aggiungere funzionalità a tutte le classi adattate contemporaneamente. +* Rende più complicata la modifica del comportamento della classe adattata. Sarebbe necessario creare una sottoclasse della classe da adattare e far sì che l'Adapter faccia riferimento alla sottoclasse anziché alla classe da adattare. + +## Esempi del mondo reale + +* [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#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-) + + +## Collegamenti esterni + +* [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) +* [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) +* [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://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) From c8e5f6f8bd40f2d46426effc03175eb849e52a93 Mon Sep 17 00:00:00 2001 From: Leonardo Lisanti Date: Wed, 27 Dec 2023 07:26:51 +0100 Subject: [PATCH 006/763] translation: translation of abstract factory pattern to Italian (#2662) * translation: translation of abstract factory pattern to Italian * Update README.md translation: translation of acyclic visitor pattern to Italian - fixed typo * Update README.md translation: translation of abstract factory pattern to Italian - corrected a sentence --------- Co-authored-by: Leonardo Lisanti --- localization/it/abstract-factory/README.md | 227 +++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 localization/it/abstract-factory/README.md diff --git a/localization/it/abstract-factory/README.md b/localization/it/abstract-factory/README.md new file mode 100644 index 000000000000..beebef9560eb --- /dev/null +++ b/localization/it/abstract-factory/README.md @@ -0,0 +1,227 @@ +--- +title: Abstract Factory +category: Creational +language: it +tag: + - Gang of Four +--- + +## Anche conosciuto come + +Kit + +## Intento + +Fornire un'interfaccia per la creazione di famiglie di oggetti correlati o dipendenti senza specificarne le classi concrete. + +## Spiegazione + +Esempio del mondo reale + +> Per creare un regno, abbiamo bisogno di oggetti con un tema comune. Il regno elfico ha bisogno di un re elfico, di un castello elfico e di un esercito elfico, mentre il regno degli orchi ha bisogno di un re degli orchi, di un castello degli orchi e di un esercito degli orchi. Esiste una dipendenza tra gli oggetti all'interno del regno. + +In parole semplici + +> Una fabbrica di fabbriche; una fabbrica che raggruppa le singole fabbriche correlate o dipendenti senza specificare le loro classi concrete. + +Wikipedia dice + +> L'Abstract Factory fornisce un'interfaccia per creare famiglie di oggetti connessi o dipendenti tra loro, in modo che non ci sia necessità da parte dei client di specificare i nomi delle classi concrete all'interno del proprio codice. + +**Esempio di codice** + +Traducendo l'esempio del regno sopra. Prima di tutto, abbiamo alcune interfacce e implementazioni per gli oggetti all'interno del regno. + +```java +public interface Castle { + String getDescription(); +} + +public interface King { + String getDescription(); +} + +public interface Army { + String getDescription(); +} + +// Elven implementations -> +public class ElfCastle implements Castle { + static final String DESCRIPTION = "This is the elven castle!"; + @Override + public String getDescription() { + return DESCRIPTION; + } +} +public class ElfKing implements King { + static final String DESCRIPTION = "This is the elven king!"; + @Override + public String getDescription() { + return DESCRIPTION; + } +} +public class ElfArmy implements Army { + static final String DESCRIPTION = "This is the elven Army!"; + @Override + public String getDescription() { + return DESCRIPTION; + } +} + +// Orcish implementations similarly -> ... + +``` + +Successivamente, abbiamo l'astrazione e le implementazioni per la fabbrica del regno. + +```java +public interface KingdomFactory { + Castle createCastle(); + King createKing(); + Army createArmy(); +} + +public class ElfKingdomFactory implements KingdomFactory { + + @Override + public Castle createCastle() { + return new ElfCastle(); + } + + @Override + public King createKing() { + return new ElfKing(); + } + + @Override + public Army createArmy() { + return new ElfArmy(); + } +} + +public class OrcKingdomFactory implements KingdomFactory { + + @Override + public Castle createCastle() { + return new OrcCastle(); + } + + @Override + public King createKing() { + return new OrcKing(); + } + + @Override + public Army createArmy() { + return new OrcArmy(); + } +} +``` + +Ora abbiamo la fabbrica astratta che ci consente di creare una famiglia di oggetti correlati, ad esempio la fabbrica del regno elfico crea il castello elfico, il re elfico e l'esercito elfico, ecc. + +```java +var factory = new ElfKingdomFactory(); +var castle = factory.createCastle(); +var king = factory.createKing(); +var army = factory.createArmy(); + +castle.getDescription(); +king.getDescription(); +army.getDescription(); +``` + +Output del programma: + +```java +This is the elven castle! +This is the elven king! +This is the elven Army! +``` + +Ora possiamo progettare una fabbrica per le nostre diverse fabbriche di regni. In questo esempio, abbiamo creato `FactoryMaker`, responsabile di restituire un'istanza di `ElfKingdomFactory` o `OrcKingdomFactory`. +Il client può utilizzare `FactoryMaker` per creare la fabbrica concreta desiderata, che a sua volta produrrà diversi oggetti concreti (derivati da `Army`, `King`, `Castle`). +In questo esempio, abbiamo anche utilizzato un enum per parametrizzare il tipo di fabbrica di regno richiesto dal client. + +```java +public static class FactoryMaker { + + public enum KingdomType { + ELF, ORC + } + + public static KingdomFactory makeFactory(KingdomType type) { + return switch (type) { + case ELF -> new ElfKingdomFactory(); + 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 + } +``` + +## Diagramma delle classi + +![alt text](../../../abstract-factory/etc/abstract-factory.urm.png "Abstract Factory class diagram") + + +## Applicabilità + +Utilizza il pattern Abstract Factory quando + +* Il sistema deve essere indipendente dal modo in cui i suoi prodotti vengono creati, composti e rappresentati. +* Il sistema deve essere configurato con una delle molteplici famiglie di prodotti. +* La famiglia di oggetti di prodotto correlati è progettata per essere utilizzata interamente, e hai bisogno di imporre questo presupposto. +* Vuoi fornire una libreria di classi di prodotto e vuoi esporre solo le loro interfacce, non le loro implementazioni. +* Il tempo di vita della dipendenza è concettualmente più breve di quella del consumer. +* Hai bisogno di un valore di runtime per costruire una particolare dipendenza. +* Vuoi decidere quale prodotto chiamare da una famiglia a runtime. +* Devi fornire uno o più parametri conosciuti solo a runtime prima di poter risolvere una dipendenza. +* Hai bisogno di coerenza tra i prodotti. +* Non vuoi modificare il codice esistente quando aggiungi nuovi prodotti o famiglie di prodotti al programma. + +Esempi di casi d'uso + +* Selezionare la chiamata all'implementazione appropriata di FileSystemAcmeService o DatabaseAcmeService o NetworkAcmeService in fase di esecuzione. +* La scrittura di casi di unit test diventa molto più semplice. +* Strumenti UI per diversi sistemi operativi. + +## Conseguenze + +* La dependency injection in Java nasconde le dipendenze delle classi di servizio, il che può portare a errori a runtime che sarebbero stati rilevati in fase di compilazione. +* Se da un lato il pattern è ottimo per la creazione di oggetti predefiniti, l'aggiunta di nuovi oggetti potrebbe essere complicato. +* Il codice diventa più complesso di quanto dovrebbe essere, poiché vengono introdotte molte nuove interfacce e classi insieme al pattern. + +## Tutorial + +* [Abstract Factory Pattern Tutorial](https://www.journaldev.com/1418/abstract-factory-design-pattern-in-java) + +## Usi noti + +* [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.xpath.XPathFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/xpath/XPathFactory.html#newInstance--) + +## Pattern correlati + +* [Factory Method](https://java-design-patterns.com/patterns/factory-method/) +* [Factory Kit](https://java-design-patterns.com/patterns/factory-kit/) + +## Collegamenti esterni + +* [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: 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) From 7a35b0099db7bd2946c645e78523ead2aae21619 Mon Sep 17 00:00:00 2001 From: Chant3ll3 <141697333+Chant3ll3@users.noreply.github.com> Date: Thu, 28 Dec 2023 20:25:15 +1100 Subject: [PATCH 007/763] translation: Added Chinese Translation for Trampoline Pattern (#2718) * Translated Trampoline README.md to Chinese * Fixed title in README.md --- localization/zh/trampoline/README.md | 135 ++++++++++++++++++ .../zh/trampoline/etc/trampoline_urm.png | Bin 0 -> 15316 bytes 2 files changed, 135 insertions(+) create mode 100644 localization/zh/trampoline/README.md create mode 100644 localization/zh/trampoline/etc/trampoline_urm.png diff --git a/localization/zh/trampoline/README.md b/localization/zh/trampoline/README.md new file mode 100644 index 000000000000..fd65c5d4c0d8 --- /dev/null +++ b/localization/zh/trampoline/README.md @@ -0,0 +1,135 @@ +--- +title: Trampoline +category: Behavioral +language: zh +tag: +- Performance +--- + +## 目的 + +蹦床模式是用于在 Java 中递归地实现算法,而不会破坏堆栈,并且可以交错地执行函数,而无需将它们编码在一起。 + +## 解释 + +递归是一种常用的技术,用于以分而治之的方式解决算法问题。例如,计算斐波那契累加和与阶乘。在这类问题中,递归比循环更简单直接。此外,递归可能需要更少的代 +码并且看起来更简明。有一种说法是,每个递归问题都可以使用循环来解决,但代价是编写更难以理解的代码。然而,递归型解决方案有一个很大的警告。对于每个 +递归调用,通常需要存储一个中间值,并且可用的栈内存有限。栈内存不足会导致栈溢出错误并停止程序执行。蹦床模式是一种允许在 Java 中定义递归算法而无需破坏 +堆栈的技巧。 + +现实世界例子 + +> 使用蹦床模式进行递归斐波那契计算,不存在堆栈溢出问题。 + +通俗地说 + +> 蹦床模式允许递归而不会耗尽栈内存。 + +维基百科上说 + +> 在 Java 中,蹦床是指使用反射来避免使用内部类,例如在事件侦听器中。反射调用的整理操作时间换成了内部类的整理操作空间。 Java 中的蹦床通常涉及创建 GenericListener 以将事件传递到外部类。 + +**编程实例** + +这是 Java 中的蹦床实现。 + +当在返回的蹦床上调用 `get` 时,只要返回的具体实例是蹦床,内部就会在返回的蹦床上迭代调用跳转,并在返回的实例完成后停止。 + +```java +public interface Trampoline { + + T get(); + + default Trampoline jump() { + return this; + } + + default T result() { + return get(); + } + + default boolean complete() { + return true; + } + + static Trampoline done(final T result) { + return () -> result; + } + + static Trampoline more(final Trampoline> trampoline) { + return new Trampoline() { + @Override + public boolean complete() { + return false; + } + + @Override + public Trampoline jump() { + return trampoline.result(); + } + + @Override + public T get() { + return trampoline(this); + } + + T trampoline(final Trampoline trampoline) { + return Stream.iterate(trampoline, Trampoline::jump) + .filter(Trampoline::complete) + .findFirst() + .map(Trampoline::result) + .orElseThrow(); + } + }; + } +} +``` + +使用蹦床获取斐波那契值。 + +```java +public static void main(String[] args) { + LOGGER.info("Start calculating war casualties"); + var result = loop(10, 1).result(); + LOGGER.info("The number of orcs perished in the war: {}", result); +} + +public static Trampoline loop(int times, int prod) { + if (times == 0) { + return Trampoline.done(prod); + } else { + return Trampoline.more(() -> loop(times - 1, prod * times)); + } +} +``` + +程序输出: + +```java +19:22:24.462 [main] INFO com.iluwatar.trampoline.TrampolineApp - Start calculating war casualties +19:22:24.472 [main] INFO com.iluwatar.trampoline.TrampolineApp - The number of orcs perished in the war: 3628800 +``` + +## 类图 + +![alt text](./etc/trampoline_urm.png "Trampoline pattern class diagram") + +## 适用场景 + +使用蹦床模式时 +* 用于实现尾递归函数。该模式允许切换无堆栈操作。 +* 用于在同一线程上交错执行两个或多个函数。 + +## 现实案例 + +* [cyclops-react](https://github.com/aol/cyclops-react) + +## 鸣谢 + +* [Trampolining: a practical guide for awesome Java Developers](https://medium.com/@johnmcclean/trampolining-a-practical-guide-for-awesome-java-developers-4b657d9c3076) +* [Trampoline in java ](http://mindprod.com/jgloss/trampoline.html) +* [Laziness, trampolines, monoids and other functional amenities: this is not your father's Java](https://www.slideshare.net/mariofusco/lazine) +* [Trampoline implementation](https://github.com/bodar/totallylazy/blob/master/src/com/googlecode/totallylazy/Trampoline.java) +* [What is a trampoline function?](https://stackoverflow.com/questions/189725/what-is-a-trampoline-function) +* [Modern Java in Action: Lambdas, streams, functional and reactive programming](https://www.amazon.com/gp/product/1617293563/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=1617293563&linkId=ad53ae6f9f7c0982e759c3527bd2595c) +* [Java 8 in Action: Lambdas, Streams, and functional-style programming](https://www.amazon.com/gp/product/1617291994/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=1617291994&linkId=e3e5665b0732c59c9d884896ffe54f4f) diff --git a/localization/zh/trampoline/etc/trampoline_urm.png b/localization/zh/trampoline/etc/trampoline_urm.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e9c7439a327dac019a1a420eaf460ef2092a52 GIT binary patch literal 15316 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 literal 0 HcmV?d00001 From 7a966a57862ae090714f8c6eac962102ec911625 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 28 Dec 2023 11:26:03 +0200 Subject: [PATCH 008/763] docs: add Chant3ll3 as a contributor for translation (#2790) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 3 ++- README.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0aeafa60dcee..9c4ed2e09d4b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2841,7 +2841,8 @@ "avatar_url": "https://avatars.githubusercontent.com/u/141697333?v=4", "profile": "https://github.com/Chant3ll3", "contributions": [ - "doc" + "doc", + "translation" ] }, { diff --git a/README.md b/README.md index 0b1249bb4516..0f5f53a61f6b 100644 --- a/README.md +++ b/README.md @@ -475,7 +475,7 @@ This project is licensed under the terms of the MIT license. João Fernandes
João Fernandes

🌍 Hong Geon-ui
Hong Geon-ui

🌍 Doksanbir
Doksanbir

💻 - Chant3ll3
Chant3ll3

📖 + Chant3ll3
Chant3ll3

📖 🌍 YongHwan Kwon
YongHwan Kwon

💻 From 0f39267a197e1e6ba08dfffa2d9df774fe25c6fe Mon Sep 17 00:00:00 2001 From: Jakub Klimek Date: Sat, 27 Jan 2024 12:07:10 +0100 Subject: [PATCH 009/763] refactor: #2366 Change h2 database usage to in mem (#2776) * fix: Change h2 database usage to in mem (#2366) * #2366 Add delay option --- dao/src/main/java/com/iluwatar/dao/App.java | 2 +- .../com/iluwatar/dao/DbCustomerDaoTest.java | 2 +- .../java/com/iluwatar/domainmodel/App.java | 2 +- .../src/main/resources/application.properties | 2 +- .../com/iluwatar/repository/AppConfig.java | 2 +- .../src/main/resources/applicationContext.xml | 2 +- serialized-entity/README.md | 2 +- .../com/iluwatar/serializedentity/App.java | 2 +- .../iluwatar/serializedentity/AppTest.java | 24 +++++++++++++++++++ .../java/com/iluwatar/tablemodule/App.java | 2 +- .../tablemodule/UserTableModuleTest.java | 2 +- .../com/iluwatar/transactionscript/App.java | 2 +- .../transactionscript/HotelDaoImplTest.java | 2 +- .../iluwatar/transactionscript/HotelTest.java | 2 +- 14 files changed, 37 insertions(+), 13 deletions(-) diff --git a/dao/src/main/java/com/iluwatar/dao/App.java b/dao/src/main/java/com/iluwatar/dao/App.java index 20d1db0633dd..f0d19749c64b 100644 --- a/dao/src/main/java/com/iluwatar/dao/App.java +++ b/dao/src/main/java/com/iluwatar/dao/App.java @@ -44,7 +44,7 @@ */ @Slf4j public class App { - private static final String DB_URL = "jdbc:h2:~/dao"; + private static final String DB_URL = "jdbc:h2:mem:dao;DB_CLOSE_DELAY=-1"; private static final String ALL_CUSTOMERS = "customerDao.getAllCustomers(): "; /** diff --git a/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java b/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java index 666c7634c158..cfa7e9882981 100644 --- a/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java +++ b/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java @@ -49,7 +49,7 @@ */ class DbCustomerDaoTest { - private static final String DB_URL = "jdbc:h2:~/dao"; + private static final String DB_URL = "jdbc:h2:mem:dao;DB_CLOSE_DELAY=-1"; private DbCustomerDao dao; private final Customer existingCustomer = new Customer(1, "Freddy", "Krueger"); diff --git a/domain-model/src/main/java/com/iluwatar/domainmodel/App.java b/domain-model/src/main/java/com/iluwatar/domainmodel/App.java index 89c848f6696c..aade9924a400 100644 --- a/domain-model/src/main/java/com/iluwatar/domainmodel/App.java +++ b/domain-model/src/main/java/com/iluwatar/domainmodel/App.java @@ -49,7 +49,7 @@ */ public class App { - public static final String H2_DB_URL = "jdbc:h2:~/test"; + public static final String H2_DB_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1"; public static final String CREATE_SCHEMA_SQL = "CREATE TABLE CUSTOMERS (name varchar primary key, money decimal);" diff --git a/layers/src/main/resources/application.properties b/layers/src/main/resources/application.properties index fad9b72a5ce7..233a9db6c8a5 100644 --- a/layers/src/main/resources/application.properties +++ b/layers/src/main/resources/application.properties @@ -2,7 +2,7 @@ spring.main.web-application-type=none #datasource settings -spring.datasource.url=jdbc:h2:~/databases/cake +spring.datasource.url=jdbc:h2:mem:databases-cake spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password=sa diff --git a/repository/src/main/java/com/iluwatar/repository/AppConfig.java b/repository/src/main/java/com/iluwatar/repository/AppConfig.java index ea93c21089e5..995c790b6e35 100644 --- a/repository/src/main/java/com/iluwatar/repository/AppConfig.java +++ b/repository/src/main/java/com/iluwatar/repository/AppConfig.java @@ -54,7 +54,7 @@ public class AppConfig { public DataSource dataSource() { var basicDataSource = new BasicDataSource(); basicDataSource.setDriverClassName("org.h2.Driver"); - basicDataSource.setUrl("jdbc:h2:~/databases/person"); + basicDataSource.setUrl("jdbc:h2:mem:databases-person"); basicDataSource.setUsername("sa"); basicDataSource.setPassword("sa"); return basicDataSource; diff --git a/repository/src/main/resources/applicationContext.xml b/repository/src/main/resources/applicationContext.xml index 0de00f39f01d..718b6b6e6e13 100644 --- a/repository/src/main/resources/applicationContext.xml +++ b/repository/src/main/resources/applicationContext.xml @@ -30,7 +30,7 @@ - + diff --git a/serialized-entity/README.md b/serialized-entity/README.md index a994aa19cfbf..d18a2c83e9ad 100644 --- a/serialized-entity/README.md +++ b/serialized-entity/README.md @@ -136,7 +136,7 @@ methods to read and deserialize data items to `Country` objects. ```java @Slf4j public class App { - private static final String DB_URL = "jdbc:h2:~/test"; + private static final String DB_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1"; private App() { diff --git a/serialized-entity/src/main/java/com/iluwatar/serializedentity/App.java b/serialized-entity/src/main/java/com/iluwatar/serializedentity/App.java index c86102a8231e..7f1f46905875 100644 --- a/serialized-entity/src/main/java/com/iluwatar/serializedentity/App.java +++ b/serialized-entity/src/main/java/com/iluwatar/serializedentity/App.java @@ -48,7 +48,7 @@ */ @Slf4j public class App { - private static final String DB_URL = "jdbc:h2:~/test"; + private static final String DB_URL = "jdbc:h2:mem:testdb"; private App() { diff --git a/serialized-entity/src/test/java/com/iluwatar/serializedentity/AppTest.java b/serialized-entity/src/test/java/com/iluwatar/serializedentity/AppTest.java index 52ac9cd6e026..a15557d5ffdb 100644 --- a/serialized-entity/src/test/java/com/iluwatar/serializedentity/AppTest.java +++ b/serialized-entity/src/test/java/com/iluwatar/serializedentity/AppTest.java @@ -1,3 +1,27 @@ +/* + * 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.serializedentity; import org.junit.jupiter.api.Test; diff --git a/table-module/src/main/java/com/iluwatar/tablemodule/App.java b/table-module/src/main/java/com/iluwatar/tablemodule/App.java index 632b4019dfa7..1c528df8a7f5 100644 --- a/table-module/src/main/java/com/iluwatar/tablemodule/App.java +++ b/table-module/src/main/java/com/iluwatar/tablemodule/App.java @@ -45,7 +45,7 @@ */ @Slf4j public final class App { - private static final String DB_URL = "jdbc:h2:~/test"; + private static final String DB_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1"; /** * Private constructor. diff --git a/table-module/src/test/java/com/iluwatar/tablemodule/UserTableModuleTest.java b/table-module/src/test/java/com/iluwatar/tablemodule/UserTableModuleTest.java index a9dc41b3e3f2..f45c20176700 100644 --- a/table-module/src/test/java/com/iluwatar/tablemodule/UserTableModuleTest.java +++ b/table-module/src/test/java/com/iluwatar/tablemodule/UserTableModuleTest.java @@ -36,7 +36,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; class UserTableModuleTest { - private static final String DB_URL = "jdbc:h2:~/test"; + private static final String DB_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1"; private static DataSource createDataSource() { var dataSource = new JdbcDataSource(); diff --git a/transaction-script/src/main/java/com/iluwatar/transactionscript/App.java b/transaction-script/src/main/java/com/iluwatar/transactionscript/App.java index 0525e6e64a63..909943ce41d4 100644 --- a/transaction-script/src/main/java/com/iluwatar/transactionscript/App.java +++ b/transaction-script/src/main/java/com/iluwatar/transactionscript/App.java @@ -46,7 +46,7 @@ */ public class App { - private static final String H2_DB_URL = "jdbc:h2:~/test"; + private static final String H2_DB_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1"; private static final Logger LOGGER = LoggerFactory.getLogger(App.class); /** diff --git a/transaction-script/src/test/java/com/iluwatar/transactionscript/HotelDaoImplTest.java b/transaction-script/src/test/java/com/iluwatar/transactionscript/HotelDaoImplTest.java index ae288c703c1b..2f587397d873 100644 --- a/transaction-script/src/test/java/com/iluwatar/transactionscript/HotelDaoImplTest.java +++ b/transaction-script/src/test/java/com/iluwatar/transactionscript/HotelDaoImplTest.java @@ -49,7 +49,7 @@ */ class HotelDaoImplTest { - private static final String DB_URL = "jdbc:h2:~/test"; + private static final String DB_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1"; private HotelDaoImpl dao; private Room existingRoom = new Room(1, "Single", 50, false); diff --git a/transaction-script/src/test/java/com/iluwatar/transactionscript/HotelTest.java b/transaction-script/src/test/java/com/iluwatar/transactionscript/HotelTest.java index 1274a542a77e..e8a7f6a0b8e4 100644 --- a/transaction-script/src/test/java/com/iluwatar/transactionscript/HotelTest.java +++ b/transaction-script/src/test/java/com/iluwatar/transactionscript/HotelTest.java @@ -39,7 +39,7 @@ */ class HotelTest { - private static final String H2_DB_URL = "jdbc:h2:~/test"; + private static final String H2_DB_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1"; private Hotel hotel; private HotelDaoImpl dao; From 719c46d10d72a605fff163a014bc85d653694232 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 27 Jan 2024 13:08:08 +0200 Subject: [PATCH 010/763] 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> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9c4ed2e09d4b..e21466c43a1c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2853,6 +2853,15 @@ "contributions": [ "code" ] + }, + { + "login": "takikuba", + "name": "Jakub Klimek", + "avatar_url": "https://avatars.githubusercontent.com/u/58841343?v=4", + "profile": "https://github.com/takikuba", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 0f5f53a61f6b..43445093ef50 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![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) -[![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-314-orange.svg?style=flat-square)](#contributors-)
@@ -477,6 +477,7 @@ This project is licensed under the terms of the MIT license. Doksanbir
Doksanbir

💻 Chant3ll3
Chant3ll3

📖 🌍 YongHwan Kwon
YongHwan Kwon

💻 + Jakub Klimek
Jakub Klimek

💻 From 45f63a70f1dc528b3445665cb811209b63a17ceb Mon Sep 17 00:00:00 2001 From: Doksanbir Date: Sat, 27 Jan 2024 14:16:06 +0300 Subject: [PATCH 011/763] docs: Update README.md for Health Check Pattern (#2783) --- health-check/README.md | 395 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 393 insertions(+), 2 deletions(-) diff --git a/health-check/README.md b/health-check/README.md index 1a47e17d7abe..afb6117bdb73 100644 --- a/health-check/README.md +++ b/health-check/README.md @@ -19,9 +19,400 @@ To ensure the stability and resilience of services in a microservices architectu ## Explanation In microservices architecture, it's critical to continuously check the health of individual services. The Health Check Pattern is a mechanism for microservices to expose their health status. This pattern is implemented by including a health check endpoint in microservices that returns the service's current state. This is vital for maintaining system resilience and operational readiness. +

For more information, see the Health Check API pattern on [Microservices.io](https://microservices.io/patterns/observability/health-check-api.html). + + +## Real World Example +In a cloud-native environment, such as Kubernetes or AWS ECS, health checks are used to ensure that containers are running correctly. If a service fails its health check, it can be automatically restarted or replaced, ensuring high availability and resilience. + +## In Plain Words +The Health Check Pattern is like a regular doctor's visit for services in a microservices architecture. It helps in early detection of issues and ensures that services are healthy and available. + + +## Programmatic Example +Here, provided detailed examples of health check implementations in a microservices environment. + +### AsynchronousHealthChecker +An asynchronous health checker component that executes health checks in a separate thread. +```java + /** + * Performs a health check asynchronously using the provided health check logic with a specified + * timeout. + * + * @param healthCheck the health check logic supplied as a {@code Supplier} + * @param timeoutInSeconds the maximum time to wait for the health check to complete, in seconds + * @return a {@code CompletableFuture} object that represents the result of the health + * check + */ + public CompletableFuture performCheck( + Supplier healthCheck, long timeoutInSeconds) { + CompletableFuture future = + CompletableFuture.supplyAsync(healthCheck, healthCheckExecutor); + + // Schedule a task to enforce the timeout + healthCheckExecutor.schedule( + () -> { + if (!future.isDone()) { + LOGGER.error(HEALTH_CHECK_TIMEOUT_MESSAGE); + future.completeExceptionally(new TimeoutException(HEALTH_CHECK_TIMEOUT_MESSAGE)); + } + }, + timeoutInSeconds, + TimeUnit.SECONDS); + + return future.handle( + (result, throwable) -> { + if (throwable != null) { + LOGGER.error(HEALTH_CHECK_FAILED_MESSAGE, throwable); + // Check if the throwable is a TimeoutException or caused by a TimeoutException + Throwable rootCause = + throwable instanceof CompletionException ? throwable.getCause() : throwable; + if (!(rootCause instanceof TimeoutException)) { + LOGGER.error(HEALTH_CHECK_FAILED_MESSAGE, rootCause); + return Health.down().withException(rootCause).build(); + } else { + LOGGER.error(HEALTH_CHECK_TIMEOUT_MESSAGE, rootCause); + // If it is a TimeoutException, rethrow it wrapped in a CompletionException + throw new CompletionException(rootCause); + } + } else { + return result; + } + }); + } +``` + +### CpuHealthIndicator +A health indicator that checks the health of the system's CPU. +```java + /** + * Checks the health of the system's CPU and returns a health indicator object. + * + * @return a health indicator object + */ + @Override + public Health health() { + if (!(osBean instanceof com.sun.management.OperatingSystemMXBean sunOsBean)) { + LOGGER.error("Unsupported operating system MXBean: {}", osBean.getClass().getName()); + return Health.unknown() + .withDetail(ERROR_MESSAGE, "Unsupported operating system MXBean") + .build(); + } + + double systemCpuLoad = sunOsBean.getCpuLoad() * 100; + double processCpuLoad = sunOsBean.getProcessCpuLoad() * 100; + int availableProcessors = sunOsBean.getAvailableProcessors(); + double loadAverage = sunOsBean.getSystemLoadAverage(); + + Map details = new HashMap<>(); + details.put("timestamp", Instant.now()); + details.put("systemCpuLoad", String.format("%.2f%%", systemCpuLoad)); + details.put("processCpuLoad", String.format("%.2f%%", processCpuLoad)); + details.put("availableProcessors", availableProcessors); + details.put("loadAverage", loadAverage); + + if (systemCpuLoad > systemCpuLoadThreshold) { + LOGGER.error(HIGH_SYSTEM_CPU_LOAD_MESSAGE, systemCpuLoad); + return Health.down() + .withDetails(details) + .withDetail(ERROR_MESSAGE, HIGH_SYSTEM_CPU_LOAD_MESSAGE_WITHOUT_PARAM) + .build(); + } else if (processCpuLoad > processCpuLoadThreshold) { + LOGGER.error(HIGH_PROCESS_CPU_LOAD_MESSAGE, processCpuLoad); + return Health.down() + .withDetails(details) + .withDetail(ERROR_MESSAGE, HIGH_PROCESS_CPU_LOAD_MESSAGE_WITHOUT_PARAM) + .build(); + } else if (loadAverage > (availableProcessors * loadAverageThreshold)) { + LOGGER.error(HIGH_LOAD_AVERAGE_MESSAGE, loadAverage); + return Health.up() + .withDetails(details) + .withDetail(ERROR_MESSAGE, HIGH_LOAD_AVERAGE_MESSAGE_WITHOUT_PARAM) + .build(); + } else { + return Health.up().withDetails(details).build(); + } + } + +``` + + + +### CustomHealthIndicator +A custom health indicator that periodically checks the health of a database and caches the result. It leverages an asynchronous health checker to perform the health checks. + +- `AsynchronousHealthChecker`: A component for performing health checks asynchronously. +- `CacheManager`: Manages caching of health check results. +- `HealthCheckRepository`: A repository for querying health-related data from the database. + +```java +/** + * Perform a health check and cache the result. + * + * @return the health status of the application + * @throws HealthCheckInterruptedException if the health check is interrupted + */ +@Override +@Cacheable(value = "health-check", unless = "#result.status == 'DOWN'") +public Health health() { + LOGGER.info("Performing health check"); + CompletableFuture healthFuture = + healthChecker.performCheck(this::check, timeoutInSeconds); + try { + return healthFuture.get(timeoutInSeconds, TimeUnit.SECONDS); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + LOGGER.error("Health check interrupted", e); + throw new HealthCheckInterruptedException(e); + } catch (Exception e) { + LOGGER.error("Health check failed", e); + return Health.down(e).build(); + } +} + +/** + * Checks the health of the database by querying for a simple constant value expected from the + * database. + * + * @return Health indicating UP if the database returns the constant correctly, otherwise DOWN. + */ +private Health check() { + Integer result = healthCheckRepository.checkHealth(); + boolean databaseIsUp = result != null && result == 1; + LOGGER.info("Health check result: {}", databaseIsUp); + return databaseIsUp + ? Health.up().withDetail("database", "reachable").build() + : Health.down().withDetail("database", "unreachable").build(); +} + +/** + * Evicts all entries from the health check cache. This is scheduled to run at a fixed rate + * defined in the application properties. + */ +@Scheduled(fixedRateString = "${health.check.cache.evict.interval:60000}") +public void evictHealthCache() { + LOGGER.info("Evicting health check cache"); + try { + Cache healthCheckCache = cacheManager.getCache("health-check"); + LOGGER.info("Health check cache: {}", healthCheckCache); + if (healthCheckCache != null) { + healthCheckCache.clear(); + } + } catch (Exception e) { + LOGGER.error("Failed to evict health check cache", e); + } +} + +``` + +### DatabaseTransactionHealthIndicator +A health indicator that checks the health of database transactions by attempting to perform a test transaction using a retry mechanism. + +- **HealthCheckRepository**: A repository for performing health checks on the database. +- **AsynchronousHealthChecker**: An asynchronous health checker used to execute health checks in a separate thread. +- **RetryTemplate**: A retry template used to retry the test transaction if it fails due to a transient error. + +```java +/** + * Performs a health check by attempting to perform a test transaction with retry support. + * + * @return the health status of the database transactions + */ +@Override +public Health health() { + LOGGER.info("Calling performCheck with timeout {}", timeoutInSeconds); + Supplier dbTransactionCheck = + () -> { + try { + healthCheckRepository.performTestTransaction(); + return Health.up().build(); + } catch (Exception e) { + LOGGER.error("Database transaction health check failed", e); + return Health.down(e).build(); + } + }; + try { + return asynchronousHealthChecker.performCheck(dbTransactionCheck, timeoutInSeconds).get(); + } catch (InterruptedException | ExecutionException e) { + LOGGER.error("Database transaction health check timed out or was interrupted", e); + Thread.currentThread().interrupt(); + return Health.down(e).build(); + } +} +``` + + +### GarbageCollectionHealthIndicator +A custom health indicator that checks the garbage collection status of the application and reports the health status accordingly. +```java + /** + * Performs a health check by gathering garbage collection metrics and evaluating the overall + * health of the garbage collection system. + * + * @return a {@link Health} object representing the health status of the garbage collection system + */ + @Override + public Health health() { + List gcBeans = getGarbageCollectorMxBeans(); + List memoryPoolMxBeans = getMemoryPoolMxBeans(); + Map> gcDetails = new HashMap<>(); + + for (GarbageCollectorMXBean gcBean : gcBeans) { + Map collectorDetails = createCollectorDetails(gcBean, memoryPoolMxBeans); + gcDetails.put(gcBean.getName(), collectorDetails); + } + return Health.up().withDetails(gcDetails).build(); + } + +``` + +### MemoryHealthIndicator +A custom health indicator that checks the memory usage of the application and reports the health status accordingly. +```java + /** + * Performs a health check by checking the memory usage of the application. + * + * @return the health status of the application + */ + public Health checkMemory() { + Supplier memoryCheck = + () -> { + MemoryMXBean memoryMxBean = ManagementFactory.getMemoryMXBean(); + MemoryUsage heapMemoryUsage = memoryMxBean.getHeapMemoryUsage(); + long maxMemory = heapMemoryUsage.getMax(); + long usedMemory = heapMemoryUsage.getUsed(); + + double memoryUsage = (double) usedMemory / maxMemory; + String format = String.format("%.2f%% of %d max", memoryUsage * 100, maxMemory); + + if (memoryUsage < memoryThreshold) { + LOGGER.info("Memory usage is below threshold: {}", format); + return Health.up().withDetail("memory usage", format).build(); + } else { + return Health.down().withDetail("memory usage", format).build(); + } + }; + + try { + CompletableFuture future = + asynchronousHealthChecker.performCheck(memoryCheck, timeoutInSeconds); + return future.get(); + } catch (InterruptedException e) { + LOGGER.error("Health check interrupted", e); + Thread.currentThread().interrupt(); + return Health.down().withDetail("error", "Health check interrupted").build(); + } catch (ExecutionException e) { + LOGGER.error("Health check failed", e); + Throwable cause = e.getCause() == null ? e : e.getCause(); + return Health.down().withDetail("error", cause.toString()).build(); + } + } + + /** + * Retrieves the health status of the application by checking the memory usage. + * + * @return the health status of the application + */ + @Override + public Health health() { + return checkMemory(); + } +} +``` + + + +## Using Spring Boot Actuator for Health Checks +Spring Boot Actuator provides built-in health checking functionality that can be easily integrated into your application. By adding the Spring Boot Actuator dependency, you can expose health check information through a predefined endpoint, typically `/actuator/health`. + +## Output +This shows the output of the health check pattern using a GET request to the Actuator health endpoint. + +### HTTP GET Request +``` +curl -X GET "http://localhost:6161/actuator/health" +``` + +### Output +```json +{ + "status": "UP", + "components": { + "cpu": { + "status": "UP", + "details": { + "processCpuLoad": "0.03%", + "availableProcessors": 10, + "systemCpuLoad": "21.40%", + "loadAverage": 3.3916015625, + "timestamp": "2023-12-03T08:44:19.488422Z" + } + }, + "custom": { + "status": "UP", + "details": { + "database": "reachable" + } + }, + "databaseTransaction": { + "status": "UP" + }, + "db": { + "status": "UP", + "details": { + "database": "H2", + "validationQuery": "isValid()" + } + }, + "diskSpace": { + "status": "UP", + "details": { + "total": 994662584320, + "free": 377635827712, + "threshold": 10485760, + "exists": true + } + }, + "garbageCollection": { + "status": "UP", + "details": { + "G1 Young Generation": { + "count": "11", + "time": "30ms", + "memoryPools": "G1 Old Gen: 0.005056262016296387%" + }, + "G1 Old Generation": { + "count": "0", + "time": "0ms", + "memoryPools": "G1 Old Gen: 0.005056262016296387%" + } + } + }, + "livenessState": { + "status": "UP" + }, + "memory": { + "status": "UP", + "details": { + "memory usage": "1.36% of 4294967296 max" + } + }, + "ping": { + "status": "UP" + }, + "readinessState": { + "status": "UP" + } + }, + "groups": [ + "liveness", + "readiness" + ] +} +``` ## Class Diagram -![alt text](./etc/health-check.png "Health Check") +![Health Check Pattern](./etc/health-check.png) ## Applicability Use the Health Check Pattern when: @@ -52,4 +443,4 @@ Use the Health Check Pattern when: - Timeout Pattern ## Credits -Inspired by the Health Check API pattern from [microservices.io](https://microservices.io/patterns/observability/health-check-api.html) and the issue [#2695](https://github.com/iluwatar/java-design-patterns/issues/2695) on iluwatar's Java design patterns repository. +Inspired by the Health Check API pattern from [microservices.io](https://microservices.io/patterns/observability/health-check-api.html), and the issue [#2695](https://github.com/iluwatar/java-design-patterns/issues/2695) on iluwatar's Java design patterns repository. From 4a315e7f4bd41912d9c6db2520e7bca30c5d4566 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 27 Jan 2024 13:16:55 +0200 Subject: [PATCH 012/763] 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> --- .all-contributorsrc | 3 ++- README.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index e21466c43a1c..b758be965f26 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2832,7 +2832,8 @@ "avatar_url": "https://avatars.githubusercontent.com/u/7249450?v=4", "profile": "https://github.com/ylcn91", "contributions": [ - "code" + "code", + "doc" ] }, { diff --git a/README.md b/README.md index 43445093ef50..99e39ef2f144 100644 --- a/README.md +++ b/README.md @@ -474,7 +474,7 @@ This project is licensed under the terms of the MIT license. João Fernandes
João Fernandes

🌍 Hong Geon-ui
Hong Geon-ui

🌍 - Doksanbir
Doksanbir

💻 + Doksanbir
Doksanbir

💻 📖 Chant3ll3
Chant3ll3

📖 🌍 YongHwan Kwon
YongHwan Kwon

💻 Jakub Klimek
Jakub Klimek

💻 From 87a774c9d64988ccede63ceab3996d729837be32 Mon Sep 17 00:00:00 2001 From: believe Date: Sat, 27 Jan 2024 11:20:32 +0000 Subject: [PATCH 013/763] 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. --- localization/fr/abstract-document/README.md | 199 +++++++++++++++ localization/fr/abstract-factory/README.md | 227 ++++++++++++++++++ localization/fr/active-object/README.md | 128 ++++++++++ localization/fr/acyclic-visitore/README.md | 162 +++++++++++++ localization/fr/adapter/README.md | 137 +++++++++++ .../fr/aggregator-microservices/README.md | 106 ++++++++ localization/fr/ambassador/README.md | 204 ++++++++++++++++ localization/fr/api-gateway/README.md | 164 +++++++++++++ localization/fr/arrange-act-assert/README.md | 140 +++++++++++ .../fr/async-method-invocation/README.md | 166 +++++++++++++ localization/fr/balking/README.md | 133 ++++++++++ localization/fr/bridge/README.md | 215 +++++++++++++++++ 12 files changed, 1981 insertions(+) create mode 100644 localization/fr/abstract-document/README.md create mode 100644 localization/fr/abstract-factory/README.md create mode 100644 localization/fr/active-object/README.md create mode 100644 localization/fr/acyclic-visitore/README.md create mode 100644 localization/fr/adapter/README.md create mode 100644 localization/fr/aggregator-microservices/README.md create mode 100644 localization/fr/ambassador/README.md create mode 100644 localization/fr/api-gateway/README.md create mode 100644 localization/fr/arrange-act-assert/README.md create mode 100644 localization/fr/async-method-invocation/README.md create mode 100644 localization/fr/balking/README.md create mode 100644 localization/fr/bridge/README.md diff --git a/localization/fr/abstract-document/README.md b/localization/fr/abstract-document/README.md new file mode 100644 index 000000000000..d55c51ea8da6 --- /dev/null +++ b/localization/fr/abstract-document/README.md @@ -0,0 +1,199 @@ +--- +title: Abstract Document +category: Structural +language: fr +tag: + - Extensibility +--- + +## Intention + +Le patron de conception "Abstract Document" est un modèle de conception structurelle qui vise à fournir un moyen +cohérent de gérer les structures de données hiérarchiques et arborescentes en définissant une interface commune pour +différents types de documents. + +## Explication + +Le patron de conception "Abstract Document" permet de gérer des propriétés supplémentaires non statiques. Ce modèle +utilise le concept de traits pour assurer la sécurité des types et séparer les propriétés des différentes +classes dans un ensemble d'interfaces + +Exemple concret + +> Prenons l'exemple d'une voiture composée de plusieurs pièces. Cependant, nous ne savons pas si la voiture en question possède réellement toutes les pièces ou seulement certaines d'entre elles. Nos voitures sont dynamiques et extrêmement flexibles. + +En clair + +> Le modèle de document abstrait permet d'attacher des propriétés à des objets indépendament de ces derniers. + +Wikipedia dit + +> Un patron de conception structurelle orienté objet pour organiser des objets comme clé-valeur faiblement typés et exposer des données à l'aide de vues typées. L'objectif de ce modèle est d'atteindre un haut degré de flexibilité entre les composants +dans un langage fortement typé où de nouvelles propriétés peuvent être ajoutées à l'arbre d'objets à la volée, sans perdre le soutien de la sécurité de type. + +**Exemple de programme** + +Définissons en premier les classes de base `Document` et `AbstractDocument`. Ils font en sorte que l'objet contienne une carte(map) de propriétés et un nombre quelconque d'objets enfants. + +```java +public interface Document { + + Void put(String key, Object value); + + Object get(String key); + + Stream children(String key, Function, T> constructor); +} + +public abstract class AbstractDocument implements Document { + + private final Map properties; + + protected AbstractDocument(Map properties) { + Objects.requireNonNull(properties, "properties map is required"); + this.properties = properties; + } + + @Override + public Void put(String key, Object value) { + properties.put(key, value); + return null; + } + + @Override + public Object get(String key) { + return properties.get(key); + } + + @Override + public Stream children(String key, Function, T> constructor) { + return Stream.ofNullable(get(key)) + .filter(Objects::nonNull) + .map(el -> (List>) el) + .findAny() + .stream() + .flatMap(Collection::stream) + .map(constructor); + } + ... +} +``` +Ensuite, nous définissons une enumération `Property` et un ensemble d'interfaces pour le type, le prix, le modèle et les pièces. Cela nous permet de créer une interface statique pour notre classe `Car`. + +```java +public enum Property { + + PARTS, TYPE, PRICE, MODEL +} + +public interface HasType extends Document { + + default Optional getType() { + return Optional.ofNullable((String) get(Property.TYPE.toString())); + } +} + +public interface HasPrice extends Document { + + default Optional getPrice() { + return Optional.ofNullable((Number) get(Property.PRICE.toString())); + } +} +public interface HasModel extends Document { + + default Optional getModel() { + return Optional.ofNullable((String) get(Property.MODEL.toString())); + } +} + +public interface HasParts extends Document { + + default Stream getParts() { + return children(Property.PARTS.toString(), Part::new); + } +} +``` + +Nous sommes maintenant prêts à présenter la classe `Car`. + +```java +public class Car extends AbstractDocument implements HasModel, HasPrice, HasParts { + + public Car(Map properties) { + super(properties); + } +} +``` + +Enfin, voici comment nous construisons et utilisons la "voiture" dans un exemple complet. + +```java + LOGGER.info("Constructing parts and car"); + + var wheelProperties = Map.of( + Property.TYPE.toString(), "wheel", + Property.MODEL.toString(), "15C", + Property.PRICE.toString(), 100L); + + var doorProperties = Map.of( + Property.TYPE.toString(), "door", + Property.MODEL.toString(), "Lambo", + Property.PRICE.toString(), 300L); + + var carProperties = Map.of( + Property.MODEL.toString(), "300SL", + Property.PRICE.toString(), 10000L, + Property.PARTS.toString(), List.of(wheelProperties, doorProperties)); + + var car = new Car(carProperties); + + LOGGER.info("Here is our car:"); + LOGGER.info("-> model: {}", car.getModel().orElseThrow()); + LOGGER.info("-> price: {}", car.getPrice().orElseThrow()); + LOGGER.info("-> parts: "); + car.getParts().forEach(p -> LOGGER.info("\t{}/{}/{}", + p.getType().orElse(null), + p.getModel().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 +``` + +## Diagramme de classes + +![alt text](../../../abstract-document/etc/abstract-document.png "Abstract Document Traits and Domain") + +## Application + +Ce modèle est particulièrement utile dans les scénarios où vous avez différents types de documents qui partagent des attributs ou des comportements communs, mais qui ont également des attributs ou des comportements uniques, spécifiques à leurs types individuels. Voici quelques +Voici quelques scénarios dans lesquels le patron de conception Abstract Document peut s'appliquer : + +* Systèmes de gestion de contenu (SGC) : dans un SGC (CMS en anglais), vous pouvez avoir différents types de contenu tels que des articles, des images, des vidéos, etc. Chaque type de contenu peut avoir des attributs communs tels que la date de création, l'auteur et les balises, mais aussi des attributs spécifiques tels que les dimensions de l'image pour les images ou la durée de la vidéo pour les vidéos. + +* Systèmes de gestion de fichiers : Si vous concevez un système de gestion de fichiers dans lequel différents types de fichiers doivent être gérés; tels que des documents, des images, des fichiers audio et des répertoires, le patron "Abstract Document" peut vous aider à fournir un moyen cohérent d'accéder à des attributs tels que la taille du fichier, la date de création, etc., tout en autorisant des attributs spécifiques tels que la résolution de l'image ou la durée de l'audio. + +* Systèmes de commerce électronique ou vente en ligne : Une plateforme de commerce électronique peut avoir différents types de produits tels que des produits physiques, des téléchargements numériques et des abonnements. Chaque type peut partager des attributs communs tels que le nom, le prix et la description, tout en ayant des attributs uniques tels que le poids d'expédition pour les produits physiques ou le lien de téléchargement pour les produits numériques. + +* Systèmes de dossiers médicaux : En médécine, les dossiers des patients peuvent inclure différents types de données telles que des données démographiques, des antécédents médicaux, des résultats d'examens et des prescriptions. Le patron de conception "abstract document" peut aider à gérer des attributs partagés tels que l'ID du patient et sa date de naissance, tout en s'adaptant à des attributs spécialisés tels que les résultats d'examens ou les médicaments prescrits. + +* Gestion de la configuration : Lorsqu'il s'agit de paramètres de configuration pour des applications logicielles, il peut y avoir différents types d'éléments de configuration, chacun avec son propre ensemble d'attributs. Le patron de conception "abstract document" peut être utilisé pour gérer ces éléments de configuration tout en garantissant une manière cohérente d'accéder à leurs attributs et de les manipuler. + +* Plateformes éducatives : Les systèmes éducatifs peuvent disposer de différents types de matériel pédagogique, tels que des contenus textuels, des vidéos, des quiz et des devoirs. Les attributs communs tels que le titre, l'auteur et la date de publication peuvent être partagés, tandis que les attributs uniques tels que la durée des vidéos ou les dates d'échéance des devoirs peuvent être spécifiques à chaque type. + +* Outils de gestion de projet : Dans les applications de gestion de projet, vous pouvez avoir différents types de tâches comme les tâches à faire, les étapes et les problèmes. Le modèle de document abstrait peut être utilisé pour gérer des attributs généraux tels que le nom de la tâche et le destinataire, tout en autorisant des attributs spécifiques tels que la date du jalon ou la priorité du problème. + +L'idée principale du patron de conception Abstract Document est de fournir un moyen flexible et extensible de gérer différents types de documents ou d'entités avec des attributs partagés et distincts. En définissant une interface commune et en l'implémentant +dans les différents types de documents, vous pouvez obtenir une approche plus organisée et cohérente de la manipulation de structures de données complexes. + +## Crédits + +* [Wikipedia: Abstract Document Pattern](https://en.wikipedia.org/wiki/Abstract_Document_Pattern) +* [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) diff --git a/localization/fr/abstract-factory/README.md b/localization/fr/abstract-factory/README.md new file mode 100644 index 000000000000..e81c4ed2fa06 --- /dev/null +++ b/localization/fr/abstract-factory/README.md @@ -0,0 +1,227 @@ +--- +title: Abstract Factory +category: Creational +language: fr +tag: + - Gang of Four +--- + +## Également connu sous le nom de + +Kit + +## Intention + +Fournir une interface permettant de créer des familles d'objets liés ou dépendants +sans spécifier leurs classes concrètes. + +## Explication + +Exemple concret + +> Pour créer un royaume, nous avons besoin d'objets ayant un thème commun. Le royaume elfique a besoin d'un roi elfique, d'un château elfique et d'une armée elfique, tandis que le royaume orque a besoin d'un roi orque, d'un château orque et d'une armée orque. Il existe une dépendance entre les objets du royaume. + +En clair + +> Une usine d'usines ; une usine qui regroupe les usines individuelles mais liées/dépendantes sans spécifier leurs classes concrètes. + +Wikipedia dit + +> Le modèle d'usine abstraite permet d'encapsuler un groupe d'usines individuelles ayant un thème commun sans spécifier leurs classes concrètes. + +**Exemple de programme** + +Traduction de l'exemple du royaume ci-dessus. Tout d'abord, nous avons quelques interfaces et implémentations pour les objets du royaume. + +```java +public interface Castle { + String getDescription(); +} + +public interface King { + String getDescription(); +} + +public interface Army { + String getDescription(); +} + +// Elven implementations -> +public class ElfCastle implements Castle { + static final String DESCRIPTION = "This is the elven castle!"; + @Override + public String getDescription() { + return DESCRIPTION; + } +} +public class ElfKing implements King { + static final String DESCRIPTION = "This is the elven king!"; + @Override + public String getDescription() { + return DESCRIPTION; + } +} +public class ElfArmy implements Army { + static final String DESCRIPTION = "This is the elven Army!"; + @Override + public String getDescription() { + return DESCRIPTION; + } +} + +// Orcish implementations similarly -> ... + +``` + +Ensuite, nous avons l'abstraction et les implémentations de la fabrique de royaume. + +```java +public interface KingdomFactory { + Castle createCastle(); + King createKing(); + Army createArmy(); +} + +public class ElfKingdomFactory implements KingdomFactory { + + @Override + public Castle createCastle() { + return new ElfCastle(); + } + + @Override + public King createKing() { + return new ElfKing(); + } + + @Override + public Army createArmy() { + return new ElfArmy(); + } +} + +public class OrcKingdomFactory implements KingdomFactory { + + @Override + public Castle createCastle() { + return new OrcCastle(); + } + + @Override + public King createKing() { + return new OrcKing(); + } + + @Override + public Army createArmy() { + return new OrcArmy(); + } +} +``` + +Nous disposons maintenant d'une fabrique abstraite qui nous permet de créer une famille d'objets apparentés, par exemple la fabrique de royaume elfique crée un château elfique, un roi et une armée, etc. + +```java +var factory = new ElfKingdomFactory(); +var castle = factory.createCastle(); +var king = factory.createKing(); +var army = factory.createArmy(); + +castle.getDescription(); +king.getDescription(); +army.getDescription(); +``` + +Sortie du programme : + +```java +This is the elven castle! +This is the elven king! +This is the elven Army! +``` + +Maintenant, nous pouvons concevoir une fabrique pour nos différentes fabriques de royaumes. Dans cet exemple, nous avons créé `FactoryMaker`, responsable de retourner une instance de `ElfKingdomFactory` ou de `OrcKingdomFactory`. +Le client peut utiliser `FactoryMaker` pour créer la fabrique concrète désirée qui, à son tour, produira différents objets concrets (dérivés de `Army`, `King`, `Castle`). +Dans cet exemple, nous avons également utilisé une énumération pour paramétrer le type de fabrique de royaume que le client va demander. +```java +public static class FactoryMaker { + + public enum KingdomType { + ELF, ORC + } + + public static KingdomFactory makeFactory(KingdomType type) { + return switch (type) { + case ELF -> new ElfKingdomFactory(); + 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 + } +``` + +## Diagramme de classes + +![alt text](../../../abstract-factory/etc/abstract-factory.urm.png "Abstract Factory class diagram") + + +## Application + +Utiliser le patron de conception "abstract factory" lorsque + +* Le système doit être indépendant de la manière dont ses produits sont créés, composés et représentés. +* Le système doit être configuré avec l'une des multiples familles de produits. +* La famille d'objets produits apparentés est conçue pour être utilisée ensemble, et vous devez faire respecter cette contrainte +* Vous voulez fournir une bibliothèque de classes de produits, et vous voulez révéler seulement leurs interfaces, pas leurs implémentations. +* La durée de vie de la dépendance est conceptuellement plus courte que la durée de vie du consommateur. +* Vous avez besoin d'une valeur d'exécution pour construire une dépendance particulière. +* Vous voulez décider quel produit appeler à partir d'une famille au moment de l'exécution. +* Vous devez fournir un ou plusieurs paramètres qui ne sont connus qu'au moment de l'exécution avant de pouvoir résoudre une dépendance. +* Lorsque vous avez besoin d'une cohérence entre les produits. +* Vous ne voulez pas modifier le code existant lorsque vous ajoutez de nouveaux produits ou de nouvelles familles de produits au programme. + +Exemples de cas d'utilisation + +* Choisir d'appeler l'implémentation appropriée de FileSystemAcmeService ou DatabaseAcmeService ou NetworkAcmeService au moment de l'exécution. +* L'écriture de cas de tests unitaires devient beaucoup plus facile. +* Outils d'interface utilisateur pour différents systèmes d'exploitation. + +## Conséquences + +* L'injection de dépendances en Java masque les dépendances des classes de service qui peuvent entraîner des erreurs d'exécution qui auraient été détectées au moment de la compilation. +* Si le modèle est idéal pour la création d'objets prédéfinis, l'ajout de nouveaux objets peut s'avérer difficile. +* Le code devient plus compliqué qu'il ne devrait l'être car un grand nombre de nouvelles interfaces et classes sont introduites en même temps que le modèle. + +## Tutoriels + +* [Abstract Factory Pattern Tutorial](https://www.journaldev.com/1418/abstract-factory-design-pattern-in-java) + +## Utilisations connues + +* [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.xpath.XPathFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/xpath/XPathFactory.html#newInstance--) + +## Modèles apparentés ou similaire (de la même catégorie) + +* [Factory Method](https://java-design-patterns.com/patterns/factory-method/) +* [Factory Kit](https://java-design-patterns.com/patterns/factory-kit/) + +## Crédits + +* [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: 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) diff --git a/localization/fr/active-object/README.md b/localization/fr/active-object/README.md new file mode 100644 index 000000000000..0eae4af29c8b --- /dev/null +++ b/localization/fr/active-object/README.md @@ -0,0 +1,128 @@ +--- +title: Active Object +category: Concurrency +language: fr +tag: + - Performance +--- + + +## Intention + +Le patron de conception des "active object" actifs dissocie l'exécution et l'invocation des méthodes pour les objets qui résident chacun dans leur fil de contrôle. L'objectif est d'introduire la concurrence en utilisant l'invocation asynchrone des méthodes et un planificateur pour traiter les demandes. + +## Explication + +La classe qui met en œuvre le patron "active object", contiendra un mécanisme d'auto-synchronisation sans utiliser de méthodes "synchronisées". + +**Exemple concret** + +> Les orques sont connus pour leur caractère sauvage et leur âme indomptable. Il semble qu'ils aient leur propre système de contrôle basé sur leur comportement antérieur. + +Pour mettre en œuvre une créature qui possède son propre mécanisme de contrôle et qui n'expose que son API et non l'exécution elle-même, nous pouvons utiliser le patron "active-object". + + +**Exemple de programme** + +```java +public abstract class ActiveCreature{ + private final Logger logger = LoggerFactory.getLogger(ActiveCreature.class.getName()); + + private BlockingQueue requests; + + private String name; + + private Thread thread; + + public ActiveCreature(String name) { + this.name = name; + this.requests = new LinkedBlockingQueue(); + thread = new Thread(new Runnable() { + @Override + public void run() { + while (true) { + try { + requests.take().run(); + } catch (InterruptedException e) { + logger.error(e.getMessage()); + } + } + } + } + ); + thread.start(); + } + + public void eat() throws InterruptedException { + requests.put(new Runnable() { + @Override + public void run() { + logger.info("{} is eating!",name()); + logger.info("{} has finished eating!",name()); + } + } + ); + } + + public void roam() throws InterruptedException { + requests.put(new Runnable() { + @Override + public void run() { + logger.info("{} has started to roam the wastelands.",name()); + } + } + ); + } + + public String name() { + return this.name; + } +} +``` + +Nous pouvons constater que toute classe qui hérite de la classe ActiveCreature aura son propre fil de contrôle pour invoquer et exécuter les méthodes. + +Par exemple, la classe Orc : + +```java +public class Orc extends ActiveCreature { + + public Orc(String name) { + super(name); + } + +} +``` + +Désormais, nous pouvons créer plusieurs créatures telles que des orques, leur dire de manger et d'errer, et elles s'exécuteront selon leur propre fil(mechanisme) de contrôle : + +```java + public static void main(String[] args) { + var app = new App(); + app.run(); + } + + @Override + public void run() { + ActiveCreature creature; + try { + for (int i = 0;i < creatures;i++) { + creature = new Orc(Orc.class.getSimpleName().toString() + i); + creature.eat(); + creature.roam(); + } + Thread.sleep(1000); + } catch (InterruptedException e) { + logger.error(e.getMessage()); + } + Runtime.getRuntime().exit(1); + } +``` + +## Diagramme de classe + +![alt text](../../../active-object/etc/active-object.urm.png "Active Object class diagram") + +## Tutoriels + +* [Android and Java Concurrency: The Active Object Pattern](https://www.youtube.com/watch?v=Cd8t2u5Qmvc) \ No newline at end of file diff --git a/localization/fr/acyclic-visitore/README.md b/localization/fr/acyclic-visitore/README.md new file mode 100644 index 000000000000..7e5b27e256ce --- /dev/null +++ b/localization/fr/acyclic-visitore/README.md @@ -0,0 +1,162 @@ +--- +title: Acyclic Visitor +category: Behavioral +language: fr +tag: + - Extensibility +--- + +## Intention + +Permettre l'ajout de nouvelles fonctions à des hiérarchies de classes existantes sans affecter ces hiérarchies et sans +créer de cycles de dépendance gênants inhérents au pqtron de conception GoF visitor. + +## Explication + +Exemple concret + +> Nous disposons d'une hiérarchie de classes de modems. Les modems de cette hiérarchie doivent être visités +> par un algorithme externe basé sur des critères de filtrage (s'agit-il d'un modem compatible Unix ou DOS). + +En clair + +> Le visiteur acyclique permet d'ajouter des fonctions à des hiérarchies de classes existantes sans modifier ces dernières. + +[WikiWikiWeb](https://wiki.c2.com/?AcyclicVisitor) dit + +> Le modèle du visiteur acyclique permet d'ajouter de nouvelles fonctions aux hiérarchies de classes existantes +> sans affecter ces hiérarchies et sans créer les cycles de dépendance inhérents au patron de conception GangOfFour visitor. + +**Exemple de Programme** + +Ci-dessous la hierarchie `Modem`. + +```java +public abstract class Modem { + public abstract void accept(ModemVisitor modemVisitor); +} + +public class Zoom extends Modem { + ... + @Override + public void accept(ModemVisitor modemVisitor) { + if (modemVisitor instanceof ZoomVisitor) { + ((ZoomVisitor) modemVisitor).visit(this); + } else { + LOGGER.info("Only ZoomVisitor is allowed to visit Zoom modem"); + } + } +} + +public class Hayes extends Modem { + ... + @Override + public void accept(ModemVisitor modemVisitor) { + if (modemVisitor instanceof HayesVisitor) { + ((HayesVisitor) modemVisitor).visit(this); + } else { + LOGGER.info("Only HayesVisitor is allowed to visit Hayes modem"); + } + } +} +``` + +Ensuite, nous introduisons la hiérarchie `ModemVisitor`. + +```java +public interface ModemVisitor { +} + +public interface HayesVisitor extends ModemVisitor { + void visit(Hayes hayes); +} + +public interface ZoomVisitor extends ModemVisitor { + void visit(Zoom zoom); +} + +public interface AllModemVisitor extends ZoomVisitor, HayesVisitor { +} + +public class ConfigureForDosVisitor implements AllModemVisitor { + ... + @Override + public void visit(Hayes hayes) { + LOGGER.info(hayes + " used with Dos configurator."); + } + @Override + public void visit(Zoom zoom) { + LOGGER.info(zoom + " used with Dos configurator."); + } +} + +public class ConfigureForUnixVisitor implements ZoomVisitor { + ... + @Override + public void visit(Zoom zoom) { + LOGGER.info(zoom + " used with Unix configurator."); + } +} +``` + +Enfin, voici les visitors en action. + +```java + var conUnix = new ConfigureForUnixVisitor(); + var conDos = new ConfigureForDosVisitor(); + var zoom = new Zoom(); + var hayes = new Hayes(); + hayes.accept(conDos); + zoom.accept(conDos); + hayes.accept(conUnix); + zoom.accept(conUnix); +``` + +Sortie du programme : + +``` + // Hayes modem used with Dos configurator. + // Zoom modem used with Dos configurator. + // Only HayesVisitor is allowed to visit Hayes modem + // Zoom modem used with Unix configurator. +``` + +## Diagramme de classes + +![alt text](../../../acyclic-visitor/etc/acyclic-visitor.png "Acyclic Visitor") + +## Application + +Ce patron de conception peut être utilisé: + +* Pour ajouter ne nouvelle fonction à une hiérarchie existante sans avoir à modifier ou à affecter cette hiérarchie. +* Lorsqu'il existe des fonctions qui opèrent sur une hiérarchie, mais qui n'appartiennent pas à la hiérarchie elle-même. Par exemple, le problème ConfigureForDOS / ConfigureForUnix / ConfigureForX. +* Lorsque vous devez éffectuer des opérations très différentes sur un objet en fonction de son type. +* Lorsque la hiérarchie des classes visitées sera fréquemment étendue avec de nouveaux dérivés de la classe Element. +*Lorsque la recompilation, l'interconnexion, le réessai ou la redistribution des dérivés de Element sont très coûteux. + +## Tutoriel + +* [Acyclic Visitor Pattern Example](https://codecrafter.blogspot.com/2012/12/the-acyclic-visitor-pattern.html) + +## Consequences + +Le bon côté: + +* Pas de cycles de dépendance entre les hiérarchies de classes. +* Il n'est pas nécessaire de recompiler tous les visiteurs si un nouveau visiteur est ajouté. +* Ne provoque pas d'échec de compilation chez les visiteurs existants si la hiérarchie des classes a un nouveau membre. + +Le mauvais : + +* viole le [principe de substitution de Liskov](https://java-design-patterns.com/principles/#liskov-substitution-principle) en montrant qu'il peut accepter tous les visiteurs alors qu'il ne s'intéresse en réalité qu'à certains d'entre eux. +* Une hiérarchie parallèle de visiteurs doit être créée pour tous les membres de la hiérarchie des classes visitables. + +## Patron de conception associé + +* [Pqtron de conception Visitor](https://java-design-patterns.com/patterns/visitor/) + +## Crédits + +* [Acyclic Visitor by Robert C. Martin](http://condor.depaul.edu/dmumaugh/OOT/Design-Principles/acv.pdf) +* [Acyclic Visitor in WikiWikiWeb](https://wiki.c2.com/?AcyclicVisitor) diff --git a/localization/fr/adapter/README.md b/localization/fr/adapter/README.md new file mode 100644 index 000000000000..dfd85090af9f --- /dev/null +++ b/localization/fr/adapter/README.md @@ -0,0 +1,137 @@ +--- +title: Adapter +category: Structural +language: fr +tag: + - Gang of Four +--- + +## Également connu sous le nom de +Wrapper + +## Intention +Convertir l'interface d'une classe en une autre interface attendue par les clients. Adapter permet à des classes de travailler ensemble +qui ne pourraient pas fonctionner autrement en raison d'interfaces incompatibles. + +## Explication + +Exemple concrêt + +> Supposons que vous avez des photos sur votre carte mémoire et vous devez les transférer sur votre ordinateur. Pour ce faire, vous avez besoin d'un adaptateur qui est compatible aux ports de votre ordinateur pour vous permettre de connecter votre carte memoire à l'ordinateur. dans ce cas le lecteur de carte est un adapteur. +> Un autre exemple serait le fameux adaptateur électrique ; une fiche à trois branches ne peut pas être branchée sur une prise à deux branches, elle doit utiliser un adaptateur électrique qui la rend compatible avec les prises à deux branches. +> Un autre exemple serait celui d'un traducteur qui traduirait les mots prononcés par une personne à une autre. + +En clair + +> Le patron adapter permet d'envelopper un objet autrement incompatible dans un adaptateur afin de le rendre compatible avec une autre classe. + +Wikipedia dit + +> En génie logiciel, le pattron de conception adapter est un pattron de conception logicielle qui permet d'utiliser l'interface d'une classe existante comme une autre interface. Il est souvent utilisé pour faire fonctionner des classes existantes avec d'autres sans modifier leur code source. + +**Exemple de programme** + +Prenons l'exemple d'un capitaine qui ne peut utiliser que des bateaux à rames et qui ne peut pas du tout naviguer. + +Tout d'abord, nous avons les interfaces `RowingBoat` et `FishingBoat` + +```java +public interface RowingBoat { + void row(); +} + +@Slf4j +public class FishingBoat { + public void sail() { + LOGGER.info("The fishing boat is sailing"); + } +} +``` + +Et le capitaine s'attend à ce qu'une implémentation de l'interface `RowingBoat` soit capable de se déplacer + +```java +public class Captain { + + private final RowingBoat rowingBoat; + // default constructor and setter for rowingBoat + public Captain(RowingBoat rowingBoat) { + this.rowingBoat = rowingBoat; + } + + public void row() { + rowingBoat.row(); + } +} +``` + +Supposons maintenant que les pirates arrivent et que notre capitaine doive s'échapper, mais qu'il ne dispose que d'un bateau de pêche. Nous devons créer un adaptateur qui permette au capitaine de faire fonctionner le bateau de pêche avec ses compétences de rameur. + +```java +@Slf4j +public class FishingBoatAdapter implements RowingBoat { + + private final FishingBoat boat; + + public FishingBoatAdapter() { + boat = new FishingBoat(); + } + + @Override + public void row() { + boat.sail(); + } +} +``` + +Et maintenant, `Captain` peut utiliser le `FishingBoat` pour échapper aux pirates. + +```java +var captain = new Captain(new FishingBoatAdapter()); +captain.row(); +``` + +## Diagramme des classes +![alt text](../../../adapter/etc/adapter.urm.png "Adapter class diagram") + +## Application +Utiliser le pattron de conception adapter lorsque + +* Vous souhaitez utiliser une classe existante, mais son interface ne correspond pas à celle dont vous avez besoin +* Vous souhaitez créer une classe réutilisable qui coopère avec des classes non liées ou imprévues, c'est-à-dire des classes qui n'ont pas nécessairement d'interfaces compatibles. +* Vous devez utiliser plusieurs sous-classes existantes, mais il n'est pas pratique d'adapter leur interface en les sous-classant toutes. Un adaptateur d'objet peut adapter l'interface de sa classe mère. +* La plupart des applications utilisant des bibliothèques tierces utilisent des adaptateurs comme couche intermédiaire entre l'application et la bibliothèque tierce afin de découpler l'application de la bibliothèque. Si une autre bibliothèque doit être utilisée, il suffit de créer un adaptateur pour la nouvelle bibliothèque sans avoir à modifier le code de l'application. + +## Tutoriels + +* [Dzone](https://dzone.com/articles/adapter-design-pattern-in-java) +* [Refactoring Guru](https://refactoring.guru/design-patterns/adapter/java/example) +* [Baeldung](https://www.baeldung.com/java-adapter-pattern) + +## Conséquences +Les adaptateurs de classe et d'objet présentent différents avantages. Un adaptateur de classe : + +* Adapte l'adaptateur à la cible en s'engageant dans une classe concrète d'adaptateur. Par conséquent, un adaptateur de classe ne fonctionnera pas si nous voulons adapter une classe et toutes ses sous-classes. +* Permet à l'adaptateur de surcharger certains comportements de l'adaptaté puisque l'adaptateur est une sous-classe de l'adaptaté. +* N'introduit qu'un seul objet, et aucune indirection de pointeur supplémentaire n'est nécessaire pour accéder à l'adaptateur. + +Un adaptateur d'objet : + +* Permet à un seul adaptateur de travailler avec de nombreux adaptatés, c'est-à-dire l'adaptateur lui-même et toutes ses sous-classes (le cas échéant). L'adaptateur peut également ajouter des fonctionnalités à tous les adaptatés en même temps. +* Rend plus difficile la modification du comportement de l'adapté. Il faudra créer des sous classes de l'adapta et faire en sorte que l'adaptateur se réfère à la sous-classe plutôt qu'à l'adapté lui-même. + + +## Utilisations connues + +* [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#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-) + + +## Crédits + +* [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) +* [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) +* [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://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) diff --git a/localization/fr/aggregator-microservices/README.md b/localization/fr/aggregator-microservices/README.md new file mode 100644 index 000000000000..ed27ca451659 --- /dev/null +++ b/localization/fr/aggregator-microservices/README.md @@ -0,0 +1,106 @@ +--- +title: Aggregator Microservices +category: Architectural +language: fr +tag: +- Cloud distributed +- Decoupling +- Microservices +--- + +## Intention + +L'utilisateur fait un appel unique au service d'agrégation, et ce dernier appelle ensuite chaque microservice approprié. + +## Explication + +Exemple concret + +> Notre marché en ligne a besoin d'informations sur les produits et leur stock actuel. Elle fait appel à un service +> d'agrégation qui, à son tour, appelle le microservice d'information sur les produits et le microservice d'inventaire +> des produits et renvoie les informations combinées. + +En clair + +> Aggregator Microservice collecte des éléments de données provenant de divers microservices et renvoie un agrégat pour traitement.. + +Stack Overflow dit + +> Aggregator Microservice invoque plusieurs services pour réaliser la fonctionnalité requise par l'application. + +**Exemple de programme** + +Commençons par le modèle de données. Voici notre `Product`. + +```java +public class Product { + private String title; + private int productInventories; + // getters and setters -> + ... +} +``` + +Ensuite, nous pouvons présenter notre microservice `Aggregator`. Il contient les clients `ProductInformationClient` et +`ProductInventoryClient` pour appeler les microservices respectifs. + +```java +@RestController +public class Aggregator { + + @Resource + private ProductInformationClient informationClient; + + @Resource + private ProductInventoryClient inventoryClient; + + @RequestMapping(path = "/product", method = RequestMethod.GET) + public Product getProduct() { + + var product = new Product(); + var productTitle = informationClient.getProductTitle(); + var productInventory = inventoryClient.getProductInventories(); + + //Fallback to error message + product.setTitle(requireNonNullElse(productTitle, "Error: Fetching Product Title Failed")); + + //Fallback to default error inventory + product.setProductInventories(requireNonNullElse(productInventory, -1)); + + return product; + } +} +``` + +Voici l'essentiel de la mise en œuvre du microservice d'information. Le microservice dInventory est similaire, il renvoie simplement l'inventaire. + +```java +@RestController +public class InformationController { + @RequestMapping(value = "/information", method = RequestMethod.GET) + public String getProductTitle() { + return "The Product Title."; + } +} +``` + +L'appel à notre API REST `Aggregator` renvoie les informations sur le produit. + +```bash +curl http://localhost:50004/product +{"title":"The Product Title.","productInventories":5} +``` + +## Class diagram + +![alt text](../../../aggregator-microservices/aggregator-service/etc/aggregator-service.png "Aggregator Microservice") + +## Application + +Utilisez le modèle de microservices agrégateur lorsque vous avez besoin d'une API unifiée pour différents microservices, quel que soit l'appareil client. + +## Crédits + +* [Microservice Design Patterns](http://web.archive.org/web/20190705163602/http://blog.arungupta.me/microservice-design-patterns/) +* [Microservices Patterns: With examples in Java](https://www.amazon.com/gp/product/1617294543/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=1617294543&linkId=8b4e570267bc5fb8b8189917b461dc60) +* [Architectural Patterns: Uncover essential patterns in the most indispensable realm of enterprise architecture](https://www.amazon.com/gp/product/B077T7V8RC/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=B077T7V8RC&linkId=c34d204bfe1b277914b420189f09c1a4) diff --git a/localization/fr/ambassador/README.md b/localization/fr/ambassador/README.md new file mode 100644 index 000000000000..d0659a826919 --- /dev/null +++ b/localization/fr/ambassador/README.md @@ -0,0 +1,204 @@ +--- +title: Ambassador +category: Structural +language: fr +tag: + - Decoupling + - Cloud distributed +--- + +## Intention + +Fournir une instance de service d'assistance à un client et décharger une fonctionnalité commune d'une ressource partagée. + +## Explication + +Exemple concret + +> Un service distant a de nombreux clients qui accèdent à une fonction qu'il fournit. Le service est une application +> ancienne qu'il est impossible de mettre à jour. Le grand nombre de requêtes des utilisateurs entraîne des problèmes de +> connectivité. De nouvelles règles relatives à la fréquence des requêtes doivent être mises en œuvre, ainsi que des +> contrôles de latence et une journalisation côté client. + +En clair + +>Avec le modèle Ambassador, nous pouvons mettre en œuvre des interrogations moins fréquentes de la part des clients, +> ainsi que des contrôles de latence et une journalisation. + +La documentation de Microsoft indique que + +> Un service ambassadeur peut être considéré comme un mandataire hors processus qui se trouve au même endroit que le client. +> Ce pattron peut être utile pour décharger les tâches courantes de connectivité client telles que la surveillance, +> la journalisation, le routage, la sécurité (comme TLS) et les modèles de résilience d'une manière indépendante du langage. +> Il est souvent utilisé avec des applications anciennes ou d'autres applications difficiles à modifier, afin d'étendre +> leurs capacités de mise en réseau. Il peut également permettre à une équipe spécialisée de mettre en œuvre ces fonctionnalités. + +**Exemple de programme** + +En gardant en mémoire l'introduction ci-dessus, nous reproduirons cette fonctionnalité dans ce exemple. Nous avons une interface +implémentée par un service distant aussi bien que service ambassadeur +We have an interface implemented +by the remote service as well as the ambassador service : + +```java +interface RemoteServiceInterface { + long doRemoteFunction(int value) throws Exception; +} +``` + +Un sercive distant représenté comme un singleton. + +```java +@Slf4j +public class RemoteService implements RemoteServiceInterface { + private static RemoteService service = null; + + static synchronized RemoteService getRemoteService() { + if (service == null) { + service = new RemoteService(); + } + return service; + } + + private RemoteService() {} + + @Override + public long doRemoteFunction(int value) { + long waitTime = (long) Math.floor(Math.random() * 1000); + + try { + sleep(waitTime); + } catch (InterruptedException e) { + LOGGER.error("Thread sleep interrupted", e); + } + + return waitTime >= 200 ? value * 10 : -1; + } +} +``` + +Un service ambassadeur ajoute des fonctionnalités supplémentaires à l'instar de la journalisation et des contrôles de latence + +```java +@Slf4j +public class ServiceAmbassador implements RemoteServiceInterface { + private static final int RETRIES = 3; + private static final int DELAY_MS = 3000; + + ServiceAmbassador() { + } + + @Override + public long doRemoteFunction(int value) { + return safeCall(value); + } + + private long checkLatency(int value) { + var startTime = System.currentTimeMillis(); + var result = RemoteService.getRemoteService().doRemoteFunction(value); + var timeTaken = System.currentTimeMillis() - startTime; + + LOGGER.info("Time taken (ms): " + timeTaken); + return result; + } + + private long safeCall(int value) { + var retries = 0; + var result = (long) FAILURE; + + for (int i = 0; i < RETRIES; i++) { + if (retries >= RETRIES) { + return FAILURE; + } + + if ((result = checkLatency(value)) == FAILURE) { + LOGGER.info("Failed to reach remote: (" + (i + 1) + ")"); + retries++; + try { + sleep(DELAY_MS); + } catch (InterruptedException e) { + LOGGER.error("Thread sleep state interrupted", e); + } + } else { + break; + } + } + return result; + } +} +``` + +Un client dispose d'un service ambassadeur local utilisé pour interagir avec le service distant : + +```java +@Slf4j +public class Client { + private final ServiceAmbassador serviceAmbassador = new ServiceAmbassador(); + + long useService(int value) { + var result = serviceAmbassador.doRemoteFunction(value); + LOGGER.info("Service result: " + result); + return result; + } +} +``` + +Voici deux clients utilisant le service. + +```java +public class App { + public static void main(String[] args) { + var host1 = new Client(); + var host2 = new Client(); + host1.useService(12); + host2.useService(73); + } +} +``` + +Ci-déssous la sortie du programme : + +```java +Time taken (ms): 111 +Service result: 120 +Time taken (ms): 931 +Failed to reach remote: (1) +Time taken (ms): 665 +Failed to reach remote: (2) +Time taken (ms): 538 +Failed to reach remote: (3) +Service result: -1 +``` + +## Class diagram + +![alt text](../../../ambassador/etc/ambassador.urm.png "Ambassador class diagram") + +## Application + +* Le pattron ambassador s'applique lorsque l'on travaille avec un service distant existant qui ne peut pas être modifié ou +qui serait extrêmement difficile à modifier. Les fonctions de connectivité peuvent être mises en œuvre sur le client sans +qu'il soit nécessaire d'apporter des modifications au service distant. +* Ambassador fournit une interface locale pour un service distant. +* Ambassador assure la journalisation, la coupure de circuit, les tentatives et la sécurité sur le client. + +## Cas d'utilisation typique + +* Contrôler l'accès à un autre objet +* Mise en œuvre de la journalisation +* Mettre en œuvre d'un coupe-circuit +* Décharger les tâches de service à distance +* Faciliter la connexion au réseau + +## Utilisations connues + +* [Kubernetes-native API gateway for microservices](https://github.com/datawire/ambassador) + +## Modèles connexes + +* [Proxy](https://java-design-patterns.com/patterns/proxy/) + +## Crédits + +* [Ambassador pattern](https://docs.microsoft.com/en-us/azure/architecture/patterns/ambassador) +* [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) diff --git a/localization/fr/api-gateway/README.md b/localization/fr/api-gateway/README.md new file mode 100644 index 000000000000..70e513e00e1f --- /dev/null +++ b/localization/fr/api-gateway/README.md @@ -0,0 +1,164 @@ +--- +title: API Gateway +category: Architectural +language: fr +tag: + - Cloud distributed + - Decoupling + - Microservices +--- + +## Intention + +Regrouper les appels aux microservices en un seul endroit, la passerelle API. +L'utilisateur fait un seul appel à la passerelle API, qui appelle ensuite chaque microservice concerné. + +## Explication + +Avec les pattrons microservices, un client peut avoir besoin de données provenant de plusieurs microservices différents. +Si le client appelait directement chaque microservice, cela pourrait contribuer à allonger les temps de chargement, +puisque le client devrait faire une requete réseau pour chaque microservice appelé. En outre, le fait que le client appelle +chaque microservice directement le lie à ce microservice - si les implémentations internes des microservices changent +(par exemple, si deux microservices sont combinés) ou si l'emplacement (hôte et port) d'un microservice change, +alors chaque client qui utilise ces microservices doit être informé de l'existence de ce microservice. + +L'objectif du pattron API Gateway est d'atténuer certains de ces problèmes. Dans le pattron API Gateway une entité supplémentaire +(la passerelle API) est placée entre le client et les microservices. Le rôle de la passerelle API est d'agréger les appels aux microservices. Plutôt que le client +appelle chaque microservice individuellement, le client appelle la passerelle API une seule fois. +La passerelle API appelle alors chacun des microservices dont le client a besoin. + +Exemple concret + +> Nous mettons en œuvre des microservices et un pattron API Gateway pour un site de commerce en ligne. +> Dans ce système la passerelle API fait des appels aux microservices Image et Prix. + +En clair + +> Pour un système mis en œuvre à l'aide d'une architecture de microservices, +> API Gateway est le point d'entrée unique qui regroupe les appels aux différents microservices. + +Wikipedia dit + +> La passerelle API est un serveur qui agit comme un front-end API, reçoit les requêtes API, applique des politiques de +> limitation et de sécurité, transmet les requêtes au service back-end et renvoie la réponse au demandeur. +> Une passerelle comprend souvent un moteur de transformation pour orchestrer et modifier les demandes et les réponses à la volée. +> Une passerelle peut également fournir des fonctionnalités telles que la collecte de données analytiques et la mise en cache. +> La passerelle peut fournir des fonctionnalités pour prendre en charge l'authentification, l'autorisation, la sécurité, +> l'audit et la conformité réglementaire. + +**Exemple de programme** + +Cette mise en œuvre montre à quoi pourrait ressembler le pattron de conception API Gateway pour un site de commerce électronique. +La passerelle `ApiGateway` fait des appels aux microservices Image et Price en utilisant respectivement `ImageClientImpl` et `PriceClientImpl` respectivement. +Les clients qui consultent le site sur un ordinateur de bureau peuvent voir à la fois les informations sur le prix et l'image d'un produit. +Les clients qui consultent le site sur un ordinateur de bureau peuvent voir à la fois des informations sur le prix et l'image d'un produit, +donc la passerelle appelle les deux microservices et regroupe les données dans le modèle `DesktopProduct`. +Cependant, les utilisateurs mobiles ne voient que les informations sur le prix ; Ils ne voient pas l'image du produit. +Pour les utilisateurs mobiles, la passerelle `ApiGateway` ne récupère que les informations de prix, qu'elle utilise pour remplir le modèle `MobileProduct`. + +Voici l'implémentation du microservice Image. + +```java +public interface ImageClient { + String getImagePath(); +} + +public class ImageClientImpl implements ImageClient { + @Override + public String getImagePath() { + var httpClient = HttpClient.newHttpClient(); + var httpGet = HttpRequest.newBuilder() + .GET() + .uri(URI.create("http://localhost:50005/image-path")) + .build(); + + try { + var httpResponse = httpClient.send(httpGet, BodyHandlers.ofString()); + return httpResponse.body(); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + + return null; + } +} +``` + +Voici l'implémentation du microservice Price. + +```java +public interface PriceClient { + String getPrice(); +} + +public class PriceClientImpl implements PriceClient { + + @Override + public String getPrice() { + var httpClient = HttpClient.newHttpClient(); + var httpGet = HttpRequest.newBuilder() + .GET() + .uri(URI.create("http://localhost:50006/price")) + .build(); + + try { + var httpResponse = httpClient.send(httpGet, BodyHandlers.ofString()); + return httpResponse.body(); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + + return null; + } +} +``` + +Nous voyons ici comment API Gateway fait correspondre les demandes aux microservices. + +```java +public class ApiGateway { + + @Resource + private ImageClient imageClient; + + @Resource + private PriceClient priceClient; + + @RequestMapping(path = "/desktop", method = RequestMethod.GET) + public DesktopProduct getProductDesktop() { + var desktopProduct = new DesktopProduct(); + desktopProduct.setImagePath(imageClient.getImagePath()); + desktopProduct.setPrice(priceClient.getPrice()); + return desktopProduct; + } + + @RequestMapping(path = "/mobile", method = RequestMethod.GET) + public MobileProduct getProductMobile() { + var mobileProduct = new MobileProduct(); + mobileProduct.setPrice(priceClient.getPrice()); + return mobileProduct; + } +} +``` + +## Diagramme de clqsses +![alt text](../../../api-gateway/etc/api-gateway.png "API Gateway") + +## Application + +Utilisez le pattron de passerelle API lorsque + +* Vous utilisez une architecture de microservices et avez besoin d'un point d'agrégation unique pour vos appels de microservices. + +## Tutoriels + +* [Exploring the New Spring Cloud Gateway](https://www.baeldung.com/spring-cloud-gateway) +* [Spring Cloud - Gateway](https://www.tutorialspoint.com/spring_cloud/spring_cloud_gateway.htm) +* [Getting Started With Spring Cloud Gateway](https://dzone.com/articles/getting-started-with-spring-cloud-gateway) + +## Crédits + +* [microservices.io - API Gateway](http://microservices.io/patterns/apigateway.html) +* [NGINX - Building Microservices: Using an API Gateway](https://www.nginx.com/blog/building-microservices-using-an-api-gateway/) +* [Microservices Patterns: With examples in Java](https://www.amazon.com/gp/product/1617294543/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=1617294543&linkId=ac7b6a57f866ac006a309d9086e8cfbd) +* [Building Microservices: Designing Fine-Grained Systems](https://www.amazon.com/gp/product/1491950358/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=1491950358&linkId=4c95ca9831e05e3f0dadb08841d77bf1) diff --git a/localization/fr/arrange-act-assert/README.md b/localization/fr/arrange-act-assert/README.md new file mode 100644 index 000000000000..f254878cb543 --- /dev/null +++ b/localization/fr/arrange-act-assert/README.md @@ -0,0 +1,140 @@ +--- +title: Arrange/Act/Assert +category: Idiom +language: fr +tag: + - Testing +--- + +## Aussi connu sous le nom de + +Given/When/Then + +## Intention + +Arrange/Act/Assert (AAA) est un pattron d'organisation des tests unitaires. +Il décompose les tests en trois étapes claires et distinctes : + +1. Arrange : éffectuer la configuration et l'initialisation requises pour le test. +2. Act : éffectuer la ou les actions requises pour le test. +3. Assert: Vérifier le(s) résultat(s) du test. + +## Explication + +Ce pattron présente plusieurs avantages importants. Il crée une séparation claire entre la mise en place d'un test d'un test, +les opérations et les résultats. Cette structure rend le code plus facile à lire et à comprendre. +Si vous placez les étapes dans l'ordre et que vous formatez votre code source pour les séparer, vous pouvez parcourir un test et comprendre rapidement ce qu'il fait. + +Il impose également un certain degré de discipline lors de l'écriture des tests. Vous devez penser clairement les trois étapes de votre test. +Il est plus naturel d'écrire les tests en même temps, puisque vous avez déjà un plan. + +Exemple + +> Pour écrire des tests unitaire clairs et compréhensibles. + +En clair + +> Arrange/Act/Assert est un pattron de conception de tests qui organise les tests en trois étapes pour une maintenance facile. + +WikiWikiWeb dit + +> Arrange/Act/Assert est un pattron pour organiser et formater un code dans les methodes de test unitaire. + +**Exemple de programme** + +Commençons par présenter notre classe `Cash` qui subira un test unitaire. + +```java +public class Cash { + + private int amount; + + Cash(int amount) { + this.amount = amount; + } + + void plus(int addend) { + amount += addend; + } + + boolean minus(int subtrahend) { + if (amount >= subtrahend) { + amount -= subtrahend; + return true; + } else { + return false; + } + } + + int count() { + return amount; + } +} +``` + +Ensuite, nous rédigeons nos tests unitaires suivant le pattron Arrange/Act/Assert. +Notez les étapes clairement séparées pour chaque test unitaire. + +```java +class CashAAATest { + + @Test + void testPlus() { + //Arrange + var cash = new Cash(3); + //Act + cash.plus(4); + //Assert + assertEquals(7, cash.count()); + } + + @Test + void testMinus() { + //Arrange + var cash = new Cash(8); + //Act + var result = cash.minus(5); + //Assert + assertTrue(result); + assertEquals(3, cash.count()); + } + + @Test + void testInsufficientMinus() { + //Arrange + var cash = new Cash(1); + //Act + var result = cash.minus(6); + //Assert + assertFalse(result); + assertEquals(1, cash.count()); + } + + @Test + void testUpdate() { + //Arrange + var cash = new Cash(5); + //Act + cash.plus(6); + var result = cash.minus(3); + //Assert + assertTrue(result); + assertEquals(8, cash.count()); + } +} +``` + +## Application + +Le pattron Arrange/Act/Assert peut être utilisé lorsque : + +* Vous avez besoin d'organiser vos tests unitaire pour qu'il soit facile à lire, maintenir et améliorer. + +## Crédits + +* [Arrange, Act, Assert: What is AAA Testing?](https://blog.ncrunch.net/post/arrange-act-assert-aaa-testing.aspx) +* [Bill Wake: 3A – Arrange, Act, Assert](https://xp123.com/articles/3a-arrange-act-assert/) +* [Martin Fowler: GivenWhenThen](https://martinfowler.com/bliki/GivenWhenThen.html) +* [xUnit Test Patterns: Refactoring Test Code](https://www.amazon.com/gp/product/0131495054/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0131495054&linkId=99701e8f4af2f7e8dd50d720c9b63dbf) +* [Unit Testing Principles, Practices, and Patterns](https://www.amazon.com/gp/product/1617296279/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=1617296279&linkId=74c75cf22a63c3e4758ae08aa0a0cc35) +* [Test Driven Development: By Example](https://www.amazon.com/gp/product/0321146530/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0321146530&linkId=5c63a93d8c1175b84ca5087472ef0e05) diff --git a/localization/fr/async-method-invocation/README.md b/localization/fr/async-method-invocation/README.md new file mode 100644 index 000000000000..0eef955ad614 --- /dev/null +++ b/localization/fr/async-method-invocation/README.md @@ -0,0 +1,166 @@ +--- +title: Async Method Invocation +category: Concurrency +language: fr +tag: + - Reactive +--- + +## Intention + +Le pattron de conception Asynchronous method invocation est un pattron dans lequel le thread appelé n'est pas bloqué en +attendant la fin de l'exécution des tâches. +Ce pattron permet le traitement parallèle de plusieurs tâches indépendantes et récupère les résultats via les callback ou patiente jusqu'à la fin. + +## Explication + +Exemple concret + +> Le lancement de fusées spatiales est une activité passionnante. Le commandant de la mission donne +> l'ordre de lancement et, après un temps indéterminé, la fusée réussit son lancement ou échoue lamentablement. + +En clair + +> Asynchronous method invocation démarre l'exécution de la tâche et retourne directement avant la fin de l'exécution de la tâche. +> Les résultats de l'exécution des tâches sont retournés après. + +Wikipedia dit + +> Dans la programmation multithread, asynchronous method invocation (AMI), également connue sous le nom de asynchronous method calls +> ou le pattron asynchronous, est un pattron de conception dans lequel le site d'appel n'est pas bloqué en attendant que le code appelé se termine. +> Au lieu de cela, le thread appelant est informé de l'arrivée de la réponse. L'interrogation pour une réponse est une option non souhaitée. + +**Exemple de programme** + +Dans cet exemple, nous lançons des fusées spatiales et déployons des rovers lunaires. + +L'application démontre le pattron async method invocation. Les éléments clés de ce modèle sont `AsyncResult` +qui est un conteneur intermédiaire pour une valeur évaluée de manière asynchrone, `AsyncCallback` qui peut être fourni +pour être exécuté à la fin de la tâche et `AsyncExecutor` qui gère l'exécution des tâches asynchrones. qui gère l'exécution des tâches asynchrones. + +```java +public interface AsyncResult { + boolean isCompleted(); + T getValue() throws ExecutionException; + void await() throws InterruptedException; +} +``` + +```java +public interface AsyncCallback { + void onComplete(T value, Optional ex); +} +``` + +```java +public interface AsyncExecutor { + AsyncResult startProcess(Callable task); + AsyncResult startProcess(Callable task, AsyncCallback callback); + T endProcess(AsyncResult asyncResult) throws ExecutionException, InterruptedException; +} +``` + +`ThreadAsyncExecutor` est une implémentation de `AsyncExecutor`. Certains de ses éléments clés sont décrits ci-dessous. + +```java +public class ThreadAsyncExecutor implements AsyncExecutor { + + @Override + public AsyncResult startProcess(Callable task) { + return startProcess(task, null); + } + + @Override + public AsyncResult startProcess(Callable task, AsyncCallback callback) { + var result = new CompletableResult<>(callback); + new Thread( + () -> { + try { + result.setValue(task.call()); + } catch (Exception ex) { + result.setException(ex); + } + }, + "executor-" + idx.incrementAndGet()) + .start(); + return result; + } + + @Override + public T endProcess(AsyncResult asyncResult) + throws ExecutionException, InterruptedException { + if (!asyncResult.isCompleted()) { + asyncResult.await(); + } + return asyncResult.getValue(); + } +} +``` + +Nous sommes ensuite prêts à lancer quelques fusées pour voir comment tout fonctionne ensemble. + +```java +public static void main(String[] args) throws Exception { + // construct a new executor that will run async tasks + var executor = new ThreadAsyncExecutor(); + + // start few async tasks with varying processing times, two last with callback handlers + final var asyncResult1 = executor.startProcess(lazyval(10, 500)); + final var asyncResult2 = executor.startProcess(lazyval("test", 300)); + final var asyncResult3 = executor.startProcess(lazyval(50L, 700)); + final var asyncResult4 = executor.startProcess(lazyval(20, 400), callback("Deploying lunar rover")); + final var asyncResult5 = + executor.startProcess(lazyval("callback", 600), callback("Deploying lunar rover")); + + // emulate processing in the current thread while async tasks are running in their own threads + Thread.sleep(350); // Oh boy, we are working hard here + log("Mission command is sipping coffee"); + + // wait for completion of the tasks + final var result1 = executor.endProcess(asyncResult1); + final var result2 = executor.endProcess(asyncResult2); + final var result3 = executor.endProcess(asyncResult3); + asyncResult4.await(); + asyncResult5.await(); + + // log the results of the tasks, callbacks log immediately when complete + log("Space rocket <" + result1 + "> launch complete"); + log("Space rocket <" + result2 + "> launch complete"); + log("Space rocket <" + result3 + "> launch complete"); +} +``` + +Voici la sortie de la console du programme. + +```java +21:47:08.227 [executor-2] INFO com.iluwatar.async.method.invocation.App - Space rocket launched successfully +21:47:08.269 [main] INFO com.iluwatar.async.method.invocation.App - Mission command is sipping coffee +21:47:08.318 [executor-4] INFO com.iluwatar.async.method.invocation.App - Space rocket <20> launched successfully +21:47:08.335 [executor-4] INFO com.iluwatar.async.method.invocation.App - Deploying lunar rover <20> +21:47:08.414 [executor-1] INFO com.iluwatar.async.method.invocation.App - Space rocket <10> launched successfully +21:47:08.519 [executor-5] INFO com.iluwatar.async.method.invocation.App - Space rocket launched successfully +21:47:08.519 [executor-5] INFO com.iluwatar.async.method.invocation.App - Deploying lunar rover +21:47:08.616 [executor-3] INFO com.iluwatar.async.method.invocation.App - Space rocket <50> launched successfully +21:47:08.617 [main] INFO com.iluwatar.async.method.invocation.App - Space rocket <10> launch complete +21:47:08.617 [main] INFO com.iluwatar.async.method.invocation.App - Space rocket launch complete +21:47:08.618 [main] INFO com.iluwatar.async.method.invocation.App - Space rocket <50> launch complete +``` + +# Diagramme de classes + +![alt text](../../../async-method-invocation/etc/async-method-invocation.png "Async Method Invocation") + +## Application + +Utilisez le pattron async method invocation lorsque + +* Vous avez plusieurs tâches indépendantes qui peuvent être exécutées en parallèle +* Vous devez améliorer les performances d'un groupe de tâches séquentielles +* Vous disposez d'une capacité de traitement limitée ou de tâches à long terme et l'appelant ne doit pas attendre que les tâches soient exécutées. + +## Application concrete + +* [FutureTask](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/FutureTask.html) +* [CompletableFuture](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html) +* [ExecutorService](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html) +* [Task-based Asynchronous Pattern](https://msdn.microsoft.com/en-us/library/hh873175.aspx) diff --git a/localization/fr/balking/README.md b/localization/fr/balking/README.md new file mode 100644 index 000000000000..ea066a510121 --- /dev/null +++ b/localization/fr/balking/README.md @@ -0,0 +1,133 @@ +--- +title: Balking +category: Concurrency +language: fr +tag: + - Decoupling +--- + +## Intention + +Le pattron de conception Balking est utilisé pour empêcher un objet d'exécuter un certain code +s'il est dans un état incomplet ou inapproprié. + +## Explication + +Exemple concret + +> Sur une machine à laver, un bouton de démarrage permet de lancer le lavage du linge. Lorsque la machine à laver est inactive, +> le bouton fonctionne comme prévu, mais si la machine est déjà en train de laver, le bouton ne fait rien. + +En clair + +> En utilisant le pattron balking, un certain code ne s'exécute que si l'objet se trouve dans un état particulier. + +Wikipedia dit + +> Le pattron de conception balking est un pattron de conception de logiciel qui n'exécute une action sur un objet que +> lorsque l'objet se trouve dans un état particulier. Par exemple, si un objet lit des fichiers ZIP et qu'une méthode +> appelante invoque une méthode get sur l'objet alors que le fichier ZIP n'est pas ouvert, l'objet rejette la demande. + +**Exemple de programme** + +Dans cet exemple d'implémentation, `WashingMachine` est un objet qui peut être dans deux états : ENABLED et WASHING. +Si la machine est ENABLED, l'état change en WASHING en utilisant une méthode thread-safe. D'autre part, si elle a déjà +été lavée et qu'un autre thread exécute `wash()`, elle ne le fera pas et terminera sans rien faire. + +Voici les parties pertinentes de la classe `WashingMachine` + +```java +@Slf4j +public class WashingMachine { + + private final DelayProvider delayProvider; + private WashingMachineState washingMachineState; + + public WashingMachine(DelayProvider delayProvider) { + this.delayProvider = delayProvider; + this.washingMachineState = WashingMachineState.ENABLED; + } + + public WashingMachineState getWashingMachineState() { + return washingMachineState; + } + + public void wash() { + synchronized (this) { + var machineState = getWashingMachineState(); + LOGGER.info("{}: Actual machine state: {}", Thread.currentThread().getName(), machineState); + if (this.washingMachineState == WashingMachineState.WASHING) { + LOGGER.error("Cannot wash if the machine has been already washing!"); + return; + } + this.washingMachineState = WashingMachineState.WASHING; + } + LOGGER.info("{}: Doing the washing", Thread.currentThread().getName()); + this.delayProvider.executeAfterDelay(50, TimeUnit.MILLISECONDS, this::endOfWashing); + } + + public synchronized void endOfWashing() { + washingMachineState = WashingMachineState.ENABLED; + LOGGER.info("{}: Washing completed.", Thread.currentThread().getId()); + } +} +``` + +Voici l'interface simple `DelayProvider` utilisée par le `WashingMachine`. + +```java +public interface DelayProvider { + void executeAfterDelay(long interval, TimeUnit timeUnit, Runnable task); +} +``` + +Nous allons maintenant présenter l'application en utilisant le `WashingMachine`. + +```java + public static void main(String... args) { + final var washingMachine = new WashingMachine(); + var executorService = Executors.newFixedThreadPool(3); + for (int i = 0; i < 3; i++) { + executorService.execute(washingMachine::wash); + } + executorService.shutdown(); + try { + executorService.awaitTermination(10, TimeUnit.SECONDS); + } catch (InterruptedException ie) { + LOGGER.error("ERROR: Waiting on executor service shutdown!"); + Thread.currentThread().interrupt(); + } + } +``` + +Voici la sortie de la console du programme. + +``` +14:02:52.268 [pool-1-thread-2] INFO com.iluwatar.balking.WashingMachine - pool-1-thread-2: Actual machine state: ENABLED +14:02:52.272 [pool-1-thread-2] INFO com.iluwatar.balking.WashingMachine - pool-1-thread-2: Doing the washing +14:02:52.272 [pool-1-thread-3] INFO com.iluwatar.balking.WashingMachine - pool-1-thread-3: Actual machine state: WASHING +14:02:52.273 [pool-1-thread-3] ERROR com.iluwatar.balking.WashingMachine - Cannot wash if the machine has been already washing! +14:02:52.273 [pool-1-thread-1] INFO com.iluwatar.balking.WashingMachine - pool-1-thread-1: Actual machine state: WASHING +14:02:52.273 [pool-1-thread-1] ERROR com.iluwatar.balking.WashingMachine - Cannot wash if the machine has been already washing! +14:02:52.324 [pool-1-thread-2] INFO com.iluwatar.balking.WashingMachine - 14: Washing completed. +``` + +## Diagramme de classe + +![alt text](../../../balking/etc/balking.png "Balking") + +## Application + +Utilisé le pattron balking lorsque : + +* Vous souhaitez invoquer une action sur un objet uniquement lorsqu'il se trouve dans un état spécifique +* Les objets ne sont généralement que dans un état susceptible d'évoluer temporairement, mais pour une durée inconnue. + +## Pattron de conception apparentés + +* [Guarded Suspension Pattern](https://java-design-patterns.com/patterns/guarded-suspension/) +* [Double Checked Locking Pattern](https://java-design-patterns.com/patterns/double-checked-locking/) + +## Crédits + +* [Patterns in Java: A Catalog of Reusable Design Patterns Illustrated with UML, 2nd Edition, Volume 1](https://www.amazon.com/gp/product/0471227293/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0471227293&linkId=0e39a59ffaab93fb476036fecb637b99) diff --git a/localization/fr/bridge/README.md b/localization/fr/bridge/README.md new file mode 100644 index 000000000000..0d24a568731a --- /dev/null +++ b/localization/fr/bridge/README.md @@ -0,0 +1,215 @@ +--- +title: Bridge +category: Structural +language: fr +tag: + - Gang of Four +--- + +## Également connu sous le nom de + +Handle/Body + +## Intention + +Découpler une abstraction de son implémentation afin que les deux puissent varier indépendamment. + +## Explication + +Exemple concret + +> Considérons que vous avez une arme avec différents enchantements, et que vous êtes censé permettre de mélanger +> différentes armes avec différents enchantements. Que feriez-vous ? Créer plusieurs copies de chaque arme pour chacun +> des enchantements ou simplement créer un enchantement séparé et l'appliquer à l'arme en fonction des besoins ? +> Le pattron de concepetion Bridge pattern vous permet de faire la deuxième solution. + +En clair + +> Bridge pattern consiste à préférer la composition à l'héritage. Les détails de la mise en œuvre(implémentation) +> sont transférés d'une hiérarchie à un autre objet ayant une hiérarchie distincte. + +Wikipedia dit + +> Bridge pattern est un patron de conception utilisé en génie logiciel qui vise à "découpler une abstraction de sa +> mise en œuvre(son implémention) de manière à ce que les deux puissent varier de manière indépendante" + +**Exemple de programme** + +Servons nous de notre exemple d'arme ci-dessus. Nous avons ici la hiérarchie `Weapon` : + +```java +public interface Weapon { + void wield(); + void swing(); + void unwield(); + Enchantment getEnchantment(); +} + +public class Sword implements Weapon { + + private final Enchantment enchantment; + + public Sword(Enchantment enchantment) { + this.enchantment = enchantment; + } + + @Override + public void wield() { + LOGGER.info("The sword is wielded."); + enchantment.onActivate(); + } + + @Override + public void swing() { + LOGGER.info("The sword is swinged."); + enchantment.apply(); + } + + @Override + public void unwield() { + LOGGER.info("The sword is unwielded."); + enchantment.onDeactivate(); + } + + @Override + public Enchantment getEnchantment() { + return enchantment; + } +} + +public class Hammer implements Weapon { + + private final Enchantment enchantment; + + public Hammer(Enchantment enchantment) { + this.enchantment = enchantment; + } + + @Override + public void wield() { + LOGGER.info("The hammer is wielded."); + enchantment.onActivate(); + } + + @Override + public void swing() { + LOGGER.info("The hammer is swinged."); + enchantment.apply(); + } + + @Override + public void unwield() { + LOGGER.info("The hammer is unwielded."); + enchantment.onDeactivate(); + } + + @Override + public Enchantment getEnchantment() { + return enchantment; + } +} +``` + +Voici la hiérarchie des enchantements distincts : + +```java +public interface Enchantment { + void onActivate(); + void apply(); + void onDeactivate(); +} + +public class FlyingEnchantment implements Enchantment { + + @Override + public void onActivate() { + LOGGER.info("The item begins to glow faintly."); + } + + @Override + public void apply() { + LOGGER.info("The item flies and strikes the enemies finally returning to owner's hand."); + } + + @Override + public void onDeactivate() { + LOGGER.info("The item's glow fades."); + } +} + +public class SoulEatingEnchantment implements Enchantment { + + @Override + public void onActivate() { + LOGGER.info("The item spreads bloodlust."); + } + + @Override + public void apply() { + LOGGER.info("The item eats the soul of enemies."); + } + + @Override + public void onDeactivate() { + LOGGER.info("Bloodlust slowly disappears."); + } +} +``` + +Voici les deux hiérarchies en action : + +```java +LOGGER.info("The knight receives an enchanted sword."); +var enchantedSword = new Sword(new SoulEatingEnchantment()); +enchantedSword.wield(); +enchantedSword.swing(); +enchantedSword.unwield(); + +LOGGER.info("The valkyrie receives an enchanted hammer."); +var hammer = new Hammer(new FlyingEnchantment()); +hammer.wield(); +hammer.swing(); +hammer.unwield(); +``` + +Voici la sortie de la console. + +``` +The knight receives an enchanted sword. +The sword is wielded. +The item spreads bloodlust. +The sword is swung. +The item eats the soul of enemies. +The sword is unwielded. +Bloodlust slowly disappears. +The valkyrie receives an enchanted hammer. +The hammer is wielded. +The item begins to glow faintly. +The hammer is swung. +The item flies and strikes the enemies finally returning to owner's hand. +The hammer is unwielded. +The item's glow fades. +``` + +## Diagramme de classes + +![alt text](../../../bridge/etc/bridge.urm.png "Bridge class diagram") + +## Application + +Utilisez Bridge pattern lorsque + +* Vous souhaitez éviter un lien permanent entre une abstraction et son implémentation. Cela peut être le cas, par exemple, lorsque l'implémentation doit être sélectionnée ou changée au moment de l'exécution. +* Les abstractions et leurs implémentations doivent être extensibles par des classes filles. Dans ce cas, Bridge pattern vous permet de combiner les différentes abstractions et implémentations et de les étendre indépendamment. +* Les changements dans l'implémentation d'une abstraction ne doivent pas avoir d'impact sur les clients, c'est-à-dire que leur code ne doit pas être recompilé. +* Vous avez une prolifération de classes. Une telle hiérarchie de classes indique la nécessité de diviser un objet en deux parties. Rumbaugh utilise le terme de "généralisations imbriquées" pour désigner de telles hiérarchies de classes. +* Vous souhaitez partager une implémentation entre plusieurs objets (peut-être en utilisant le comptage de références), et ce fait doit être caché au client. Un exemple simple est la classe String de Coplien, dans laquelle plusieurs objets peuvent partager la même représentation d'une chaîne de caractères. + +## Tutoriel + +* [Bridge Pattern Tutorial](https://www.journaldev.com/1491/bridge-design-pattern-java) + +## Crédits + +* [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: 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) From d4d428f98a443e12faa3f070753dc511aa503ee0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 27 Jan 2024 13:21:23 +0200 Subject: [PATCH 014/763] 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> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index b758be965f26..0836d4cec168 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2863,6 +2863,15 @@ "contributions": [ "code" ] + }, + { + "login": "bachbil", + "name": "believe", + "avatar_url": "https://avatars.githubusercontent.com/u/28935461?v=4", + "profile": "https://github.com/bachbil", + "contributions": [ + "translation" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 99e39ef2f144..f97fe9181f20 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![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) -[![All Contributors](https://img.shields.io/badge/all_contributors-314-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-315-orange.svg?style=flat-square)](#contributors-)
@@ -478,6 +478,7 @@ This project is licensed under the terms of the MIT license. Chant3ll3
Chant3ll3

📖 🌍 YongHwan Kwon
YongHwan Kwon

💻 Jakub Klimek
Jakub Klimek

💻 + believe
believe

🌍 From 88b4cbc008234c5718437072b006fba333692804 Mon Sep 17 00:00:00 2001 From: jnniu-n <141746282+jnniu-n@users.noreply.github.com> Date: Sat, 10 Feb 2024 19:51:45 +1100 Subject: [PATCH 015/763] docs: Update module pattern README.md (#2753) Update README.md for Module --- module/README.md | 141 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) diff --git a/module/README.md b/module/README.md index c01d3548936a..2372445512cd 100644 --- a/module/README.md +++ b/module/README.md @@ -9,6 +9,147 @@ tag: ## Intent Module pattern is used to implement the concept of software modules, defined by modular programming, in a programming language with incomplete direct support for the concept. +## Explanation + +Real-world example + +> In a bustling software city, different software components such as Database, UI, and API often need to collaborate. Instead of each component directly talking with every other, they rely on the module manager. This module manager acts like a central marketplace, where each component registers its services and requests for others. This ensures that components remain decoupled, and changes to one don't ripple throughout the system. + + +> Imagine a modern smartphone. It has different apps like messaging, camera, and music player. While each app functions independently, they sometimes need shared resources like access to contacts or storage. Instead of every app having its unique way to access these resources, they use the phone's built-in modules, like the Contacts module or the Storage module. This ensures a consistent experience for the user and avoids potential clashes between apps. + +In plain words + +> The Module pattern encapsulates related functions and data into a single unit, allowing for organized and manageable software components. + +Wikipedia says + +> In software engineering, the module pattern is a design pattern used to implement the concept of software modules, defined by modular programming, in a programming language with incomplete direct support for the concept. + +> This pattern can be implemented in several ways depending on the host programming language, such as the singleton design pattern, object-oriented static members in a class and procedural global functions. In Python, the pattern is built into the language, and each .py file is automatically a module. The same applies to Ada, where the package can be considered a module (similar to a static class). + +**Programmatic Example** + +```java +//Define Logger abstract class +abstract class Logger { + protected String output; + protected String error; + + public abstract void prepare(); + public abstract void unprepare(); + public abstract void printString(String message); + public abstract void printErrorString(String errorMessage); +} + +//File log module +class FileLoggerModule extends Logger { + private static final String OUTPUT_FILE = "output.log"; + private static final String ERROR_FILE = "error.log"; + + private static FileLoggerModule instance; + + private FileLoggerModule() { + this.output = OUTPUT_FILE; + this.error = ERROR_FILE; + } + + public static FileLoggerModule getSingleton() { + if (instance == null) { + instance = new FileLoggerModule(); + } + return instance; + } + + @Override + public void prepare() { + // For example, open file operation + // add the action you want + } + + @Override + public void unprepare() { + // For example, close file operation + // add the action you want + } + + @Override + public void printString(String message) { + System.out.println("Writing to " + output + ": " + message); + } + + @Override + public void printErrorString(String errorMessage) { + System.out.println("Writing to " + error + ": " + errorMessage); + } +} + +//Console log module +class ConsoleLoggerModule extends Logger { + private static ConsoleLoggerModule instance; + + private ConsoleLoggerModule() {} + + public static ConsoleLoggerModule getSingleton() { + if (instance == null) { + instance = new ConsoleLoggerModule(); + } + return instance; + } + + @Override + public void prepare() { + //Initialize console operation + } + + @Override + public void unprepare() { + //End console operation + } + + @Override + public void printString(String message) { + System.out.println("Console Output: " + message); + } + + @Override + public void printErrorString(String errorMessage) { + System.err.println("Console Error: " + errorMessage); + } +} + + +public class App { + public void prepare() { + FileLoggerModule.getSingleton().prepare(); + ConsoleLoggerModule.getSingleton().prepare(); + } + + public void unprepare() { + FileLoggerModule.getSingleton().unprepare(); + ConsoleLoggerModule.getSingleton().unprepare(); + } + + public void execute(String message) { + FileLoggerModule.getSingleton().printString(message); + ConsoleLoggerModule.getSingleton().printString(message); + } + + public static void main(String[] args) { + App app = new App(); + app.prepare(); + app.execute("Hello, Module Pattern!"); + app.unprepare(); + } +} +``` + +Programme outputs: +``` +Writing to output.log: Hello, Module Pattern! +Console Output: Hello, Module Pattern! +``` + ## Class diagram ![alt text](./etc/module.png "Module") From c2709c445b4426107fe7f6fddcc0a1ee40ed89fe Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 10 Feb 2024 10:52:27 +0200 Subject: [PATCH 016/763] 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> --- .all-contributorsrc | 3 ++- README.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0836d4cec168..e2f17ce3bf0e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2759,7 +2759,8 @@ "avatar_url": "https://avatars.githubusercontent.com/u/141746282?v=4", "profile": "https://github.com/jnniu-n", "contributions": [ - "translation" + "translation", + "doc" ] }, { diff --git a/README.md b/README.md index f97fe9181f20..0a120b74a2e2 100644 --- a/README.md +++ b/README.md @@ -464,7 +464,7 @@ This project is licensed under the terms of the MIT license. Yennifer Herrera
Yennifer Herrera

🌍 👀 - jnniu-n
jnniu-n

🌍 + jnniu-n
jnniu-n

🌍 📖 Miguel Angel Perez Garcia
Miguel Angel Perez Garcia

👀 🌍 Suwan Sankaja
Suwan Sankaja

🌍 alok
alok

📖 From 803a2624f6249cbf7ae4322e5d7b0a05dea52084 Mon Sep 17 00:00:00 2001 From: jnniu-n <141746282+jnniu-n@users.noreply.github.com> Date: Sat, 10 Feb 2024 19:54:02 +1100 Subject: [PATCH 017/763] docs: Update property pattern README.md (#2745) Finish Readme.md for Property --- property/README.md | 108 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/property/README.md b/property/README.md index 624c1e7d7bf2..19fe9c90ea69 100644 --- a/property/README.md +++ b/property/README.md @@ -10,6 +10,114 @@ tag: Create hierarchy of objects and new objects using already existing objects as parents. +## Explanation + +Real-world example + +> In the mystical land of "Elandria", adventurers can harness the power of ancient relics to customize their abilities. Each relic represents a unique property or skill. As adventurers explore, they discover and integrate new relics, dynamically enhancing their skills based on the relics they possess. + +> Consider a modern software used in designing and customizing smartphones. Designers can choose from a variety of components such as processor type, camera specs, battery capacity, and more. Each component represents a property of the smartphone. As technology evolves and new components become available, designers can seamlessly add or replace properties to create a unique smartphone configuration without redefining the core design structure. + +In plain words + +> Define and manage a dynamic set of properties for an object, allowing customization without altering its structure. + +**Programmatic Example** +```java +import java.util.HashMap; +import java.util.Map; + +// Enumeration for possible properties or statistics a character can have +enum Stats { + AGILITY, ATTACK_POWER, ARMOR, INTELLECT, SPIRIT, FURY, RAGE; +} + +// Enumeration for different types or classes of characters +enum Type { + WARRIOR, MAGE, ROGUE; +} + +// Interface defining prototype operations on a character +interface Prototype { + Integer get(Stats stat); + boolean has(Stats stat); + void set(Stats stat, Integer value); + void remove(Stats stat); +} + +// Implementation of the Character class +class Character implements Prototype { + private String name; + private Type type; + private Map properties = new HashMap<>(); + + public Character() {} + + public Character(Type type, Prototype prototype) { + this.type = type; + for (Stats stat : Stats.values()) { + if (prototype.has(stat)) { + this.set(stat, prototype.get(stat)); + } + } + } + + public Character(String name, Type type) { + this.name = name; + this.type = type; + } + + @Override + public Integer get(Stats stat) { + return properties.get(stat); + } + + @Override + public boolean has(Stats stat) { + return properties.containsKey(stat); + } + + @Override + public void set(Stats stat, Integer value) { + properties.put(stat, value); + } + + @Override + public void remove(Stats stat) { + properties.remove(stat); + } + + @Override + public String toString() { + return "Character{name='" + name + "', type=" + type + ", properties=" + properties + '}'; + } +} + +// Main class to demonstrate the pattern +public class PropertyPatternDemo { + public static void main(String[] args) { + // Create a prototype character + Character prototypeWarrior = new Character("Proto Warrior", Type.WARRIOR); + prototypeWarrior.set(Stats.ATTACK_POWER, 10); + prototypeWarrior.set(Stats.ARMOR, 15); + + // Create a new character using the prototype + Character newWarrior = new Character(Type.WARRIOR, prototypeWarrior); + newWarrior.set(Stats.AGILITY, 5); + + System.out.println(prototypeWarrior); + System.out.println(newWarrior); + } +} +``` + +Program output: + +``` +Character{name='Proto Warrior', type=WARRIOR, properties={ARMOR=15, ATTACK_POWER=10}} +Character{name='null', type=WARRIOR, properties={ARMOR=15, AGILITY=5, ATTACK_POWER=10}} +``` + ## Class diagram ![alt text](./etc/property.png "Property") From 8c316e75fe00dcb2a794c44d2e2a938a20b227d7 Mon Sep 17 00:00:00 2001 From: egg0102030405 <59650695+egg0102030405@users.noreply.github.com> Date: Sat, 10 Feb 2024 19:57:36 +1100 Subject: [PATCH 018/763] 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 --- localization/zh/step-builder/README.md | 24 +++ .../zh/step-builder/etc/step-builder.png | Bin 0 -> 76038 bytes localization/zh/table-module/README.md | 135 ++++++++++++ .../zh/table-module/etc/table-module.urm.png | Bin 0 -> 77337 bytes localization/zh/unit-of-work/README.md | 203 ++++++++++++++++++ .../zh/unit-of-work/etc/unit-of-work.urm.png | Bin 0 -> 40804 bytes localization/zh/update-method/README.md | 36 ++++ .../update-method/etc/update-method.urm.png | Bin 0 -> 39843 bytes localization/zh/value-object/README.md | 96 +++++++++ .../zh/value-object/etc/value-object.png | Bin 0 -> 5025 bytes 10 files changed, 494 insertions(+) create mode 100644 localization/zh/step-builder/README.md create mode 100644 localization/zh/step-builder/etc/step-builder.png create mode 100644 localization/zh/table-module/README.md create mode 100644 localization/zh/table-module/etc/table-module.urm.png create mode 100644 localization/zh/unit-of-work/README.md create mode 100644 localization/zh/unit-of-work/etc/unit-of-work.urm.png create mode 100644 localization/zh/update-method/README.md create mode 100644 localization/zh/update-method/etc/update-method.urm.png create mode 100644 localization/zh/value-object/README.md create mode 100644 localization/zh/value-object/etc/value-object.png diff --git a/localization/zh/step-builder/README.md b/localization/zh/step-builder/README.md new file mode 100644 index 000000000000..5e27f6f1d071 --- /dev/null +++ b/localization/zh/step-builder/README.md @@ -0,0 +1,24 @@ +--- +title: Step Builder +category: Creational +language: zn +tag: + - Instantiation +--- + +## 又被称为 +分步构建 + +## 目的 +这是构建者模式的一个扩展,完全指导用户创建对象,没有混淆的机会。 +用户体验会大大提升,因为他只能看到下一个步骤的方法,直到适当的时机才会出现构建对象的“build”方法。 + +## 类图 +![alt text](./etc/step-builder.png "Step Builder") + +## 应用 +使用分布构建模式当创建复杂对象的算法需要独立于组成对象的部分以及它们的组装方式,且构造过程必须允许对象有不同的表示形式,并且在此过程中顺序很重要时。 + +## 鸣谢 + +* [Marco Castigliego - Step Builder](http://rdafbn.blogspot.co.uk/2012/07/step-builder-pattern_28.html) diff --git a/localization/zh/step-builder/etc/step-builder.png b/localization/zh/step-builder/etc/step-builder.png new file mode 100644 index 0000000000000000000000000000000000000000..b7b623657c589b4cf18160ec268733a3a16f69c2 GIT binary patch literal 76038 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 当处理一个用户系统时,我们需要在用户表上进行一些操作。在这种情况下,我们可以使用表模块模式。我们可以创建一个名为 UserTableModule 的类,并初始化该类的一个实例,来处理用户表中所有行的业务逻辑。 + +直白点说 + +> 一个单独的实例,处理数据库表或视图中所有行的业务逻辑。 + +**编程实例** + +在用户系统的示例中,我们需要处理用户登录和用户注册的域逻辑。我们可以使用表模块模式,并创建UserTableModule类的一个实例来处理用户表中所有行的业务逻辑。 + +以下是基本的User实体。 + +```java +@Setter +@Getter +@ToString +@EqualsAndHashCode +@AllArgsConstructor +public class User { + private int id; + private String username; + private String password; +} +``` + +下面的是 `UserTableModule` 类. + +```java +public class UserTableModule { + private final DataSource dataSource; + private Connection connection = null; + private ResultSet resultSet = null; + private PreparedStatement preparedStatement = null; + + public UserTableModule(final DataSource userDataSource) { + this.dataSource = userDataSource; + } + + /** + * Login using username and password. + * + * @param username the username of a user + * @param password the password of a user + * @return the execution result of the method + * @throws SQLException if any error + */ + public int login(final String username, final String password) throws SQLException { + // Method implementation. + + } + + /** + * Register a new user. + * + * @param user a user instance + * @return the execution result of the method + * @throws SQLException if any error + */ + public int registerUser(final User user) throws SQLException { + // Method implementation. + } +} +``` + +在App类中,我们使用UserTableModule的一个实例来处理用户登录和注册。 + +```java +// Create data source and create the user table. +final var dataSource = createDataSource(); +createSchema(dataSource); +userTableModule = new UserTableModule(dataSource); + +//Initialize two users. +var user1 = new User(1, "123456", "123456"); +var user2 = new User(2, "test", "password"); + +//Login and register using the instance of userTableModule. +userTableModule.registerUser(user1); +userTableModule.login(user1.getUsername(), user1.getPassword()); +userTableModule.login(user2.getUsername(), user2.getPassword()); +userTableModule.registerUser(user2); +userTableModule.login(user2.getUsername(), user2.getPassword()); + +deleteSchema(dataSource); +``` + +程序输出: + +```java +12:22:13.095 [main] INFO com.iluwatar.tablemodule.UserTableModule - Register successfully! +12:22:13.117 [main] INFO com.iluwatar.tablemodule.UserTableModule - Login successfully! +12:22:13.128 [main] INFO com.iluwatar.tablemodule.UserTableModule - Fail to login! +12:22:13.136 [main] INFO com.iluwatar.tablemodule.UserTableModule - Register successfully! +12:22:13.144 [main] INFO com.iluwatar.tablemodule.UserTableModule - Login successfully! +``` + +## 类图 + +![](etc/table-module.urm.png "table module") + +## 应用 +使用表模块模式当: + +- 域逻辑简单且数据呈表格形式。 +- 应用程序仅使用少量共享的常见的面向表格的数据结构。 + +## 教学 + +- [Transaction Script](https://java-design-patterns.com/patterns/transaction-script/) + +- [Domain Model](https://java-design-patterns.com/patterns/domain-model/) + +## 鸣谢 + +* [Table Module Pattern](http://wiki3.cosc.canterbury.ac.nz/index.php/Table_module_pattern) +* [Patterns of Enterprise Application Architecture](https://www.amazon.com/gp/product/0321127420/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0321127420&linkId=18acc13ba60d66690009505577c45c04) +* [Architecture patterns: domain model and friends](https://inviqa.com/blog/architecture-patterns-domain-model-and-friends) \ No newline at end of file diff --git a/localization/zh/table-module/etc/table-module.urm.png b/localization/zh/table-module/etc/table-module.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4bc0b189dba5c86aeddf9235946135019added GIT binary patch literal 77337 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 literal 0 HcmV?d00001 diff --git a/localization/zh/unit-of-work/README.md b/localization/zh/unit-of-work/README.md new file mode 100644 index 000000000000..a957390e824f --- /dev/null +++ b/localization/zh/unit-of-work/README.md @@ -0,0 +1,203 @@ +--- +title: Unit Of Work +category: Architectural +language: zn +tag: + - Data access + - Performance +--- + +## 又被称为 +工作单元 + +## 目的 + +当一个业务事务完成时,所有的更新都作为一个大的工作单元一次性发送,以最小化数据库的往返次数进行持久化。 + +## 解释 + +现实世界例子 + +> 武器商人拥有一个包含武器信息的数据库。 +> 全城的商贩们都在不断地更新这些信息,这导致数据库服务器的负载很高。 +> 为了使负载更易于管理,我们应用了工作单元模式,将许多小的更新批量发送。 + +用直白的话来说 + +> 工作单元将许多小的数据库更新合并成一个批次。 +> 以优化往返次数。 + +[MartinFowler.com](https://martinfowler.com/eaaCatalog/unitOfWork.html) 中说 + +> 维护一个受业务事务影响的对象列表。 +> 并协调写出更改和解决并发问题。 + +**编程样例** + +以下是要持久化到数据库中的 `Weapon` 的实体。 + +```java +@Getter +@RequiredArgsConstructor +public class Weapon { + private final Integer id; + private final String name; +} +``` + +实现的核心是 `ArmsDealer` 实现了工作单元模式。 +它维护了一个需要完成的数据库操作映射 (`context`) 当调用 `commit` 时 +它会一次性批量应用这些操作。 + +```java +public interface IUnitOfWork { + + String INSERT = "INSERT"; + String DELETE = "DELETE"; + String MODIFY = "MODIFY"; + + void registerNew(T entity); + + void registerModified(T entity); + + void registerDeleted(T entity); + + void commit(); +} + +@Slf4j +@RequiredArgsConstructor +public class ArmsDealer implements IUnitOfWork { + + private final Map> context; + private final WeaponDatabase weaponDatabase; + + @Override + public void registerNew(Weapon weapon) { + LOGGER.info("Registering {} for insert in context.", weapon.getName()); + register(weapon, UnitActions.INSERT.getActionValue()); + } + + @Override + public void registerModified(Weapon weapon) { + LOGGER.info("Registering {} for modify in context.", weapon.getName()); + register(weapon, UnitActions.MODIFY.getActionValue()); + + } + + @Override + public void registerDeleted(Weapon weapon) { + LOGGER.info("Registering {} for delete in context.", weapon.getName()); + register(weapon, UnitActions.DELETE.getActionValue()); + } + + private void register(Weapon weapon, String operation) { + var weaponsToOperate = context.get(operation); + if (weaponsToOperate == null) { + weaponsToOperate = new ArrayList<>(); + } + weaponsToOperate.add(weapon); + context.put(operation, weaponsToOperate); + } + + /** + * All UnitOfWork operations are batched and executed together on commit only. + */ + @Override + public void commit() { + if (context == null || context.size() == 0) { + return; + } + LOGGER.info("Commit started"); + if (context.containsKey(UnitActions.INSERT.getActionValue())) { + commitInsert(); + } + + if (context.containsKey(UnitActions.MODIFY.getActionValue())) { + commitModify(); + } + if (context.containsKey(UnitActions.DELETE.getActionValue())) { + commitDelete(); + } + LOGGER.info("Commit finished."); + } + + private void commitInsert() { + var weaponsToBeInserted = context.get(UnitActions.INSERT.getActionValue()); + for (var weapon : weaponsToBeInserted) { + LOGGER.info("Inserting a new weapon {} to sales rack.", weapon.getName()); + weaponDatabase.insert(weapon); + } + } + + private void commitModify() { + var modifiedWeapons = context.get(UnitActions.MODIFY.getActionValue()); + for (var weapon : modifiedWeapons) { + LOGGER.info("Scheduling {} for modification work.", weapon.getName()); + weaponDatabase.modify(weapon); + } + } + + private void commitDelete() { + var deletedWeapons = context.get(UnitActions.DELETE.getActionValue()); + for (var weapon : deletedWeapons) { + LOGGER.info("Scrapping {}.", weapon.getName()); + weaponDatabase.delete(weapon); + } + } +} +``` + +以下描述了整个应用是如何组装起来的。 + +```java +// create some weapons +var enchantedHammer = new Weapon(1, "enchanted hammer"); +var brokenGreatSword = new Weapon(2, "broken great sword"); +var silverTrident = new Weapon(3, "silver trident"); + +// create repository +var weaponRepository = new ArmsDealer(new HashMap>(), new WeaponDatabase()); + +// perform operations on the weapons +weaponRepository.registerNew(enchantedHammer); +weaponRepository.registerModified(silverTrident); +weaponRepository.registerDeleted(brokenGreatSword); +weaponRepository.commit(); +``` + +以下是控制台输出。 + +``` +21:39:21.984 [main] INFO com.iluwatar.unitofwork.ArmsDealer - Registering enchanted hammer for insert in context. +21:39:21.989 [main] INFO com.iluwatar.unitofwork.ArmsDealer - Registering silver trident for modify in context. +21:39:21.989 [main] INFO com.iluwatar.unitofwork.ArmsDealer - Registering broken great sword for delete in context. +21:39:21.989 [main] INFO com.iluwatar.unitofwork.ArmsDealer - Commit started +21:39:21.989 [main] INFO com.iluwatar.unitofwork.ArmsDealer - Inserting a new weapon enchanted hammer to sales rack. +21:39:21.989 [main] INFO com.iluwatar.unitofwork.ArmsDealer - Scheduling silver trident for modification work. +21:39:21.989 [main] INFO com.iluwatar.unitofwork.ArmsDealer - Scrapping broken great sword. +21:39:21.989 [main] INFO com.iluwatar.unitofwork.ArmsDealer - Commit finished. +``` + +## 类图 + +![alt text](./etc/unit-of-work.urm.png "unit-of-work") + +## 应用 + +在以下情况时使用单元模式 + +* 为了优化数据库事务所需的时间。 +* 作为工作单元将更改发送到数据库,确保事务的原子性。 +* 为了减少数据库调用的次数。 + +## 教程 + +* [Repository and Unit of Work Pattern](https://www.programmingwithwolfgang.com/repository-and-unit-of-work-pattern/) +* [Unit of Work - a Design Pattern](https://mono.software/2017/01/13/unit-of-work-a-design-pattern/) + +## 鸣谢 + +* [Design Pattern - Unit Of Work Pattern](https://www.codeproject.com/Articles/581487/Unit-of-Work-Design-Pattern) +* [Unit Of Work](https://martinfowler.com/eaaCatalog/unitOfWork.html) +* [Patterns of Enterprise Application Architecture](https://www.amazon.com/gp/product/0321127420/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321127420&linkCode=as2&tag=javadesignpat-20&linkId=d9f7d37b032ca6e96253562d075fcc4a) diff --git a/localization/zh/unit-of-work/etc/unit-of-work.urm.png b/localization/zh/unit-of-work/etc/unit-of-work.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..bb192af544775ca7e761292cdd7e127312c468f1 GIT binary patch literal 40804 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 在一个角色扮演游戏中,有一个用于英雄属性统计的类。 +> 这些统计属性包括力量、智慧和运气等特征。 +> 当所有的属性都相同时,不同英雄的统计数据应被认为是相等的。 + +用直白的话来说 + +> 当值对象的属性有相同的值时,它们是相等的。 + +维基百科中说 + +> 在计算机科学中,值对象是一个代表简单实体的小对象。 +> 其相等性不是基于身份的:即当两个值对象有相同的值的时候。 +> 它们是相等的,而不必要是同一个对象。 + +**编程样例** + +这里是作为值对象的 `HeroStat` 类。 请注意使用了 +[Lombok's `@Value`](https://projectlombok.org/features/Value) 注解。 + +```java +@Value(staticConstructor = "valueOf") +class HeroStat { + + int strength; + int intelligence; + int luck; +} +``` + +这个示例创建了三个不同的 `HeroStat`s 并比较了它们的相等性。 + +```java +var statA = HeroStat.valueOf(10, 5, 0); +var statB = HeroStat.valueOf(10, 5, 0); +var statC = HeroStat.valueOf(5, 1, 8); + +LOGGER.info(statA.toString()); +LOGGER.info(statB.toString()); +LOGGER.info(statC.toString()); + +LOGGER.info("Is statA and statB equal : {}", statA.equals(statB)); +LOGGER.info("Is statA and statC equal : {}", statA.equals(statC)); +``` + +以下是控制台的输出。 + +``` +20:11:12.199 [main] INFO com.iluwatar.value.object.App - HeroStat(strength=10, intelligence=5, luck=0) +20:11:12.202 [main] INFO com.iluwatar.value.object.App - HeroStat(strength=10, intelligence=5, luck=0) +20:11:12.202 [main] INFO com.iluwatar.value.object.App - HeroStat(strength=5, intelligence=1, luck=8) +20:11:12.202 [main] INFO com.iluwatar.value.object.App - Is statA and statB equal : true +20:11:12.203 [main] INFO com.iluwatar.value.object.App - Is statA and statC equal : false +``` + +## 类图 + +![alt text](./etc/value-object.png "Value Object") + +## 应用 + +当满足以下情况时,使用值对象: + +* 对象的相等性需要基于对象的值 + +## 现实世界的案例 + +* [java.util.Optional](https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html) +* [java.time.LocalDate](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html) +* [joda-time, money, beans](http://www.joda.org/) + +## 鸣谢 + +* [Patterns of Enterprise Application Architecture](http://www.martinfowler.com/books/eaa.html) +* [ValueObject](https://martinfowler.com/bliki/ValueObject.html) +* [VALJOs - Value Java Objects : Stephen Colebourne's blog](http://blog.joda.org/2014/03/valjos-value-java-objects.html) +* [Value Object : Wikipedia](https://en.wikipedia.org/wiki/Value_object) +* [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=f27d2644fbe5026ea448791a8ad09c94) diff --git a/localization/zh/value-object/etc/value-object.png b/localization/zh/value-object/etc/value-object.png new file mode 100644 index 0000000000000000000000000000000000000000..69a244c80691b8ac63ed5b732b8b0828c592a1f8 GIT binary patch literal 5025 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 literal 0 HcmV?d00001 From f5747d85f1f7731531dcd91c6f57ea3b392ef4db Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 10 Feb 2024 10:58:37 +0200 Subject: [PATCH 019/763] 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> --- .all-contributorsrc | 9 +++++++++ README.md | 5 ++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index e2f17ce3bf0e..1688969c9199 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2873,6 +2873,15 @@ "contributions": [ "translation" ] + }, + { + "login": "egg0102030405", + "name": "egg0102030405", + "avatar_url": "https://avatars.githubusercontent.com/u/59650695?v=4", + "profile": "https://github.com/egg0102030405", + "contributions": [ + "translation" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 0a120b74a2e2..75591f8d9b27 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![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) -[![All Contributors](https://img.shields.io/badge/all_contributors-315-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-316-orange.svg?style=flat-square)](#contributors-)
    @@ -480,6 +480,9 @@ This project is licensed under the terms of the MIT license.
    Jakub Klimek
    Jakub Klimek

    💻 believe
    believe

    🌍 + + egg0102030405
    egg0102030405

    🌍 + From 45758792647b0a9f39bc5d7f90277aa0da5fac09 Mon Sep 17 00:00:00 2001 From: egg0102030405 <59650695+egg0102030405@users.noreply.github.com> Date: Sat, 10 Feb 2024 19:59:37 +1100 Subject: [PATCH 020/763] 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 --- guarded-suspension/README.md | 72 ++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/guarded-suspension/README.md b/guarded-suspension/README.md index 8cd64aae11da..9dc39f2c23f5 100644 --- a/guarded-suspension/README.md +++ b/guarded-suspension/README.md @@ -15,6 +15,78 @@ Use Guarded suspension pattern to handle a situation when you want to execute a ## Applicability Use Guarded Suspension pattern when the developer knows that the method execution will be blocked for a finite period of time +## Explanation + +Real world example + +> When we reserve a dining room online and arrive to find it unready, the manager has it cleaned while we wait. +> Once ready, we're escorted to the room. This process exemplifies the Guarded Suspension pattern. + +In plain words + +> Guarded Suspension pattern is used when one thread waits for the result of another thread's execution. + +Wikipedia says + +> In concurrent programming, Guarded Suspension manages operations requiring a lock +> and a precondition, delaying execution until the precondition is met. + +**Programmatic Example** + +The `GuardedQueue` class encapsulates a queue, and provides two synchronized methods, `get` and `put`. +The `get` method waits if the queue is empty, and the `put` method adds an item to the queue and notifies waiting threads: + +```java +public class GuardedQueue { +private final Queue sourceList = new LinkedList<>(); + + public synchronized Integer get() { + while (sourceList.isEmpty()) { + try { + wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + return sourceList.peek(); + } + + public synchronized void put(Integer e) { + sourceList.add(e); + notify(); + } +} + +public class App { +public static void main(String[] args) { +GuardedQueue guardedQueue = new GuardedQueue(); +ExecutorService executorService = Executors.newFixedThreadPool(3); + + // Here we create the first thread which is supposed to get from guardedQueue + executorService.execute(guardedQueue::get); + + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + // Here we create the second thread which is supposed to put to guardedQueue + executorService.execute(() -> { + guardedQueue.put(20); + }); + + executorService.shutdown(); + try { + executorService.awaitTermination(30, TimeUnit.SECONDS); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} +``` + + ## Related patterns * Balking From 93112da51c285311a2f5fa103235dc805f12bb97 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 10 Feb 2024 11:00:17 +0200 Subject: [PATCH 021/763] 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> --- .all-contributorsrc | 3 ++- README.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 1688969c9199..954742e98f61 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2880,7 +2880,8 @@ "avatar_url": "https://avatars.githubusercontent.com/u/59650695?v=4", "profile": "https://github.com/egg0102030405", "contributions": [ - "translation" + "translation", + "doc" ] } ], diff --git a/README.md b/README.md index 75591f8d9b27..ec418d8ae19c 100644 --- a/README.md +++ b/README.md @@ -481,7 +481,7 @@ This project is licensed under the terms of the MIT license. believe
    believe

    🌍 - egg0102030405
    egg0102030405

    🌍 + egg0102030405
    egg0102030405

    🌍 📖 From b994d9a70d62f10bcbf7535e180e5a2c34c64707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 11 Feb 2024 10:32:26 +0200 Subject: [PATCH 022/763] fix: Fix health-check page rendering error on the website --- health-check/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/health-check/README.md b/health-check/README.md index afb6117bdb73..6543c092ea3c 100644 --- a/health-check/README.md +++ b/health-check/README.md @@ -19,7 +19,8 @@ To ensure the stability and resilience of services in a microservices architectu ## Explanation In microservices architecture, it's critical to continuously check the health of individual services. The Health Check Pattern is a mechanism for microservices to expose their health status. This pattern is implemented by including a health check endpoint in microservices that returns the service's current state. This is vital for maintaining system resilience and operational readiness. -

    For more information, see the Health Check API pattern on [Microservices.io](https://microservices.io/patterns/observability/health-check-api.html). + +For more information, see the Health Check API pattern on [Microservices.io](https://microservices.io/patterns/observability/health-check-api.html). ## Real World Example From 8d74b3eb40ee0af2b310c25fe73597000e500e46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 11 Feb 2024 17:07:22 +0200 Subject: [PATCH 023/763] docs: Abstract Document readme improvements --- abstract-document/README.md | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/abstract-document/README.md b/abstract-document/README.md index fddb12c6a883..bd5fad346fd4 100644 --- a/abstract-document/README.md +++ b/abstract-document/README.md @@ -3,13 +3,16 @@ title: Abstract Document category: Structural language: en tag: - - Extensibility + - Abstraction + - Extensibility + - Decoupling --- ## Intent -The "Abstract Document" design pattern is a structural design pattern that aims to provide a consistent way to handle -hierarchical and tree-like data structures by defining a common interface for various document types. +The Abstract Document design pattern is a structural design pattern that aims to provide 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. ## Explanation @@ -194,13 +197,38 @@ 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. +* Documents have diverse and evolving attribute structures. + +* Dynamically adding new properties is a common requirement. + +* Decoupling data access from specific formats is crucial. + +* 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 + +* 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. + ## Credits * [Wikipedia: Abstract Document Pattern](https://en.wikipedia.org/wiki/Abstract_Document_Pattern) * [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) +* [Pattern-Oriented Software Architecture Volume 4: A Pattern Language for Distributed Computing (v. 4)](https://amzn.to/49zRP4R) From 6f8a95debd4d06f31c309f10880af5706a3d3421 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 11 Feb 2024 17:24:23 +0200 Subject: [PATCH 024/763] docs: update abstract document readme --- abstract-document/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/abstract-document/README.md b/abstract-document/README.md index bd5fad346fd4..09d1d273283e 100644 --- a/abstract-document/README.md +++ b/abstract-document/README.md @@ -210,7 +210,9 @@ types of documents or entities with shared and distinct attributes. By defining across various document types, you can achieve a more organized and consistent approach to handling complex data structures. -## Benefits +## Consequences + +Benefits * Flexibility: Accommodates varied document structures and properties. @@ -220,8 +222,7 @@ structures. * Reusability: Typed views enable code reuse for accessing specific attribute types. - -## Trade-offs +Trade-offs * Complexity: Requires defining interfaces and views, adding implementation overhead. From a1f527eb2842ce51ac3007bca536f8810d616dc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 11 Feb 2024 17:45:06 +0200 Subject: [PATCH 025/763] docs: update abstract factory --- abstract-factory/README.md | 39 ++++++++++++++----- .../com/iluwatar/abstractfactory/App.java | 6 +-- .../com/iluwatar/abstractfactory/Kingdom.java | 1 - 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/abstract-factory/README.md b/abstract-factory/README.md index 3d2e1a2c6087..906f243fe5c4 100644 --- a/abstract-factory/README.md +++ b/abstract-factory/README.md @@ -3,6 +3,8 @@ title: Abstract Factory category: Creational language: en tag: + - Abstraction + - Decoupling - Gang of Four --- @@ -12,22 +14,27 @@ Kit ## Intent -Provide an interface for creating families of related or dependent -objects without specifying their concrete classes. +The Abstract Factory design pattern provides a way to create families of related objects without specifying their +concrete classes. This allows for code that is independent of the specific classes of objects it uses, promoting +flexibility and maintainability. ## Explanation 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. +> 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. In plain words -> A factory of factories; a factory that groups the individual but related/dependent factories together without specifying their concrete classes. +> A factory of factories; a factory that groups the individual but related/dependent factories together without +> specifying their concrete classes. 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** @@ -156,7 +163,6 @@ public static class FactoryMaker { return switch (type) { case ELF -> new ElfKingdomFactory(); case ORC -> new OrcKingdomFactory(); - default -> throw new IllegalArgumentException("KingdomType not supported."); }; } } @@ -204,13 +210,26 @@ Example use cases ## Consequences -* Dependency injection in java hides the service class dependencies that can lead to runtime errors that would have been caught at compile time. -* While the pattern is great when creating predefined objects, adding the new ones might be challenging. -* The code becomes more complicated than it should be since a lot of new interfaces and classes are introduced along with the pattern. +Benefits + +* 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. ## Tutorials * [Abstract Factory Pattern Tutorial](https://www.journaldev.com/1418/abstract-factory-design-pattern-in-java) +* [Refactoring Guru - Abstract Factory](https://refactoring.guru/design-patterns/abstract-factory) ## Known uses @@ -227,3 +246,5 @@ Example use cases * [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: 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) +* [Java Design Patterns: A Hands-On Experience with Real-World Examples](https://amzn.to/3HWNf4U) +* [Design Patterns in Java](https://amzn.to/3Syw0vC) \ No newline at end of file diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java index d4d43a98d2d5..e360822ca147 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java @@ -24,6 +24,7 @@ */ package com.iluwatar.abstractfactory; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; /** @@ -41,14 +42,11 @@ * both concrete implementations to create a king, a castle, and an army. */ @Slf4j +@Getter public class App implements Runnable { private final Kingdom kingdom = new Kingdom(); - public Kingdom getKingdom() { - return kingdom; - } - /** * Program entry point. * diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Kingdom.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Kingdom.java index f6ab48d0c6a3..db1c65ca46de 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Kingdom.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Kingdom.java @@ -57,7 +57,6 @@ public static KingdomFactory makeFactory(KingdomType type) { return switch (type) { case ELF -> new ElfKingdomFactory(); case ORC -> new OrcKingdomFactory(); - default -> throw new IllegalArgumentException("KingdomType not supported."); }; } } From 4277a548357b169d80a230906b1a58302113f73f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Mon, 12 Feb 2024 19:17:03 +0200 Subject: [PATCH 026/763] docs: Improve active object description --- active-object/README.md | 54 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/active-object/README.md b/active-object/README.md index b6d85a0f8480..a3fbc66951c0 100644 --- a/active-object/README.md +++ b/active-object/README.md @@ -8,17 +8,22 @@ tag: ## Intent -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. + +The Active Object design pattern provides a safe and reliable way to implement asynchronous behavior in concurrent +systems. 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. ## Explanation -The class that implements the active object pattern will contain a self-synchronization mechanism without using 'synchronized' methods. +The class that implements the active object pattern will contain a self-synchronization mechanism without using +'synchronized' methods. 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. -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. +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. **Programmatic Example** @@ -79,7 +84,8 @@ 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: @@ -93,7 +99,8 @@ public class Orc extends ActiveCreature { } ``` -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 public static void main(String[] args) { @@ -122,6 +129,41 @@ Now, we can create multiple creatures such as Orcs, tell them to eat and roam, a ![alt text](./etc/active-object.urm.png "Active Object class diagram") +## Applicability + +* When you need to perform long-running operations without blocking the main thread. +* 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. + ## Tutorials -* [Android and Java Concurrency: The Active Object Pattern](https://www.youtube.com/watch?v=Cd8t2u5Qmvc) \ No newline at end of file +* [Android and Java Concurrency: The Active Object Pattern](https://www.youtube.com/watch?v=Cd8t2u5Qmvc) + +## Consequences + +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 patterns + +* Observer +* Reactor +* Producer-consumer +* Thread pool + +## Credits + +* [Design Patterns: Elements of Reusable Object Software](https://amzn.to/3HYqrBE) +* [Concurrent Programming in Java: Design Principles and Patterns](https://amzn.to/498SRVq) +* [Learning Concurrent Programming in Scala](https://amzn.to/3UE07nV) +* [Pattern Languages of Program Design 3](https://amzn.to/3OI1j61) From a258bcc1eb4a7e6c2bd51d69cd1fdd0fabc618b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Mon, 12 Feb 2024 19:28:48 +0200 Subject: [PATCH 027/763] docs: fix line endings --- abstract-document/README.md | 29 +++++++---------------------- abstract-factory/README.md | 21 ++++++--------------- active-object/README.md | 16 +++++----------- 3 files changed, 18 insertions(+), 48 deletions(-) diff --git a/abstract-document/README.md b/abstract-document/README.md index 09d1d273283e..7c30819c7f6b 100644 --- a/abstract-document/README.md +++ b/abstract-document/README.md @@ -10,15 +10,11 @@ tag: ## Intent -The Abstract Document design pattern is a structural design pattern that aims to provide 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. +The Abstract Document design pattern is a structural design pattern that aims to provide 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. ## Explanation -The Abstract Document pattern enables handling additional, non-static properties. This pattern -uses concept of traits to enable type safety and separate properties of different classes into -set of interfaces. +The Abstract Document pattern enables handling additional, non-static properties. This pattern uses concept of traits to enable type safety and separate properties of different classes into set of interfaces. Real world example @@ -30,16 +26,11 @@ In plain words Wikipedia says -> 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. +> 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. **Programmatic Example** -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. +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 public interface Document { @@ -84,8 +75,7 @@ public abstract class AbstractDocument implements Document { ... } ``` -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 public enum Property { @@ -179,9 +169,7 @@ And finally here's how we construct and use the `Car` in a full example. ## Applicability -This pattern is particularly useful in scenarios where you have different types of documents 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: +This pattern is particularly useful in scenarios where you have different types of documents 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: * 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. @@ -205,10 +193,7 @@ some scenarios where the Abstract Document design pattern can be applicable: * 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. +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. ## Consequences diff --git a/abstract-factory/README.md b/abstract-factory/README.md index 906f243fe5c4..4d5ff98a2165 100644 --- a/abstract-factory/README.md +++ b/abstract-factory/README.md @@ -14,32 +14,25 @@ Kit ## Intent -The Abstract Factory design pattern provides a way to create families of related objects without specifying their -concrete classes. This allows for code that is independent of the specific classes of objects it uses, promoting -flexibility and maintainability. +The Abstract Factory design pattern provides a way to create families of related objects without specifying their concrete classes. This allows for code that is independent of the specific classes of objects it uses, promoting flexibility and maintainability. ## Explanation 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. +> 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. In plain words -> A factory of factories; a factory that groups the individual but related/dependent factories together without -> specifying their concrete classes. +> A factory of factories; a factory that groups the individual but related/dependent factories together without specifying their concrete classes. 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** -Translating the kingdom example above. First of all, we have some interfaces and implementation for 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 public interface Castle { @@ -148,9 +141,7 @@ 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. +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 public static class FactoryMaker { diff --git a/active-object/README.md b/active-object/README.md index a3fbc66951c0..26e3e816af7f 100644 --- a/active-object/README.md +++ b/active-object/README.md @@ -9,21 +9,17 @@ tag: ## Intent -The Active Object design pattern provides a safe and reliable way to implement asynchronous behavior in concurrent -systems. 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 provides a safe and reliable way to implement asynchronous behavior in concurrent systems. 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. ## Explanation -The class that implements the active object pattern will contain a self-synchronization mechanism without using -'synchronized' methods. +The class that implements the active object pattern will contain a self-synchronization mechanism without using 'synchronized' methods. 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. -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. +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. **Programmatic Example** @@ -84,8 +80,7 @@ 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: @@ -99,8 +94,7 @@ public class Orc extends ActiveCreature { } ``` -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 public static void main(String[] args) { From 89d9558b001358a8d5ce4ba23b9ccdd9859bbeea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 25 Feb 2024 13:43:27 +0200 Subject: [PATCH 028/763] docs: Improvements to Acyclic Visitor readme --- acyclic-visitor/README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/acyclic-visitor/README.md b/acyclic-visitor/README.md index 464fcc51f878..bf6307e7390e 100644 --- a/acyclic-visitor/README.md +++ b/acyclic-visitor/README.md @@ -8,8 +8,7 @@ tag: ## Intent -Allow new functions to be added to existing class hierarchies without affecting those hierarchies, and without creating -the troublesome dependency cycles that are inherent to the GoF Visitor Pattern. +The Acyclic Visitor pattern decouples operations from an object hierarchy, allowing you to add new operations without modifying the object structure directly. ## Explanation @@ -135,19 +134,19 @@ This pattern can be used: * 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. -## Tutorial +## Tutorials * [Acyclic Visitor Pattern Example](https://codecrafter.blogspot.com/2012/12/the-acyclic-visitor-pattern.html) ## Consequences -The good: +Benefits: * No dependency cycles between class hierarchies. * No need to recompile all the visitors if a new one is added. * Does not cause compilation failure in existing visitors if class hierarchy has a new member. -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. * Parallel hierarchy of visitors has to be created for all members in visitable class hierarchy. From 1ab8ca76fb573f49812033d78522ba68423fe87b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 25 Feb 2024 13:46:37 +0200 Subject: [PATCH 029/763] docs: Add tag for Acyclic Visitor --- acyclic-visitor/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/acyclic-visitor/README.md b/acyclic-visitor/README.md index bf6307e7390e..7976be06c737 100644 --- a/acyclic-visitor/README.md +++ b/acyclic-visitor/README.md @@ -3,7 +3,8 @@ title: Acyclic Visitor category: Behavioral language: en tag: - - Extensibility + - Decoupling + - Extensibility --- ## Intent From 79d41d933665953d109560cf6fedcf271ad225a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 25 Feb 2024 13:58:45 +0200 Subject: [PATCH 030/763] docs: Improve Acyclic Visitor and Adapter readmes --- acyclic-visitor/README.md | 2 ++ adapter/README.md | 12 +++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/acyclic-visitor/README.md b/acyclic-visitor/README.md index 7976be06c737..57adf4673b18 100644 --- a/acyclic-visitor/README.md +++ b/acyclic-visitor/README.md @@ -160,3 +160,5 @@ Trade-offs: * [Acyclic Visitor by Robert C. Martin](http://condor.depaul.edu/dmumaugh/OOT/Design-Principles/acv.pdf) * [Acyclic Visitor in WikiWikiWeb](https://wiki.c2.com/?AcyclicVisitor) +* [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: 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) diff --git a/adapter/README.md b/adapter/README.md index 553471816785..8de9f4138089 100644 --- a/adapter/README.md +++ b/adapter/README.md @@ -3,15 +3,18 @@ title: Adapter category: Structural language: en tag: - - Gang of Four + - Compatibility + - Gang of Four + - Integration --- ## Also known as + Wrapper ## Intent -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. + +The Adapter pattern converts the interface of a class into another interface that clients expect, enabling compatibility. ## Explanation @@ -92,9 +95,11 @@ captain.row(); ``` ## Class diagram + ![alt text](./etc/adapter.urm.png "Adapter class diagram") ## Applicability + Use the Adapter pattern when * You want to use an existing class, and its interface does not match the one you need @@ -111,6 +116,7 @@ Use the Adapter pattern when ## Consequences + 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. From b2c7410c03feaf57fdc786b56b15373444de2478 Mon Sep 17 00:00:00 2001 From: Ved Asole <77259804+ved-asole@users.noreply.github.com> Date: Sun, 25 Feb 2024 17:50:13 +0530 Subject: [PATCH 031/763] 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 --- pom.xml | 1 + single-table-inheritance/README.md | 157 +++++++++++++++++ .../etc/single-table-inheritance.urm.png | Bin 0 -> 141489 bytes .../etc/single-table-inheritance.urm.puml | 163 ++++++++++++++++++ single-table-inheritance/pom.xml | 36 ++++ .../com/iluwatar/SingleTableInheritance.java | 93 ++++++++++ .../main/java/com/iluwatar/entity/Car.java | 39 +++++ .../java/com/iluwatar/entity/Freighter.java | 41 +++++ .../com/iluwatar/entity/PassengerVehicle.java | 30 ++++ .../main/java/com/iluwatar/entity/Train.java | 38 ++++ .../com/iluwatar/entity/TransportVehicle.java | 25 +++ .../main/java/com/iluwatar/entity/Truck.java | 38 ++++ .../java/com/iluwatar/entity/Vehicle.java | 54 ++++++ .../repository/VehicleRepository.java | 14 ++ .../com/iluwatar/service/VehicleService.java | 71 ++++++++ .../src/main/resources/application.properties | 11 ++ 16 files changed, 811 insertions(+) create mode 100644 single-table-inheritance/README.md create mode 100644 single-table-inheritance/etc/single-table-inheritance.urm.png create mode 100644 single-table-inheritance/etc/single-table-inheritance.urm.puml create mode 100644 single-table-inheritance/pom.xml create mode 100644 single-table-inheritance/src/main/java/com/iluwatar/SingleTableInheritance.java create mode 100644 single-table-inheritance/src/main/java/com/iluwatar/entity/Car.java create mode 100644 single-table-inheritance/src/main/java/com/iluwatar/entity/Freighter.java create mode 100644 single-table-inheritance/src/main/java/com/iluwatar/entity/PassengerVehicle.java create mode 100644 single-table-inheritance/src/main/java/com/iluwatar/entity/Train.java create mode 100644 single-table-inheritance/src/main/java/com/iluwatar/entity/TransportVehicle.java create mode 100644 single-table-inheritance/src/main/java/com/iluwatar/entity/Truck.java create mode 100644 single-table-inheritance/src/main/java/com/iluwatar/entity/Vehicle.java create mode 100644 single-table-inheritance/src/main/java/com/iluwatar/repository/VehicleRepository.java create mode 100644 single-table-inheritance/src/main/java/com/iluwatar/service/VehicleService.java create mode 100644 single-table-inheritance/src/main/resources/application.properties diff --git a/pom.xml b/pom.xml index 48e725a4f9bc..e45a5ee16447 100644 --- a/pom.xml +++ b/pom.xml @@ -210,6 +210,7 @@ crtp log-aggregation health-check + single-table-inheritance diff --git a/single-table-inheritance/README.md b/single-table-inheritance/README.md new file mode 100644 index 000000000000..541ad1423e24 --- /dev/null +++ b/single-table-inheritance/README.md @@ -0,0 +1,157 @@ +--- +title: Single Table Inheritance Pattern +category: Structural +language: en +tag: + - Data access +--- + +## Single Table Inheritance(STI) + +## Intent + +Represents an inheritance hierarchy of classes as a single table that has columns for all the fields of the various classes. + +## Explanation + +Real-world example + +> There can be many different types of vehicles in this world but all of them +> come under the single umbrella of Vehicle + +In plain words + +> It maps each instance of class in an inheritance tree into a single table. + +Wikipedia says + +> Single table inheritance is a way to emulate object-oriented inheritance in a relational database. +> When mapping from a database table to an object in an object-oriented language, +> a field in the database identifies what class in the hierarchy the object belongs to. +> All fields of all the classes are stored in the same table, hence the name "Single Table Inheritance". + +**Programmatic Example** + +Baeldung - Hibernate Inheritance + +> We can define the strategy we want to use by adding the @Inheritance annotation to the superclass: + +```java +@Entity +@Inheritance(strategy = InheritanceType.SINGLE_TABLE) +public class MyProduct { + @Id + private long productId; + private String name; + + // constructor, getters, setters +} +``` + +The identifier of the entities is also defined in the superclass. + +Then we can add the subclass entities: + +```java +@Entity +public class Book extends MyProduct { + private String author; +} +``` + +```java +@Entity +public class Pen extends MyProduct { + private String color; +} +``` +Discriminator Values + +- Since the records for all entities will be in the same table, Hibernate needs a way to differentiate between them. + +- By default, this is done through a discriminator column called DTYPE that has the name of the entity as a value. + +- To customize the discriminator column, we can use the @DiscriminatorColumn annotation: + +```java +@Entity(name="products") +@Inheritance(strategy = InheritanceType.SINGLE_TABLE) +@DiscriminatorColumn(name="product_type", + discriminatorType = DiscriminatorType.INTEGER) +public class MyProduct { + // ... +} +``` +- Here we’ve chosen to differentiate MyProduct subclass entities by an integer column called product_type. + +- Next, we need to tell Hibernate what value each subclass record will have for the product_type column: + +```java +@Entity +@DiscriminatorValue("1") +public class Book extends MyProduct { + // ... +} +``` +```java +@Entity +@DiscriminatorValue("2") +public class Pen extends MyProduct { + // ... +} +``` + +- Hibernate adds two other predefined values that the annotation can take — null and not null: + + - @DiscriminatorValue(“null”) means that any row without a discriminator value will be mapped to the entity class with this annotation; this can be applied to the root class of the hierarchy. + - @DiscriminatorValue(“not null”) – Any row with a discriminator value not matching any of the ones associated with entity definitions will be mapped to the class with this annotation. + + +## Class diagram + +![alt text](./etc/single-table-inheritance.urm.png "Singleton pattern class diagram") + +## Applicability + +Use the Singleton pattern when + +* Use STI When The Subclasses Have The Same Fields/Columns But Different Behavior + - A good indication that STI is right is when the different subclasses have the same fields/columns but different methods. In the accounts example above, we expect all the columns in the database to be used by each subclass. Otherwise, there will be a lot of null columns in the database. +

    +* Use STI When We Expect To Perform Queries Across All Subclasses + - Another good indication STI is right is if we expect to perform queries across all classes. For example, if we want to find the top 10 accounts with the highest balances across all types, STI allows lets us use just one query, whereas MTI will require in memory manipulation. + + +### Tutorials + +- Java Brains - Single Table Inheritance + +## Consequences + +* Fields are sometimes relevant and sometimes not, which can be confusing + to people using the tables directly. +* Columns used only by some subclasses lead to wasted space in the database. + How much this is actually a problem depends on the specific data + characteristics and how well the database compresses empty columns. + Oracle, for example, is very efficient in trimming wasted space, particularly + if you keep your optional columns to the right side of the database + table. Each database has its own tricks for this. +* The single table may end up being too large, with many indexes and frequent + locking, which may hurt performance. You can avoid this by having + separate index tables that either list keys of rows that have a certain property + or that copy a subset of fields relevant to an index. +* You only have a single namespace for fields, so you have to be sure that + you don’t use the same name for different fields. Compound names with + the name of the class as a prefix or suffix help here. + +## Related patterns + +* MappedSuperclass +* Single Table +* Joined Table +* Table per Class + +## Credits + +* [Single Table Inheritance - martinFowler.com](https://www.martinfowler.com/eaaCatalog/singleTableInheritance.html) +* [Patterns of Enterprise Application Architecture](https://books.google.co.in/books?id=vqTfNFDzzdIC&pg=PA278&redir_esc=y#v=onepage&q&f=false) diff --git a/single-table-inheritance/etc/single-table-inheritance.urm.png b/single-table-inheritance/etc/single-table-inheritance.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..f3abe8df6fec30ee0c98cfd85216da47d751b885 GIT binary patch literal 141489 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

    WGPJP%%!*h|2o1I$EhPL+=v9H{FdHu8VIWN_ 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 Q_=VDvvIpY!{eAI&00pKuXaE2J literal 0 HcmV?d00001 diff --git a/single-table-inheritance/etc/single-table-inheritance.urm.puml b/single-table-inheritance/etc/single-table-inheritance.urm.puml new file mode 100644 index 000000000000..644d27e070ea --- /dev/null +++ b/single-table-inheritance/etc/single-table-inheritance.urm.puml @@ -0,0 +1,163 @@ +@startuml +package com.iluwatar.repository { + interface VehicleRepository { + } +} +package com.iluwatar.service { + class VehicleService { + - vehicleRepository : VehicleRepository + + VehicleService(vehicleRepository : VehicleRepository) + + deleteVehicle(vehicle : Vehicle) + + getAllVehicles() : List + + getVehicle(vehicleId : int) : Vehicle + + saveVehicle(vehicle : Vehicle) : Vehicle + + updateVehicle(vehicle : Vehicle) : Vehicle + } +} +package com.iluwatar.entity { + class Car { + - engineCapacity : int + + Car() + + Car(manufacturer : String, model : String, noOfPassengers : int, engineCapacity : int) + # canEqual(other : Object) : boolean + + equals(o : Object) : boolean + + getEngineCapacity() : int + + hashCode() : int + + setEngineCapacity(engineCapacity : int) + + toString() : String + } + class Freighter { + - flightLength : double + + Freighter() + + Freighter(manufacturer : String, model : String, countOfSeats : int, loadCapacity : int, flightLength : double) + # canEqual(other : Object) : boolean + + equals(o : Object) : boolean + + getFlightLength() : double + + hashCode() : int + + setFlightLength(flightLength : double) + + toString() : String + } + abstract class PassengerVehicle { + - noOfPassengers : int + + PassengerVehicle() + + PassengerVehicle(manufacturer : String, model : String, noOfPassengers : int) + # canEqual(other : Object) : boolean + + equals(o : Object) : boolean + + getNoOfPassengers() : int + + hashCode() : int + + setNoOfPassengers(noOfPassengers : int) + + toString() : String + } + class Train { + - noOfCarriages : int + + Train() + + Train(manufacturer : String, model : String, noOfPassengers : int, noOfCarriages : int) + # canEqual(other : Object) : boolean + + equals(o : Object) : boolean + + getNoOfCarriages() : int + + hashCode() : int + + setNoOfCarriages(noOfCarriages : int) + + toString() : String + } + abstract class TransportVehicle { + - loadCapacity : int + + TransportVehicle() + + TransportVehicle(manufacturer : String, model : String, loadCapacity : int) + # canEqual(other : Object) : boolean + + equals(o : Object) : boolean + + getLoadCapacity() : int + + hashCode() : int + + setLoadCapacity(loadCapacity : int) + + toString() : String + } + class Truck { + + towingCapacity : int + + Truck() + + Truck(manufacturer : String, model : String, loadCapacity : int, towingCapacity : int) + # canEqual(other : Object) : boolean + + equals(o : Object) : boolean + + getTowingCapacity() : int + + hashCode() : int + + setTowingCapacity(towingCapacity : int) + + toString() : String + } + abstract class Vehicle { + - manufacturer : String + - model : String + - vehicleId : int + + Vehicle() + + Vehicle(manufacturer : String, model : String) + + Vehicle(vehicleId : int, manufacturer : String, model : String) + # canEqual(other : Object) : boolean + + equals(o : Object) : boolean + + getManufacturer() : String + + getModel() : String + + getVehicleId() : int + + hashCode() : int + + setManufacturer(manufacturer : String) + + setModel(model : String) + + setVehicleId(vehicleId : int) + + toString() : String + } +} +package com.iluwatar.abstractEntity { + abstract class PassengerVehicle { + - noOfPassengers : int + + PassengerVehicle() + + PassengerVehicle(manufacturer : String, model : String, noOfPassengers : int) + # canEqual(other : Object) : boolean + + equals(o : Object) : boolean + + getNoOfPassengers() : int + + hashCode() : int + + setNoOfPassengers(noOfPassengers : int) + + toString() : String + } + abstract class TransportVehicle { + - loadCapacity : int + + TransportVehicle() + + TransportVehicle(manufacturer : String, model : String, loadCapacity : int) + # canEqual(other : Object) : boolean + + equals(o : Object) : boolean + + getLoadCapacity() : int + + hashCode() : int + + setLoadCapacity(loadCapacity : int) + + toString() : String + } + abstract class Vehicle { + - manufacturer : String + - model : String + - vehicleId : int + + Vehicle() + + Vehicle(manufacturer : String, model : String) + + Vehicle(vehicleId : int, manufacturer : String, model : String) + # canEqual(other : Object) : boolean + + equals(o : Object) : boolean + + getManufacturer() : String + + getModel() : String + + getVehicleId() : int + + hashCode() : int + + setManufacturer(manufacturer : String) + + setModel(model : String) + + setVehicleId(vehicleId : int) + + toString() : String + } +} +package com.iluwatar { + class SingleTableInheritance { + - vehicleService : VehicleService + + SingleTableInheritance(vehicleService : VehicleService) + + main(args : String[]) {static} + + run(args : String[]) + } +} +SingleTableInheritance --> "-vehicleService" VehicleService +VehicleService --> "-vehicleRepository" VehicleRepository +PassengerVehicle --|> Vehicle +TransportVehicle --|> Vehicle +Car --|> PassengerVehicle +Freighter --|> TransportVehicle +PassengerVehicle --|> Vehicle +Train --|> PassengerVehicle +TransportVehicle --|> Vehicle +Truck --|> TransportVehicle +@enduml \ No newline at end of file diff --git a/single-table-inheritance/pom.xml b/single-table-inheritance/pom.xml new file mode 100644 index 000000000000..159a683bea21 --- /dev/null +++ b/single-table-inheritance/pom.xml @@ -0,0 +1,36 @@ + + + 4.0.0 + + com.iluwatar + java-design-patterns + 1.26.0-SNAPSHOT + + + single-table-inheritance + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + \ No newline at end of file diff --git a/single-table-inheritance/src/main/java/com/iluwatar/SingleTableInheritance.java b/single-table-inheritance/src/main/java/com/iluwatar/SingleTableInheritance.java new file mode 100644 index 000000000000..01fbb37b828f --- /dev/null +++ b/single-table-inheritance/src/main/java/com/iluwatar/SingleTableInheritance.java @@ -0,0 +1,93 @@ +package com.iluwatar; + +import com.iluwatar.entity.Car; +import com.iluwatar.entity.Truck; +import com.iluwatar.entity.Vehicle; +import com.iluwatar.service.VehicleService; +import java.util.List; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Single Table Inheritance pattern : + *
    + * It maps each instance of class in an inheritance tree into a single table. + *
    + *

    + * In case of current project, in order to specify the Single Table Inheritance to Hibernate + * we annotate the main Vehicle root class with @Inheritance(strategy = InheritanceType.SINGLE_TABLE) + * due to which a single root Vehicle class table will be created + * in the database and it will have columns for all the fields of + * it's subclasses(Car, Freighter, Train, Truck).
    + * Additional to that, a new separate "vehicle_id" column would be added + * to the Vehicle table to save the type of the subclass object that + * is being stored in the database. This value is specified by the @DiscriminatorValue annotation + * value for each subclass in case of Hibernate.
    + *


    + * Below is the main Spring Boot Application class from where the Program Runs. + *

    + * It implements the CommandLineRunner to run the statements at the + * start of the application program. + *

    + */ +@SpringBootApplication +@AllArgsConstructor +public class SingleTableInheritance implements CommandLineRunner { + + //Autowiring the VehicleService class to execute the business logic methods + private final VehicleService vehicleService; + + /** + * The entry point of the Spring Boot Application. + * + * @param args program runtime arguments + */ + public static void main(String[] args) { + SpringApplication.run(SingleTableInheritance.class, args); + } + + /** + * The starting point of the CommandLineRunner + * where the main program is run. + * + * @param args program runtime arguments + */ + @Override + public void run(String... args) throws Exception { + + Logger log = LoggerFactory.getLogger(SingleTableInheritance.class); + + log.info("Saving Vehicles :- "); + + // Saving Car to DB as a Vehicle + Vehicle vehicle1 = new Car("Tesla", "Model S", 4, 825); + Vehicle car1 = vehicleService.saveVehicle(vehicle1); + log.info("Vehicle 1 saved : {}", car1); + + // Saving Truck to DB as a Vehicle + Vehicle vehicle2 = new Truck("Ford", "F-150", 3325, 14000); + Vehicle truck1 = vehicleService.saveVehicle(vehicle2); + log.info("Vehicle 2 saved : {}\n", truck1); + + + log.info("Fetching Vehicles :- "); + + // Fetching the Car from DB + Car savedCar1 = (Car) vehicleService.getVehicle(vehicle1.getVehicleId()); + log.info("Fetching Car1 from DB : {}", savedCar1); + + // Fetching the Truck from DB + Truck savedTruck1 = (Truck) vehicleService.getVehicle(vehicle2.getVehicleId()); + log.info("Fetching Truck1 from DB : {}\n", savedTruck1); + + log.info("Fetching All Vehicles :- "); + + // Fetching the Vehicles present in the DB + List allVehiclesFromDb = vehicleService.getAllVehicles(); + allVehiclesFromDb.forEach(s -> log.info(s.toString())); + } +} \ No newline at end of file diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/Car.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/Car.java new file mode 100644 index 000000000000..c8d3185fdce9 --- /dev/null +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/Car.java @@ -0,0 +1,39 @@ +package com.iluwatar.entity; + +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * A class that extends the PassengerVehicle class + * and provides the concrete inheritance implementation of the Car. + * + * @see PassengerVehicle PassengerVehicle + * @see Vehicle Vehicle + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Entity +@DiscriminatorValue(value = "CAR") +public class Car extends PassengerVehicle { + + private int engineCapacity; + + public Car(String manufacturer, String model, int noOfPassengers, int engineCapacity) { + super(manufacturer, model, noOfPassengers); + this.engineCapacity = engineCapacity; + } + + // Overridden the toString method to specify the Vehicle object + @Override + public String toString() { + return "Car{" + + super.toString() + + '}'; + } + +} diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/Freighter.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/Freighter.java new file mode 100644 index 000000000000..ce35f3df37df --- /dev/null +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/Freighter.java @@ -0,0 +1,41 @@ +package com.iluwatar.entity; + +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * A class that extends the TransportVehicle class + * and provides the concrete inheritance implementation of the Car. + * + * @see TransportVehicle TransportVehicle + * @see Vehicle Vehicle + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Entity +@DiscriminatorValue(value = "FREIGHTER") +public class Freighter extends TransportVehicle { + + private double flightLength; + + public Freighter(String manufacturer, String model, int loadCapacity, double flightLength) { + super(manufacturer, model, loadCapacity); + this.flightLength = flightLength; + } + + // Overridden the toString method to specify the Vehicle object + @Override + public String toString() { + return "Freighter{ " + + super.toString() + + " ," + + "flightLength=" + + flightLength + + '}'; + } + +} diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/PassengerVehicle.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/PassengerVehicle.java new file mode 100644 index 000000000000..c27818a9a1d9 --- /dev/null +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/PassengerVehicle.java @@ -0,0 +1,30 @@ +package com.iluwatar.entity; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * An abstract class that extends the Vehicle class + * and provides properties for the Passenger type of Vehicles. + * + * @see Vehicle + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public abstract class PassengerVehicle extends Vehicle { + + private int noOfPassengers; + + protected PassengerVehicle(String manufacturer, String model, int noOfPassengers) { + super(manufacturer, model); + this.noOfPassengers = noOfPassengers; + } + + @Override + public String toString() { + return super.toString(); + } + +} diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/Train.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/Train.java new file mode 100644 index 000000000000..10a74f36ac5a --- /dev/null +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/Train.java @@ -0,0 +1,38 @@ +package com.iluwatar.entity; + +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * A class that extends the PassengerVehicle class + * and provides the concrete inheritance implementation of the Car. + * + * @see PassengerVehicle PassengerVehicle + * @see Vehicle Vehicle + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Entity +@DiscriminatorValue(value = "TRAIN") +public class Train extends PassengerVehicle { + + private int noOfCarriages; + + public Train(String manufacturer, String model, int noOfPassengers, int noOfCarriages) { + super(manufacturer, model, noOfPassengers); + this.noOfCarriages = noOfCarriages; + } + + // Overridden the toString method to specify the Vehicle object + @Override + public String toString() { + return "Train{" + + super.toString() + + '}'; + } + +} diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/TransportVehicle.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/TransportVehicle.java new file mode 100644 index 000000000000..9f9c60516e88 --- /dev/null +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/TransportVehicle.java @@ -0,0 +1,25 @@ +package com.iluwatar.entity; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * An abstract class that extends the Vehicle class + * and provides properties for the Transport type of Vehicles. + * + * @see Vehicle + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public abstract class TransportVehicle extends Vehicle { + + private int loadCapacity; + + protected TransportVehicle(String manufacturer, String model, int loadCapacity) { + super(manufacturer, model); + this.loadCapacity = loadCapacity; + } + +} diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/Truck.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/Truck.java new file mode 100644 index 000000000000..e389666e4dcc --- /dev/null +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/Truck.java @@ -0,0 +1,38 @@ +package com.iluwatar.entity; + +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * A class that extends the PassengerVehicle class + * and provides the concrete inheritance implementation of the Car. + * + * @see TransportVehicle TransportVehicle + * @see Vehicle Vehicle + */ +@Data +@NoArgsConstructor +@Entity +@DiscriminatorValue(value = "TRUCK") +public class Truck extends TransportVehicle { + + private int towingCapacity; + + public Truck(String manufacturer, String model, int loadCapacity, int towingCapacity) { + super(manufacturer, model, loadCapacity); + this.towingCapacity = towingCapacity; + } + + // Overridden the toString method to specify the Vehicle object + @Override + public String toString() { + return "Truck{ " + + super.toString() + + ", " + + "towingCapacity=" + + towingCapacity + + '}'; + } +} diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/Vehicle.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/Vehicle.java new file mode 100644 index 000000000000..901a37705455 --- /dev/null +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/Vehicle.java @@ -0,0 +1,54 @@ +package com.iluwatar.entity; + +import javax.persistence.DiscriminatorColumn; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * An abstract class that is the root of the Vehicle Inheritance hierarchy + * and basic provides properties for all the vehicles. + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode +@Entity +@Inheritance(strategy = InheritanceType.SINGLE_TABLE) +@DiscriminatorColumn(name = "VEHICLE_TYPE") +public abstract class Vehicle { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int vehicleId; + + private String manufacturer; + + private String model; + + protected Vehicle(String manufacturer, String model) { + this.manufacturer = manufacturer; + this.model = model; + } + + @Override + public String toString() { + return "Vehicle{" + + "vehicleId=" + + vehicleId + + ", manufacturer='" + + manufacturer + + '\'' + + ", model='" + + model + + '}'; + } + +} diff --git a/single-table-inheritance/src/main/java/com/iluwatar/repository/VehicleRepository.java b/single-table-inheritance/src/main/java/com/iluwatar/repository/VehicleRepository.java new file mode 100644 index 000000000000..5aec26c3aa95 --- /dev/null +++ b/single-table-inheritance/src/main/java/com/iluwatar/repository/VehicleRepository.java @@ -0,0 +1,14 @@ +package com.iluwatar.repository; + +import com.iluwatar.entity.Vehicle; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +/** + * A repository that is extending the JPA Repository + * to provide the default Spring DATA JPA methods for the Vehicle class. + */ +@Repository +public interface VehicleRepository extends JpaRepository { + +} diff --git a/single-table-inheritance/src/main/java/com/iluwatar/service/VehicleService.java b/single-table-inheritance/src/main/java/com/iluwatar/service/VehicleService.java new file mode 100644 index 000000000000..4aeacd04824d --- /dev/null +++ b/single-table-inheritance/src/main/java/com/iluwatar/service/VehicleService.java @@ -0,0 +1,71 @@ +package com.iluwatar.service; + +import com.iluwatar.entity.Vehicle; +import com.iluwatar.repository.VehicleRepository; +import java.util.List; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +/** + * A service class that is used to provide the business logic + * for the Vehicle class and connect to the database to + * perform the CRUD operations on the root Vehicle class. + * + * @see Vehicle + */ +@Service +@AllArgsConstructor +public class VehicleService { + + private final VehicleRepository vehicleRepository; + + /** + * A method to save all the vehicles to the database. + * + * @param vehicle Vehicle bbject + * @see Vehicle + */ + public Vehicle saveVehicle(Vehicle vehicle) { + return vehicleRepository.save(vehicle); + } + + /** + * A method to get a specific vehicle from vehicle id. + * + * @param vehicleId Vehicle Id + * @see Vehicle + */ + public Vehicle getVehicle(int vehicleId) { + return vehicleRepository.findById(vehicleId).orElse(null); + } + + /** + * A method to get all the vehicles saved in the database. + * + * @see Vehicle + */ + public List getAllVehicles() { + return vehicleRepository.findAll(); + } + + /** + * A method to update a vehicle in the database. + * + * @param vehicle Vehicle object + * @see Vehicle + */ + public Vehicle updateVehicle(Vehicle vehicle) { + return vehicleRepository.save(vehicle); + } + + /** + * A method to save all the vehicles to the database. + * + * @param vehicle Vehicle object + * @see Vehicle + */ + public void deleteVehicle(Vehicle vehicle) { + vehicleRepository.delete(vehicle); + } + +} diff --git a/single-table-inheritance/src/main/resources/application.properties b/single-table-inheritance/src/main/resources/application.properties new file mode 100644 index 000000000000..e2d8176fde86 --- /dev/null +++ b/single-table-inheritance/src/main/resources/application.properties @@ -0,0 +1,11 @@ + +# H2 Database Configuration +spring.datasource.url=jdbc:h2:mem:sti +spring.datasource.username=sa +spring.datasource.password=password +spring.datasource.driverClassName=org.h2.Driver +spring.jpa.hibernate.ddl-auto=update + +#Uncomment the below properties to see the SQL being generated in backend +#spring.jpa.show-sql=true +#spring.jpa.properties.hibernate.format_sql=true \ No newline at end of file From fb80886685e46e13a349680dd613fd3dae3d48d1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 25 Feb 2024 14:21:14 +0200 Subject: [PATCH 032/763] 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> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 954742e98f61..dd0382c6c421 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2883,6 +2883,15 @@ "translation", "doc" ] + }, + { + "login": "ved-asole", + "name": "Ved Asole", + "avatar_url": "https://avatars.githubusercontent.com/u/77259804?v=4", + "profile": "http://vedasole.cloud", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index ec418d8ae19c..40280839bf4d 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![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) -[![All Contributors](https://img.shields.io/badge/all_contributors-316-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-317-orange.svg?style=flat-square)](#contributors-)
    @@ -482,6 +482,7 @@ This project is licensed under the terms of the MIT license. egg0102030405
    egg0102030405

    🌍 📖 + Ved Asole
    Ved Asole

    💻 From b005b1a69a68dc26e0d2243b8660991917e06611 Mon Sep 17 00:00:00 2001 From: NewMorning <95869761+Holiday-C@users.noreply.github.com> Date: Sun, 25 Feb 2024 20:23:30 +0800 Subject: [PATCH 033/763] translation: Added Chinese Translation for Commander patterns (#2763) --- localization/zh/commander/README.md | 24 ++++++++++++++++++ .../zh/commander/etc/commander.urm.png | Bin 0 -> 322274 bytes 2 files changed, 24 insertions(+) create mode 100644 localization/zh/commander/README.md create mode 100644 localization/zh/commander/etc/commander.urm.png diff --git a/localization/zh/commander/README.md b/localization/zh/commander/README.md new file mode 100644 index 000000000000..9ee832f1b7e0 --- /dev/null +++ b/localization/zh/commander/README.md @@ -0,0 +1,24 @@ +--- +title: Commander +category: Concurrency +language: zh +tag: + - Cloud distributed +--- + +## 目的 + +> 用于处理执行分布式事务时可能遇到的所有问题。 + +## 类图 +![alt text](./etc/commander.urm.png "Commander class diagram") + +## 适用场合 +当我们需要提交两个数据库去完成事务,提交不是原子性且可能因此造成问题时,适合用这个设计模式。 + +## 解释 +处理分布式事务很棘手,但如果我们不仔细处理,可能会带来不想要的后果。假设我们有一个电子商务网站,它有一个支付微服务和一个运输微服务。如果当前运输可用,但支付服务不可用,或者反之,当我们已经收到用户的订单后,我们应该如何处理?我们需要有一个机制来处理这些情况。我们必须将订单指向其中一个服务(在这个例子中是运输),然后将订单添加到另一个服务的数据库中(在这个例子中是支付),因为两个数据库不能原子地更新。如果我们当前无法做到这一点,应该有一个队列,可以将这个请求排队,并且必须有一个机制,允许队列中出现失败。所有这些都需要通过不断的重试,在保证幂等性(即使请求多次,变化只应用一次)的情况下,由一个指挥类来完成,以达到最终一致性的状态。 + +## 鸣谢 + +* [Distributed Transactions: The Icebergs of Microservices](https://www.grahamlea.com/2016/08/distributed-transactions-microservices-icebergs/) diff --git a/localization/zh/commander/etc/commander.urm.png b/localization/zh/commander/etc/commander.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..6b5ebba75bd64a971924f4a3f8a2a89b7df905d7 GIT binary patch literal 322274 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

    vrI-9HR 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