From 1cad280629d2780ca7866d559e0c155a0e0df5a1 Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Wed, 4 Mar 2015 22:59:42 +0200 Subject: [PATCH] Added Null Object pattern. --- null-object/etc/test.png | Bin 0 -> 16737 bytes null-object/etc/test.ucls | 61 ++++++++++++++++++ null-object/pom.xml | 18 ++++++ .../src/main/java/com/iluwatar/App.java | 32 +++++++++ .../src/main/java/com/iluwatar/Node.java | 15 +++++ .../src/main/java/com/iluwatar/NodeImpl.java | 50 ++++++++++++++ .../src/main/java/com/iluwatar/NullNode.java | 33 ++++++++++ .../src/test/java/com/iluwatar/AppTest.java | 12 ++++ pom.xml | 8 +-- 9 files changed, 225 insertions(+), 4 deletions(-) create mode 100644 null-object/etc/test.png create mode 100644 null-object/etc/test.ucls create mode 100644 null-object/pom.xml create mode 100644 null-object/src/main/java/com/iluwatar/App.java create mode 100644 null-object/src/main/java/com/iluwatar/Node.java create mode 100644 null-object/src/main/java/com/iluwatar/NodeImpl.java create mode 100644 null-object/src/main/java/com/iluwatar/NullNode.java create mode 100644 null-object/src/test/java/com/iluwatar/AppTest.java diff --git a/null-object/etc/test.png b/null-object/etc/test.png new file mode 100644 index 0000000000000000000000000000000000000000..a29c0a617b22c7cd8b815e9fee764a2b30e71eef GIT binary patch literal 16737 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 literal 0 HcmV?d00001 diff --git a/null-object/etc/test.ucls b/null-object/etc/test.ucls new file mode 100644 index 000000000..569663338 --- /dev/null +++ b/null-object/etc/test.ucls @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/null-object/pom.xml b/null-object/pom.xml new file mode 100644 index 000000000..276631e6a --- /dev/null +++ b/null-object/pom.xml @@ -0,0 +1,18 @@ + + + 4.0.0 + + com.iluwatar + java-design-patterns + 1.0-SNAPSHOT + + null-object + + + junit + junit + test + + + diff --git a/null-object/src/main/java/com/iluwatar/App.java b/null-object/src/main/java/com/iluwatar/App.java new file mode 100644 index 000000000..4bba5af29 --- /dev/null +++ b/null-object/src/main/java/com/iluwatar/App.java @@ -0,0 +1,32 @@ +package com.iluwatar; + +/** + * + * Null Object pattern replaces null values with neutral objects. + * Many times this simplifies algorithms since no extra null checks + * are needed. + * + * In this example we build a binary tree where the nodes are either + * normal or Null Objects. No null values are used in the tree making + * the traversal easy. + * + */ +public class App +{ + public static void main( String[] args ) { + + Node root = new NodeImpl("1", + new NodeImpl("11", + new NodeImpl("111", + new NullNode(), + new NullNode()), + new NullNode()), + new NodeImpl("12", + new NullNode(), + new NodeImpl("122", + new NullNode(), + new NullNode()))); + + root.walk(); + } +} diff --git a/null-object/src/main/java/com/iluwatar/Node.java b/null-object/src/main/java/com/iluwatar/Node.java new file mode 100644 index 000000000..1bb94927f --- /dev/null +++ b/null-object/src/main/java/com/iluwatar/Node.java @@ -0,0 +1,15 @@ +package com.iluwatar; + +/** + * + * Interface for binary tree node. + * + */ +public interface Node { + + String getName(); + int getTreeSize(); + Node getLeft(); + Node getRight(); + void walk(); +} diff --git a/null-object/src/main/java/com/iluwatar/NodeImpl.java b/null-object/src/main/java/com/iluwatar/NodeImpl.java new file mode 100644 index 000000000..dbd5a7eca --- /dev/null +++ b/null-object/src/main/java/com/iluwatar/NodeImpl.java @@ -0,0 +1,50 @@ +package com.iluwatar; + +/** + * + * Implementation for binary tree's normal nodes. + * + */ +public class NodeImpl implements Node { + + private final String name; + private final Node left; + private final Node right; + + public NodeImpl(String name, Node left, Node right) { + this.name = name; + this.left = left; + this.right = right; + } + + @Override + public int getTreeSize() { + return 1 + left.getTreeSize() + right.getTreeSize(); + } + + @Override + public Node getLeft() { + return left; + } + + @Override + public Node getRight() { + return right; + } + + @Override + public String getName() { + return name; + } + + @Override + public void walk() { + System.out.println(name); + if (left.getTreeSize() > 0) { + left.walk(); + } + if (right.getTreeSize() > 0) { + right.walk(); + } + } +} diff --git a/null-object/src/main/java/com/iluwatar/NullNode.java b/null-object/src/main/java/com/iluwatar/NullNode.java new file mode 100644 index 000000000..5f0b440be --- /dev/null +++ b/null-object/src/main/java/com/iluwatar/NullNode.java @@ -0,0 +1,33 @@ +package com.iluwatar; + +/** + * + * Null Object implementation for binary tree node. + * + */ +public class NullNode implements Node { + + @Override + public int getTreeSize() { + return 0; + } + + @Override + public Node getLeft() { + return null; + } + + @Override + public Node getRight() { + return null; + } + + @Override + public String getName() { + return null; + } + + @Override + public void walk() { + } +} diff --git a/null-object/src/test/java/com/iluwatar/AppTest.java b/null-object/src/test/java/com/iluwatar/AppTest.java new file mode 100644 index 000000000..6db5ad214 --- /dev/null +++ b/null-object/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 da149fdf8..92d10e951 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,5 @@ - + 4.0.0 com.iluwatar @@ -39,7 +38,8 @@ double-checked-locking servant service-locator - + null-object + @@ -67,4 +67,4 @@ - + \ No newline at end of file