From e0f4cab42351ecf76cf3a8989b13b60a9fdbd9f4 Mon Sep 17 00:00:00 2001 From: darkhyper24 Date: Tue, 14 Jan 2025 18:57:54 +0200 Subject: [PATCH 1/3] added pom.xml plugins and properties and fixed readme.md --- bloC/Readme.md | 6 ------ bloC/pom.xml | 41 +++++++++++++++++++++++++++++------------ 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/bloC/Readme.md b/bloC/Readme.md index 01871fcfc4c8..228af1634052 100644 --- a/bloC/Readme.md +++ b/bloC/Readme.md @@ -39,12 +39,6 @@ The Bloc pattern manages the state of an object and allows for dynamically notif ## Programmatic Example of the Bloc Pattern in Java -### 1. `Troll` Analogy Using Bloc - -Imagine a simple state-driven system that maintains a counter. Whenever the counter changes, any registered listener receives updates dynamically. - ---- - ### **Core Components of the Bloc Pattern** #### **1. State Object** diff --git a/bloC/pom.xml b/bloC/pom.xml index eda6a71d6640..08c629f6e36a 100644 --- a/bloC/pom.xml +++ b/bloC/pom.xml @@ -9,11 +9,6 @@ 1.26.0-SNAPSHOT bloC - - 17 - 17 - UTF-8 - org.junit.jupiter @@ -23,17 +18,12 @@ org.testng testng - RELEASE - test - - - junit - junit test org.assertj assertj-core + 3.24.2 test @@ -42,4 +32,31 @@ test - \ No newline at end of file + + + + org.apache.maven.plugins + maven-assembly-plugin + + + + com.iluwatar.bloC.App + + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + + From 6761a9f171a79a51109b4be8b6a7b8af844f1d2a Mon Sep 17 00:00:00 2001 From: darkhyper24 Date: Tue, 14 Jan 2025 19:42:38 +0200 Subject: [PATCH 2/3] fixed renaming problem and added context to main --- .../src/main/java/com/iluwatar/bloc/Main.java | 18 ----------- {bloC => bloc}/Readme.md | 0 bloC/etc/bloC.png => bloc/etc/bloc.png | Bin bloC/etc/bloC.puml => bloc/etc/bloc.puml | 0 {bloC => bloc}/pom.xml | 8 ++++- .../src/main/java/com/iluwatar/bloc/Bloc.java | 0 .../main/java/com/iluwatar/bloc/BlocUi.java | 0 .../com/iluwatar/bloc/ListenerManager.java | 0 .../src/main/java/com/iluwatar/bloc/Main.java | 28 ++++++++++++++++++ .../main/java/com/iluwatar/bloc/State.java | 0 .../java/com/iluwatar/bloc/StateListener.java | 0 .../test/java/com/iluwatar/bloc/BlocTest.java | 0 .../java/com/iluwatar/bloc/BlocUiTest.java | 0 .../test/java/com/iluwatar/bloc/MainTest.java | 0 pom.xml | 2 +- 15 files changed, 36 insertions(+), 20 deletions(-) delete mode 100644 bloC/src/main/java/com/iluwatar/bloc/Main.java rename {bloC => bloc}/Readme.md (100%) rename bloC/etc/bloC.png => bloc/etc/bloc.png (100%) rename bloC/etc/bloC.puml => bloc/etc/bloc.puml (100%) rename {bloC => bloc}/pom.xml (90%) rename {bloC => bloc}/src/main/java/com/iluwatar/bloc/Bloc.java (100%) rename {bloC => bloc}/src/main/java/com/iluwatar/bloc/BlocUi.java (100%) rename {bloC => bloc}/src/main/java/com/iluwatar/bloc/ListenerManager.java (100%) create mode 100644 bloc/src/main/java/com/iluwatar/bloc/Main.java rename {bloC => bloc}/src/main/java/com/iluwatar/bloc/State.java (100%) rename {bloC => bloc}/src/main/java/com/iluwatar/bloc/StateListener.java (100%) rename {bloC => bloc}/src/test/java/com/iluwatar/bloc/BlocTest.java (100%) rename {bloC => bloc}/src/test/java/com/iluwatar/bloc/BlocUiTest.java (100%) rename {bloC => bloc}/src/test/java/com/iluwatar/bloc/MainTest.java (100%) diff --git a/bloC/src/main/java/com/iluwatar/bloc/Main.java b/bloC/src/main/java/com/iluwatar/bloc/Main.java deleted file mode 100644 index 9751019c3c43..000000000000 --- a/bloC/src/main/java/com/iluwatar/bloc/Main.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.iluwatar.bloc; - -/** - * The Main class demonstrates the use of the Bloc pattern in a simple GUI application. - * It initializes the UI and sets up actions for the buttons and listener management. - */ -public class Main { - - /** - * The entry point of the application. Initializes the GUI. - * - * @param args command-line arguments (not used in this example) - */ - public static void main(String[] args) { - BlocUi blocUi = new BlocUi(); - blocUi.createAndShowUi(); - } -} \ No newline at end of file diff --git a/bloC/Readme.md b/bloc/Readme.md similarity index 100% rename from bloC/Readme.md rename to bloc/Readme.md diff --git a/bloC/etc/bloC.png b/bloc/etc/bloc.png similarity index 100% rename from bloC/etc/bloC.png rename to bloc/etc/bloc.png diff --git a/bloC/etc/bloC.puml b/bloc/etc/bloc.puml similarity index 100% rename from bloC/etc/bloC.puml rename to bloc/etc/bloc.puml diff --git a/bloC/pom.xml b/bloc/pom.xml similarity index 90% rename from bloC/pom.xml rename to bloc/pom.xml index 08c629f6e36a..1edc49f03721 100644 --- a/bloC/pom.xml +++ b/bloc/pom.xml @@ -8,7 +8,7 @@ java-design-patterns 1.26.0-SNAPSHOT - bloC + bloc org.junit.jupiter @@ -18,6 +18,7 @@ org.testng testng + 7.7.1 test @@ -31,6 +32,11 @@ mockito-inline test + + junit + junit + test + diff --git a/bloC/src/main/java/com/iluwatar/bloc/Bloc.java b/bloc/src/main/java/com/iluwatar/bloc/Bloc.java similarity index 100% rename from bloC/src/main/java/com/iluwatar/bloc/Bloc.java rename to bloc/src/main/java/com/iluwatar/bloc/Bloc.java diff --git a/bloC/src/main/java/com/iluwatar/bloc/BlocUi.java b/bloc/src/main/java/com/iluwatar/bloc/BlocUi.java similarity index 100% rename from bloC/src/main/java/com/iluwatar/bloc/BlocUi.java rename to bloc/src/main/java/com/iluwatar/bloc/BlocUi.java diff --git a/bloC/src/main/java/com/iluwatar/bloc/ListenerManager.java b/bloc/src/main/java/com/iluwatar/bloc/ListenerManager.java similarity index 100% rename from bloC/src/main/java/com/iluwatar/bloc/ListenerManager.java rename to bloc/src/main/java/com/iluwatar/bloc/ListenerManager.java diff --git a/bloc/src/main/java/com/iluwatar/bloc/Main.java b/bloc/src/main/java/com/iluwatar/bloc/Main.java new file mode 100644 index 000000000000..1499e6211e56 --- /dev/null +++ b/bloc/src/main/java/com/iluwatar/bloc/Main.java @@ -0,0 +1,28 @@ +package com.iluwatar.bloc; + +/** + * The BLoC (Business Logic Component) pattern is a software design pattern primarily used + * in Flutter applications. It facilitates the separation of business logic from UI code, + * making the application more modular, testable, and scalable. The BLoC pattern uses streams + * to manage the flow of data and state changes, allowing widgets to react to new states as + * they arrive. + * In the BLoC pattern, the application is divided into three key components: + * - Input streams: Represent user interactions or external events fed into the BLoC. + * - Business logic: Processes the input and determines the resulting state or actions. + * - Output streams: Emit the updated state for the UI to consume. + * The BLoC pattern is especially useful in reactive programming scenarios and aligns well with the declarative nature of Flutter. + * By using this pattern, developers can ensure a clear separation of concerns, enhance reusability, and maintain consistent state management throughout the application. + */ + +public class Main { + + /** + * The entry point of the application. Initializes the GUI. + * + * @param args command-line arguments (not used in this example) + */ + public static void main(String[] args) { + BlocUi blocUi = new BlocUi(); + blocUi.createAndShowUi(); + } +} \ No newline at end of file diff --git a/bloC/src/main/java/com/iluwatar/bloc/State.java b/bloc/src/main/java/com/iluwatar/bloc/State.java similarity index 100% rename from bloC/src/main/java/com/iluwatar/bloc/State.java rename to bloc/src/main/java/com/iluwatar/bloc/State.java diff --git a/bloC/src/main/java/com/iluwatar/bloc/StateListener.java b/bloc/src/main/java/com/iluwatar/bloc/StateListener.java similarity index 100% rename from bloC/src/main/java/com/iluwatar/bloc/StateListener.java rename to bloc/src/main/java/com/iluwatar/bloc/StateListener.java diff --git a/bloC/src/test/java/com/iluwatar/bloc/BlocTest.java b/bloc/src/test/java/com/iluwatar/bloc/BlocTest.java similarity index 100% rename from bloC/src/test/java/com/iluwatar/bloc/BlocTest.java rename to bloc/src/test/java/com/iluwatar/bloc/BlocTest.java diff --git a/bloC/src/test/java/com/iluwatar/bloc/BlocUiTest.java b/bloc/src/test/java/com/iluwatar/bloc/BlocUiTest.java similarity index 100% rename from bloC/src/test/java/com/iluwatar/bloc/BlocUiTest.java rename to bloc/src/test/java/com/iluwatar/bloc/BlocUiTest.java diff --git a/bloC/src/test/java/com/iluwatar/bloc/MainTest.java b/bloc/src/test/java/com/iluwatar/bloc/MainTest.java similarity index 100% rename from bloC/src/test/java/com/iluwatar/bloc/MainTest.java rename to bloc/src/test/java/com/iluwatar/bloc/MainTest.java diff --git a/pom.xml b/pom.xml index 4786d4230974..c20b275168b9 100644 --- a/pom.xml +++ b/pom.xml @@ -218,7 +218,7 @@ function-composition microservices-distributed-tracing microservices-idempotent-consumer - bloC + bloc From fb6132c446ee1922c1bfa52a6d41e1a0dc573bcc Mon Sep 17 00:00:00 2001 From: darkhyper24 Date: Tue, 14 Jan 2025 19:55:58 +0200 Subject: [PATCH 3/3] chsnged state class to record --- .../src/main/java/com/iluwatar/bloc/Bloc.java | 4 ++-- .../main/java/com/iluwatar/bloc/BlocUi.java | 2 +- .../main/java/com/iluwatar/bloc/State.java | 23 ++----------------- .../test/java/com/iluwatar/bloc/BlocTest.java | 8 +++---- .../java/com/iluwatar/bloc/BlocUiTest.java | 2 +- 5 files changed, 10 insertions(+), 29 deletions(-) diff --git a/bloc/src/main/java/com/iluwatar/bloc/Bloc.java b/bloc/src/main/java/com/iluwatar/bloc/Bloc.java index 62b629fa734b..caed7080ab1c 100644 --- a/bloc/src/main/java/com/iluwatar/bloc/Bloc.java +++ b/bloc/src/main/java/com/iluwatar/bloc/Bloc.java @@ -68,13 +68,13 @@ private void emitState(State newState) { * Increments the current state value by 1 and notifies listeners of the change. */ public void increment() { - emitState(new State(currentState.getValue() + 1)); + emitState(new State(currentState.value() + 1)); } /** * Decrements the current state value by 1 and notifies listeners of the change. */ public void decrement() { - emitState(new State(currentState.getValue() - 1)); + emitState(new State(currentState.value() - 1)); } } diff --git a/bloc/src/main/java/com/iluwatar/bloc/BlocUi.java b/bloc/src/main/java/com/iluwatar/bloc/BlocUi.java index 1cb0b0379de7..e74536c10c40 100644 --- a/bloc/src/main/java/com/iluwatar/bloc/BlocUi.java +++ b/bloc/src/main/java/com/iluwatar/bloc/BlocUi.java @@ -41,7 +41,7 @@ public void createAndShowUi() { frame.add(toggleListenerButton, BorderLayout.EAST); // making a state listener to update the counter label when the state changes - StateListener stateListener = state -> counterLabel.setText("Counter: " + state.getValue()); + StateListener stateListener = state -> counterLabel.setText("Counter: " + state.value()); // adding the listener to the Bloc instance bloc.addListener(stateListener); diff --git a/bloc/src/main/java/com/iluwatar/bloc/State.java b/bloc/src/main/java/com/iluwatar/bloc/State.java index fcf13287bcf0..5e184d2af20b 100644 --- a/bloc/src/main/java/com/iluwatar/bloc/State.java +++ b/bloc/src/main/java/com/iluwatar/bloc/State.java @@ -1,27 +1,8 @@ package com.iluwatar.bloc; -import lombok.Getter; - /** * The {@code State} class represents a state with an integer value. * This class encapsulates the value and provides methods to retrieve it. */ -@Getter -public class State { - /** - * -- GETTER -- - * Returns the value of the state. - * - */ - private final int value; - - /** - * Constructs a {@code State} with the specified value. - * - * @param value the value of the state - */ - public State(int value) { - this.value = value; - } - -} +public record State(int value) { +} \ No newline at end of file diff --git a/bloc/src/test/java/com/iluwatar/bloc/BlocTest.java b/bloc/src/test/java/com/iluwatar/bloc/BlocTest.java index d3ef70b63ad3..e47d24634a70 100644 --- a/bloc/src/test/java/com/iluwatar/bloc/BlocTest.java +++ b/bloc/src/test/java/com/iluwatar/bloc/BlocTest.java @@ -19,14 +19,14 @@ void initialState() { @Test void IncrementUpdateState() { - bloc.addListener(state -> stateValue.set(state.getValue())); + bloc.addListener(state -> stateValue.set(state.value())); bloc.increment(); assertEquals(1, stateValue.get(), "State should increment to 1"); } @Test void DecrementUpdateState() { - bloc.addListener(state -> stateValue.set(state.getValue())); + bloc.addListener(state -> stateValue.set(state.value())); bloc.decrement(); assertEquals(-1, stateValue.get(), "State should decrement to -1"); } @@ -47,8 +47,8 @@ void removingListener() { @Test void multipleListeners() { AtomicInteger secondValue = new AtomicInteger(); - bloc.addListener(state -> stateValue.set(state.getValue())); - bloc.addListener(state -> secondValue.set(state.getValue())); + bloc.addListener(state -> stateValue.set(state.value())); + bloc.addListener(state -> secondValue.set(state.value())); bloc.increment(); assertEquals(1, stateValue.get(), "First listener should receive state 1."); assertEquals(1, secondValue.get(), "Second listener should receive state 1."); diff --git a/bloc/src/test/java/com/iluwatar/bloc/BlocUiTest.java b/bloc/src/test/java/com/iluwatar/bloc/BlocUiTest.java index 49917523cd93..7b793f89461a 100644 --- a/bloc/src/test/java/com/iluwatar/bloc/BlocUiTest.java +++ b/bloc/src/test/java/com/iluwatar/bloc/BlocUiTest.java @@ -40,7 +40,7 @@ public void setUp() { frame.add(decrementButton, BorderLayout.SOUTH); frame.add(toggleListenerButton, BorderLayout.EAST); - stateListener = state -> counterLabel.setText("Counter: " + state.getValue()); + stateListener = state -> counterLabel.setText("Counter: " + state.value()); bloc.addListener(stateListener); incrementButton.addActionListener(e -> bloc.increment());