diff --git a/.gitignore b/.gitignore
index 6651189..24a3ddd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,5 +2,4 @@
*.log
# Compiled Files #
-bin/
out/
\ No newline at end of file
diff --git a/.idea/checkstyleidea-libs/readme.txt b/.idea/checkstyleidea-libs/readme.txt
deleted file mode 100644
index c552c6f..0000000
--- a/.idea/checkstyleidea-libs/readme.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-This folder contains libraries copied from the "learning-design-patterns-with-java" project.
-It is managed by the CheckStyle-IDEA IDE plugin.
-Do not modify this folder while the IDE is running.
-When the IDE is stopped, you may delete this folder at any time. It will be recreated as needed.
-In order to prevent the CheckStyle-IDEA IDE plugin from creating this folder,
-uncheck the "Copy libraries from project directory" option in the CheckStyle-IDEA settings dialog.
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 09a1793..fa0cc1a 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 91c6102..9f9c85c 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,3 @@
-# design-patterns
+* ### Information Credits: [`refactoring.guru`](https://refactoring.guru/design-patterns)
+* ### Documentation Credits: [`java-design-patterns`](https://java-design-patterns.com/patterns/)
+* ### Video Credits: [`@ConceptAndCoding`](https://www.youtube.com/@ConceptandCoding)
diff --git a/design-patterns.iml b/design-patterns.iml
index 4019e38..dc71840 100644
--- a/design-patterns.iml
+++ b/design-patterns.iml
@@ -22,7 +22,7 @@
- ō
+
\ No newline at end of file
diff --git a/src/course/README.md b/src/course/README.md
new file mode 100644
index 0000000..03894b8
--- /dev/null
+++ b/src/course/README.md
@@ -0,0 +1,3 @@
+# Learning Design Patterns with Java
+
+### Coursera Course: https://www.coursera.org/learn/design-patterns
diff --git a/src/practice/README.md b/src/practice/README.md
new file mode 100644
index 0000000..0f5dda3
--- /dev/null
+++ b/src/practice/README.md
@@ -0,0 +1,41 @@
+# Implementations of Design Patterns
+
+* ### Examples of [Creational](./creational) Design Patterns with Java:
+
+| Design Pattern | Information | Documentation | Video |
+|:-----------------------------------------:|:-------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------:|
+| [Factory Method](./creational/factory) | [`refactoring.guru`](https://refactoring.guru/design-patterns/factory-method) | [`java-design-patterns`](https://java-design-patterns.com/patterns/factory-method/) | |
+| [Abstract Factory](./creational/notional) | [`refactoring.guru`](https://refactoring.guru/design-patterns/abstract-factory) | [`java-design-patterns`](https://java-design-patterns.com/patterns/abstract-factory/) | |
+| [Builder](./creational/builder) | [`refactoring.guru`](https://refactoring.guru/design-patterns/builder) | [`java-design-patterns`](https://java-design-patterns.com/patterns/builder/) | [`@ConceptAndCoding`](https://youtu.be/qOLRxN5eVC0?si=E67H3Rx33vvzY4d_) |
+| [Object Pool](./creational/pool) | N/A | [`java-design-patterns`](https://java-design-patterns.com/patterns/object-pool/) | [`@ConceptAndCoding`](https://youtu.be/obmc24IHqew?si=q7M84QnN_sbFrku0) |
+| [Prototype](./creational/prototype) | [`refactoring.guru`](https://refactoring.guru/design-patterns/prototype) | [`java-design-patterns`](https://java-design-patterns.com/patterns/prototype/) | |
+| [Singleton](./creational/singleton) | [`refactoring.guru`](https://refactoring.guru/design-patterns/singleton) | [`java-design-patterns`](https://java-design-patterns.com/patterns/singleton/) | |
+
+* ### Examples of [Structural](./structural) Design Patterns with Java:
+
+| Design Pattern | Information | Documentation | Video |
+|:-----------------------------------:|:------------------------------------------------------------------------:|:------------------------------------------------------------------------------:|:-----------------------------------------------------------------------:|
+| [Adapter](./structural/adapter) | [`refactoring.guru`](https://refactoring.guru/design-patterns/adapter) | [`java-design-patterns`](https://java-design-patterns.com/patterns/adapter/) | [`@ConceptAndCoding`](https://youtu.be/8wrg7IsILhQ?si=PF2kgCqwYN35dgao) |
+| [Bridge](./structural/bridge) | [`refactoring.guru`](https://refactoring.guru/design-patterns/bridge) | [`java-design-patterns`](https://java-design-patterns.com/patterns/bridge/) | [`@ConceptAndCoding`](https://youtu.be/SOw1_W0taBg?si=4TxZSukUZCUYiNWj) |
+| [Composite](./structural/composite) | [`refactoring.guru`](https://refactoring.guru/design-patterns/composite) | [`java-design-patterns`](https://java-design-patterns.com/patterns/composite/) | |
+| [Decorator](./structural/decorator) | [`refactoring.guru`](https://refactoring.guru/design-patterns/decorator) | [`java-design-patterns`](https://java-design-patterns.com/patterns/decorator/) | [`@ConceptAndCoding`](https://youtu.be/w6a9MXUwcfY?si=KW_bfuG6F35_blZZ) |
+| [Facade](./structural/facade) | [`refactoring.guru`](https://refactoring.guru/design-patterns/facade) | [`java-design-patterns`](https://java-design-patterns.com/patterns/facade/) | [`@ConceptAndCoding`](https://youtu.be/GYaBXK54eLo?si=aCmexb4t3izwlU9d) |
+| [Flyweight](./structural/flyweight) | [`refactoring.guru`](https://refactoring.guru/design-patterns/flyweight) | [`java-design-patterns`](https://java-design-patterns.com/patterns/flyweight/) | |
+| [Proxy](./structural/proxy) | [`refactoring.guru`](https://refactoring.guru/design-patterns/proxy) | [`java-design-patterns`](https://java-design-patterns.com/patterns/proxy/) | [`@ConceptAndCoding`](https://youtu.be/9MxHKlVc6ZM?si=tJME00X4UJ4XJJtc) |
+
+* ### Examples of [Behavioral](./behavioral) Design Patterns with Java:
+
+| Design Pattern | Information | Documentation | Video |
+|:---------------------------------------------:|:--------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------:|
+| [Chain of Responsibility](./behavioral/chain) | [`refactoring.guru`](https://refactoring.guru/design-patterns/chain-of-responsibility) | [`java-design-patterns`](https://java-design-patterns.com/patterns/chain-of-responsibility/) | [`@ConceptAndCoding`](https://youtu.be/gvIn5QBdGDk?si=30kOIX2x7Gx3MlqR) |
+| [Command](./behavioral/command) | [`refactoring.guru`](https://refactoring.guru/design-patterns/command) | [`java-design-patterns`](https://java-design-patterns.com/patterns/command/) | [`@ConceptAndCoding`](https://youtu.be/E1lce5CWhE0?si=X4HIR777Y9ddFjPS) |
+| Interpreter | N/A | [`java-design-patterns`](https://java-design-patterns.com/patterns/interpreter/) | [`@ConceptAndCoding`](https://youtu.be/fFlPm0pzQYI?si=4DuKSD2Qbt1NQFUE) |
+| [Iterator](./behavioral/iterator) | [`refactoring.guru`](https://refactoring.guru/design-patterns/iterator) | [`java-design-patterns`](https://java-design-patterns.com/patterns/iterator/) | [`@ConceptAndCoding`](https://youtu.be/X7shKHOaYtU?si=F7dk7AZjEOaHpLhv) |
+| [Mediator](./behavioral/mediator) | [`refactoring.guru`](https://refactoring.guru/design-patterns/mediator) | [`java-design-patterns`](https://java-design-patterns.com/patterns/mediator/) | |
+| [Memento](./behavioral/memento) | [`refactoring.guru`](https://refactoring.guru/design-patterns/memento) | [`java-design-patterns`](https://java-design-patterns.com/patterns/memento/) | [`@ConceptAndCoding`](https://youtu.be/nTo7e2lpGZ4?si=9wsYjiNs3iG-g0ti) |
+| Null Object | N/A | [`java-design-patterns`](https://java-design-patterns.com/patterns/null-object/) | [`@ConceptAndCoding`](https://youtu.be/iDPhxhamuTo?si=oBsfb-mqRKq764c8) |
+| [Observer](./behavioral/observer) | [`refactoring.guru`](https://refactoring.guru/design-patterns/observer) | [`java-design-patterns`](https://java-design-patterns.com/patterns/observer/) | [`@ConceptAndCoding`](https://youtu.be/Ep9_Zcgst3U?si=Vq--dx8gSRqY7mrH) |
+| [State](./behavioral/state) | [`refactoring.guru`](https://refactoring.guru/design-patterns/state) | [`java-design-patterns`](https://java-design-patterns.com/patterns/state/) | |
+| [Strategy](./behavioral/strategy) | [`refactoring.guru`](https://refactoring.guru/design-patterns/strategy) | [`java-design-patterns`](https://java-design-patterns.com/patterns/strategy/) | [`@ConceptAndCoding`](https://youtu.be/u8DttUrXtEw?si=LskxabetaZKy9gKA) |
+| [Template Method](./behavioral/template) | [`refactoring.guru`](https://refactoring.guru/design-patterns/template-method) | [`java-design-patterns`](https://java-design-patterns.com/patterns/template-method/) | [`@ConceptAndCoding`](https://youtu.be/kwy-G1DEm0M?si=yNZlZCuseVQaUCmT) |
+| [Visitor](./behavioral/visitor) | [`refactoring.guru`](https://refactoring.guru/design-patterns/visitor) | [`java-design-patterns`](https://java-design-patterns.com/patterns/visitor/) | [`@ConceptAndCoding`](https://youtu.be/pDsz-AuFO0g?si=11YASEg0NspKyykR) |
diff --git a/src/practice/behavioral/README.md b/src/practice/behavioral/README.md
new file mode 100644
index 0000000..7687431
--- /dev/null
+++ b/src/practice/behavioral/README.md
@@ -0,0 +1,5 @@
+# Examples of `Behavioral` Design Patterns with Java
+
+### Pluralsight Course: https://www.pluralsight.com/courses/design-patterns-java-behavioral
+
+### YouTube Recap Video: https://youtu.be/DBDnUkTobaE?si=-bXWvLOWm9G9moRa
diff --git a/src/practice/behavioral/chain/Worker.java b/src/practice/behavioral/chain/Worker.java
index 2e1f1db..05b12bd 100644
--- a/src/practice/behavioral/chain/Worker.java
+++ b/src/practice/behavioral/chain/Worker.java
@@ -1,11 +1,13 @@
package practice.behavioral.chain;
+import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.Setter;
import lombok.extern.java.Log;
@Log
@Setter
+@EqualsAndHashCode
public abstract sealed class Worker permits General, Jailer, King, Officer {
protected Worker next; // Worker who is NEXT in CHAIN of Responsibility
diff --git a/src/practice/behavioral/command/SwitchButton.java b/src/practice/behavioral/command/SwitchButton.java
index e154843..2bd72e7 100644
--- a/src/practice/behavioral/command/SwitchButton.java
+++ b/src/practice/behavioral/command/SwitchButton.java
@@ -21,7 +21,7 @@ public void toggleState() {
}
public void printState() {
- var isOn = state ? "ON" : "OFF"; // Determine current state of Switch
+ var isOn = state ? "ON" : "OFF"; // Determine CURRENT state of Switch
log.info("State of <" + location + "> Switch => [" + isOn + "]");
}
}
diff --git a/src/practice/behavioral/observer/Subject.java b/src/practice/behavioral/observer/Subject.java
index 62c74a7..d20d96b 100644
--- a/src/practice/behavioral/observer/Subject.java
+++ b/src/practice/behavioral/observer/Subject.java
@@ -8,5 +8,5 @@ public sealed interface Subject permits Weather {
void detach(@NonNull final Observer watcher);
- void notifyObservers();
+ void notifyObservers(); // UPDATE Observers
}
diff --git a/src/practice/behavioral/observer/Weather.java b/src/practice/behavioral/observer/Weather.java
index a44f955..61c0e53 100644
--- a/src/practice/behavioral/observer/Weather.java
+++ b/src/practice/behavioral/observer/Weather.java
@@ -17,13 +17,13 @@ public final class Weather implements Subject {
@Override
public void attach(@NonNull final Observer watcher) {
- log.info("Attaching Observer => [" + watcher + "]");
+ log.info("ATTACHING Observer => [" + watcher + "]");
observers.add(watcher); // Add OBSERVER to current LIST
}
@Override
public void detach(@NonNull final Observer watcher) {
- log.info("Detaching Observer => [" + watcher + "]");
+ log.info("DETACHING Observer => [" + watcher + "]");
observers.remove(watcher); // Remove OBSERVER from LIST
}
@@ -34,9 +34,9 @@ public void notifyObservers() {
}
public void advanceTime() {
- log.info("Current Weather Type => [" + currentWeatherType + "]");
+ log.info("CURRENT Weather TYPE => [" + currentWeatherType + "]");
currentWeatherType = getFreshWeatherType(WeatherType.values());
- log.info("Changed Weather Type => [" + currentWeatherType + "]");
+ log.info("CHANGED Weather TYPE => [" + currentWeatherType + "]");
notifyObservers(); // Update ALL Watchers of CHANGE in Weather
}
diff --git a/src/practice/behavioral/state/HasCoinState.java b/src/practice/behavioral/state/HasCoinState.java
index 62db595..62eb966 100644
--- a/src/practice/behavioral/state/HasCoinState.java
+++ b/src/practice/behavioral/state/HasCoinState.java
@@ -17,13 +17,13 @@ public void insertCoin(@NonNull final VendorMachine machine) {
@Override
public void ejectCoin(@NonNull final VendorMachine machine) {
- machine.setState(new NoCoinState()); // ALTER State afterwards
+ machine.setState(new NoCoinState()); // ALTER state afterwards
log.info("PASSED in EJECTING Coin => [" + machine + "]");
}
@Override
public void dispenseFood(@NonNull final VendorMachine machine) {
- machine.setState(new NoCoinState()); // ALTER State AFTER Action
+ machine.setState(new NoCoinState()); // ALTER state after action
log.info("PASSED in DISPENSING Food => [" + machine + "]");
}
}
diff --git a/src/practice/behavioral/state/NoCoinState.java b/src/practice/behavioral/state/NoCoinState.java
index 4884c19..ac40a7d 100644
--- a/src/practice/behavioral/state/NoCoinState.java
+++ b/src/practice/behavioral/state/NoCoinState.java
@@ -12,7 +12,7 @@ public final class NoCoinState implements VendorState {
@Override
public void insertCoin(@NonNull final VendorMachine machine) {
- machine.setState(new HasCoinState()); // ALTER State afterwards
+ machine.setState(new HasCoinState()); // ALTER state afterwards
log.info("PASSED in INSERTING Coin => [" + machine + "]");
}
diff --git a/src/practice/behavioral/state/VendorMachine.java b/src/practice/behavioral/state/VendorMachine.java
index 05b2979..7eb30f6 100644
--- a/src/practice/behavioral/state/VendorMachine.java
+++ b/src/practice/behavioral/state/VendorMachine.java
@@ -15,12 +15,12 @@ public final class VendorMachine {
public void insertMoney() {
log.info("ATTEMPT to INSERT Money => [" + this + "]");
- state.insertCoin(this); // Try to INSERT Money
+ state.insertCoin(this); // Attempt to INSERT Money
}
public void ejectMoney() {
log.info("ATTEMPT to EJECT Money => [" + this + "]");
- state.ejectCoin(this); // Try to EJECT Money
+ state.ejectCoin(this); // Attempt to EJECT Money
}
public void dispenseFood() {
diff --git a/src/practice/behavioral/strategy/PaymentGateway.java b/src/practice/behavioral/strategy/PaymentGateway.java
index 15bf84e..bc5902a 100644
--- a/src/practice/behavioral/strategy/PaymentGateway.java
+++ b/src/practice/behavioral/strategy/PaymentGateway.java
@@ -16,7 +16,7 @@ public final class PaymentGateway {
private PaymentStrategy strategy;
public void checkout(@NonNull final int amount) {
- log.info("SELECTED Strategy => " + strategy);
- strategy.pay(amount); // EXECUTE specific Strategy
+ log.info("SELECTED Strategy => [" + strategy + "]");
+ strategy.pay(amount); // EXECUTE this SELECTED Strategy
}
}
diff --git a/src/practice/behavioral/strategy/StrategyDemo.java b/src/practice/behavioral/strategy/StrategyDemo.java
index 4c1b891..d7e2048 100644
--- a/src/practice/behavioral/strategy/StrategyDemo.java
+++ b/src/practice/behavioral/strategy/StrategyDemo.java
@@ -7,7 +7,7 @@ public final class StrategyDemo {
public static void main(final String... arguments) {
- final var gateway = new PaymentGateway();
+ final var gateway = new PaymentGateway(); // SAME Gateway
gateway.setStrategy(new CashPayment("wallet"));
gateway.checkout(1_000); // Make PAYMENT with CASH
diff --git a/src/practice/behavioral/visitor/Captain.java b/src/practice/behavioral/visitor/Captain.java
index 1e4bf41..602d871 100644
--- a/src/practice/behavioral/visitor/Captain.java
+++ b/src/practice/behavioral/visitor/Captain.java
@@ -6,7 +6,7 @@
@ToString
public final class Captain extends ArmyUnit {
- Captain(@NonNull final ArmyUnit... children) {
+ public Captain(@NonNull final ArmyUnit... children) {
super(children);
}
diff --git a/src/practice/behavioral/visitor/Recruit.java b/src/practice/behavioral/visitor/Recruit.java
index caa63c7..a78c5bf 100644
--- a/src/practice/behavioral/visitor/Recruit.java
+++ b/src/practice/behavioral/visitor/Recruit.java
@@ -6,7 +6,7 @@
@ToString
public final class Recruit extends ArmyUnit {
- Recruit(@NonNull final ArmyUnit... children) {
+ public Recruit(@NonNull final ArmyUnit... children) {
super(children);
}
diff --git a/src/practice/behavioral/visitor/Sergeant.java b/src/practice/behavioral/visitor/Sergeant.java
index 1cf1182..7648f1f 100644
--- a/src/practice/behavioral/visitor/Sergeant.java
+++ b/src/practice/behavioral/visitor/Sergeant.java
@@ -6,7 +6,7 @@
@ToString
public final class Sergeant extends ArmyUnit {
- Sergeant(@NonNull final ArmyUnit... children) {
+ public Sergeant(@NonNull final ArmyUnit... children) {
super(children);
}
diff --git a/src/practice/behavioral/visitor/VisitorDemo.java b/src/practice/behavioral/visitor/VisitorDemo.java
index c79343d..23099af 100644
--- a/src/practice/behavioral/visitor/VisitorDemo.java
+++ b/src/practice/behavioral/visitor/VisitorDemo.java
@@ -10,7 +10,7 @@ public static void main(final String[] arguments) {
final var soldier = new Captain(
new Sergeant(new Recruit(), new Recruit()),
new Sergeant(new Recruit(), new Recruit())
- ); // Create CAMP Hierarchy of Soldiers
+ ); // Create Army CAMP hierarchy of Soldiers
soldier.accept(new RecruitFriend());
soldier.accept(new SergeantFriend());
diff --git a/src/practice/creational/README.md b/src/practice/creational/README.md
new file mode 100644
index 0000000..ad51136
--- /dev/null
+++ b/src/practice/creational/README.md
@@ -0,0 +1,5 @@
+# Examples of `Creational` Design Patterns with Java
+
+### Pluralsight Course: https://www.pluralsight.com/courses/java-se-17-creational-design-patterns
+
+### YouTube Recap Video: https://youtu.be/OuNOyFg942M?si=AykaiZsmEG7qHfhx
diff --git a/src/practice/creational/builder/BuilderDemo.java b/src/practice/creational/builder/BuilderDemo.java
index 6782ee1..7611f1a 100644
--- a/src/practice/creational/builder/BuilderDemo.java
+++ b/src/practice/creational/builder/BuilderDemo.java
@@ -1,9 +1,6 @@
package practice.creational.builder;
import practice.creational.builder.CustomPizza.PizzaChef;
-import practice.creational.builder.PizzaElement.DoughType;
-import practice.creational.builder.PizzaElement.SauceType;
-import practice.creational.builder.PizzaElement.ToppingType;
/**
* Example of Builder Design Pattern
@@ -12,10 +9,10 @@ public final class BuilderDemo {
public static void main(final String... arguments) {
- new PizzaChef(DoughType.BAKED).setSauceType(SauceType.HOT)
- .setTopping(ToppingType.CAPSICUM_MUSHROOM).cookPizza().eatPizza();
+ new PizzaChef(PizzaElement.DoughType.BAKED).setSauceType(PizzaElement.SauceType.HOT)
+ .setTopping(PizzaElement.ToppingType.CAPSICUM_MUSHROOM).cookPizza().eatPizza();
- new PizzaChef(DoughType.CROSS).setSauceType(SauceType.MILD)
- .setTopping(ToppingType.CHEESE_CORN_TOMATO).cookPizza().eatPizza();
+ new PizzaChef(PizzaElement.DoughType.CROSS).setSauceType(PizzaElement.SauceType.MILD)
+ .setTopping(PizzaElement.ToppingType.CHEESE_CORN_TOMATO).cookPizza().eatPizza();
}
}
diff --git a/src/practice/creational/builder/CustomPizza.java b/src/practice/creational/builder/CustomPizza.java
index 8524a53..2d105c1 100644
--- a/src/practice/creational/builder/CustomPizza.java
+++ b/src/practice/creational/builder/CustomPizza.java
@@ -23,7 +23,7 @@ public final class CustomPizza {
private final PizzaElement.ToppingType topping;
public void eatPizza() {
- log.info("EATING Pizza => " + this);
+ log.info("EATING the Pizza => [" + this + "]");
}
@Setter
@@ -40,7 +40,7 @@ protected static final class PizzaChef {
private PizzaElement.ToppingType topping;
public CustomPizza cookPizza() {
- log.info("COOKING Pizza => " + this); // In OVEN
+ log.info("COOKING the Pizza => [" + this + "]");
return new CustomPizza(doughType, sauceType, topping);
}
}
diff --git a/src/practice/creational/pool/PoolDemo.java b/src/practice/creational/pool/PoolDemo.java
index a0e6f9f..bfae755 100644
--- a/src/practice/creational/pool/PoolDemo.java
+++ b/src/practice/creational/pool/PoolDemo.java
@@ -31,7 +31,7 @@ public static void main(final String[] arguments) {
objectPool.status(); // CURRENT status
- objectPool.remit(personObj3); // REMIT
- objectPool.status(); // CURRENT status
+ objectPool.remit(personObj3); // BACK
+ objectPool.status(); // FINALE status
}
}
diff --git a/src/practice/structural/README.md b/src/practice/structural/README.md
new file mode 100644
index 0000000..29ca652
--- /dev/null
+++ b/src/practice/structural/README.md
@@ -0,0 +1,5 @@
+# Examples of `Structural` Design Patterns with Java
+
+### Pluralsight Course: https://www.pluralsight.com/courses/design-patterns-java-structural
+
+### YouTube Recap Video: https://youtu.be/WxGtmIBZszk?si=GUdKyp6vGiS4g94Q
diff --git a/src/practice/structural/composite/HeadDepartment.java b/src/practice/structural/composite/HeadDepartment.java
index e2633c4..ae0563e 100644
--- a/src/practice/structural/composite/HeadDepartment.java
+++ b/src/practice/structural/composite/HeadDepartment.java
@@ -20,16 +20,16 @@ public final class HeadDepartment implements Department {
@NonNull
private final String name;
- public void addDepartment(Department department) {
- departments.add(department);
+ public void addDepartment(@NonNull final Department department) {
+ departments.add(department); // ADD any SINGLE element in list
}
- public void addDepartments(Department... departments) {
- this.departments.addAll(List.of(departments));
+ public void addDepartments(@NonNull final Department... departments) {
+ this.departments.addAll(List.of(departments)); // ADD multiple items
}
- public void removeDepartment(Department department) {
- departments.remove(department);
+ public void removeDepartment(@NonNull final Department department) {
+ departments.remove(department); // REMOVE any particular element
}
@Override