From bf2df42c55f284ffc851d2f75bbe1beaeb4d7242 Mon Sep 17 00:00:00 2001 From: vehpsr Date: Thu, 26 Mar 2015 22:47:04 +0200 Subject: [PATCH] added Callback pattern --- README.md | 9 ++++ callback/etc/callback.jpg | Bin 0 -> 15478 bytes callback/etc/callback.ucls | 41 ++++++++++++++++++ callback/pom.xml | 18 ++++++++ callback/src/main/java/com/iluwatar/App.java | 19 ++++++++ .../src/main/java/com/iluwatar/Callback.java | 9 ++++ .../main/java/com/iluwatar/SimpleTask.java | 13 ++++++ callback/src/main/java/com/iluwatar/Task.java | 16 +++++++ .../src/test/java/com/iluwatar/AppTest.java | 12 +++++ pom.xml | 5 ++- 10 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 callback/etc/callback.jpg create mode 100644 callback/etc/callback.ucls create mode 100644 callback/pom.xml create mode 100644 callback/src/main/java/com/iluwatar/App.java create mode 100644 callback/src/main/java/com/iluwatar/Callback.java create mode 100644 callback/src/main/java/com/iluwatar/SimpleTask.java create mode 100644 callback/src/main/java/com/iluwatar/Task.java create mode 100644 callback/src/test/java/com/iluwatar/AppTest.java diff --git a/README.md b/README.md index 464de466d..24735a590 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ Behavioral patterns are concerned with algorithms and the assignment of responsi * [Visitor](#visitor) * [Double Checked Locking](#double-checked-locking) * [Null Object](#null-object) +* [Callback](#callback) ## Abstract Factory [↑](#list-of-design-patterns) **Intent:** Provide an interface for creating families of related or dependent objects without specifying their concrete classes. @@ -412,6 +413,14 @@ Behavioral patterns are concerned with algorithms and the assignment of responsi **Applicability:** Use the Event Aggregator pattern when * Event Aggregator is a good choice when you have lots of objects that are potential event sources. Rather than have the observer deal with registering with them all, you can centralize the registration logic to the Event Aggregator. As well as simplifying registration, a Event Aggregator also simplifies the memory management issues in using observers. +## Callback [↑](#list-of-design-patterns) +**Intent:** Callback is a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time. + +![alt text](https://github.com/iluwatar/java-design-patterns/blob/master/callback/etc/callback.jpg "Callback") + +**Applicability:** Use the Callback pattern when +* When some arbitrary synchronous or asynchronous action must be performed after execution of some defined activity. + # Frequently asked questions diff --git a/callback/etc/callback.jpg b/callback/etc/callback.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2462970d99fb458f9648ecee4b09f9988202b2a2 GIT binary patch literal 15478 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/callback/pom.xml b/callback/pom.xml new file mode 100644 index 000000000..96a7aabd7 --- /dev/null +++ b/callback/pom.xml @@ -0,0 +1,18 @@ + + + 4.0.0 + + com.iluwatar + java-design-patterns + 1.0-SNAPSHOT + + callback + + + junit + junit + test + + + diff --git a/callback/src/main/java/com/iluwatar/App.java b/callback/src/main/java/com/iluwatar/App.java new file mode 100644 index 000000000..6a36d66d7 --- /dev/null +++ b/callback/src/main/java/com/iluwatar/App.java @@ -0,0 +1,19 @@ +package com.iluwatar; + +/** + * Callback pattern is more native for dynamic languages where function are first-class citizen. + * Prior to Java8 can be simulated using simple (alike command) interfaces. + */ +public class App { + + public static void main(String[] args) { + Task task = new SimpleTask(); + Callback callback = new Callback() { + @Override + public void call() { + System.out.println("I'm done now."); + } + }; + task.executeWith(callback); + } +} diff --git a/callback/src/main/java/com/iluwatar/Callback.java b/callback/src/main/java/com/iluwatar/Callback.java new file mode 100644 index 000000000..f1c0baf75 --- /dev/null +++ b/callback/src/main/java/com/iluwatar/Callback.java @@ -0,0 +1,9 @@ +package com.iluwatar; + +/** + * Callback interface + */ +public interface Callback { + + public void call(); +} diff --git a/callback/src/main/java/com/iluwatar/SimpleTask.java b/callback/src/main/java/com/iluwatar/SimpleTask.java new file mode 100644 index 000000000..703474a90 --- /dev/null +++ b/callback/src/main/java/com/iluwatar/SimpleTask.java @@ -0,0 +1,13 @@ +package com.iluwatar; + +/** + * Implementation of task that need to be executed + */ +public class SimpleTask extends Task { + + @Override + public void execute() { + System.out.println("Perform some important activity."); + } + +} diff --git a/callback/src/main/java/com/iluwatar/Task.java b/callback/src/main/java/com/iluwatar/Task.java new file mode 100644 index 000000000..ad3a0f14b --- /dev/null +++ b/callback/src/main/java/com/iluwatar/Task.java @@ -0,0 +1,16 @@ +package com.iluwatar; + +/** + * Template-method class for callback hook execution + */ +public abstract class Task { + + public final void executeWith(Callback callback) { + execute(); + if (callback != null) { + callback.call(); + } + } + + public abstract void execute(); +} diff --git a/callback/src/test/java/com/iluwatar/AppTest.java b/callback/src/test/java/com/iluwatar/AppTest.java new file mode 100644 index 000000000..6db5ad214 --- /dev/null +++ b/callback/src/test/java/com/iluwatar/AppTest.java @@ -0,0 +1,12 @@ +package com.iluwatar; + +import org.junit.Test; + +public class AppTest { + + @Test + public void test() { + String[] args = {}; + App.main(args); + } +} diff --git a/pom.xml b/pom.xml index 7316f65f2..7cfff29c4 100644 --- a/pom.xml +++ b/pom.xml @@ -38,8 +38,9 @@ double-checked-locking servant service-locator - null-object - event-aggregator + null-object + event-aggregator + callback