+ + save(customer : CustomerDto)
+ }
+}
+CustomerResource --> "-customers" CustomerDto
+@enduml
\ No newline at end of file
diff --git a/data-transfer-object/pom.xml b/data-transfer-object/pom.xml
new file mode 100644
index 000000000..2f4871cb6
--- /dev/null
+++ b/data-transfer-object/pom.xml
@@ -0,0 +1,45 @@
+
+
+
+ 4.0.0
+
+ com.iluwatar
+ java-design-patterns
+ 1.17.0-SNAPSHOT
+
+ data-transfer-object
+
+
+ junit
+ junit
+ test
+
+
+ log4j
+ log4j
+
+
+
diff --git a/data-transfer-object/src/main/java/com/iluwatar/datatransfer/CustomerClientApp.java b/data-transfer-object/src/main/java/com/iluwatar/datatransfer/CustomerClientApp.java
new file mode 100644
index 000000000..f5fcebe03
--- /dev/null
+++ b/data-transfer-object/src/main/java/com/iluwatar/datatransfer/CustomerClientApp.java
@@ -0,0 +1,84 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2017 Gopinath Langote
+ *
+ * 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.datatransfer;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The Data Transfer Object pattern is a design pattern in which an data transfer object is used to serve related
+ * information together to avoid multiple call for each piece of information.
+ *
+ * In this example, ({@link CustomerClientApp}) as as customer details consumer i.e. client to request for
+ * customer details to server.
+ *
+ * CustomerResource ({@link CustomerResource}) act as server to serve customer information.
+ * And The CustomerDto ({@link CustomerDto} is data transfer object to share customer information.
+ */
+public class CustomerClientApp {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CustomerClientApp.class);
+
+ /**
+ * Method as act client and request to server for details.
+ *
+ * @param args program argument.
+ */
+ public static void main(String[] args) {
+ List customers = new ArrayList<>();
+ CustomerDto customerOne = new CustomerDto("1", "Kelly", "Brown");
+ CustomerDto customerTwo = new CustomerDto("2", "Alfonso", "Bass");
+ customers.add(customerOne);
+ customers.add(customerTwo);
+
+ CustomerResource customerResource = new CustomerResource(customers);
+
+ LOGGER.info("All customers:-");
+ List allCustomers = customerResource.getAllCustomers();
+ printCustomerDetails(allCustomers);
+
+ LOGGER.info("----------------------------------------------------------");
+
+ LOGGER.info("Deleting customer with id {1}");
+ customerResource.delete(customerOne.getId());
+ allCustomers = customerResource.getAllCustomers();
+ printCustomerDetails(allCustomers);
+
+ LOGGER.info("----------------------------------------------------------");
+
+ LOGGER.info("Adding customer three}");
+ CustomerDto customerThree = new CustomerDto("3", "Lynda", "Blair");
+ customerResource.save(customerThree);
+ allCustomers = customerResource.getAllCustomers();
+ printCustomerDetails(allCustomers);
+ }
+
+ private static void printCustomerDetails(List allCustomers) {
+ allCustomers.forEach(customer -> LOGGER.info(customer.getFirstName()));
+ }
+}
diff --git a/data-transfer-object/src/main/java/com/iluwatar/datatransfer/CustomerDto.java b/data-transfer-object/src/main/java/com/iluwatar/datatransfer/CustomerDto.java
new file mode 100644
index 000000000..7dedf891c
--- /dev/null
+++ b/data-transfer-object/src/main/java/com/iluwatar/datatransfer/CustomerDto.java
@@ -0,0 +1,60 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2017 Gopinath Langote
+ *
+ * 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.datatransfer;
+
+/**
+ * {@link CustomerDto} is a data transfer object POJO. Instead of sending individual information to client
+ * We can send related information together in POJO.
+ *
+ * Dto will not have any business logic in it.
+ */
+public class CustomerDto {
+ private final String id;
+ private final String firstName;
+ private final String lastName;
+
+ /**
+ * @param id customer id
+ * @param firstName customer first name
+ * @param lastName customer last name
+ */
+ public CustomerDto(String id, String firstName, String lastName) {
+ this.id = id;
+ this.firstName = firstName;
+ this.lastName = lastName;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+}
diff --git a/data-transfer-object/src/main/java/com/iluwatar/datatransfer/CustomerResource.java b/data-transfer-object/src/main/java/com/iluwatar/datatransfer/CustomerResource.java
new file mode 100644
index 000000000..a4926d08c
--- /dev/null
+++ b/data-transfer-object/src/main/java/com/iluwatar/datatransfer/CustomerResource.java
@@ -0,0 +1,63 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2017 Gopinath Langote
+ *
+ * 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.datatransfer;
+
+import java.util.List;
+
+/**
+ * The resource class which serves customer information.
+ * This class act as server in the demo. Which has all customer details.
+ */
+public class CustomerResource {
+ private List customers;
+
+ /**
+ * @param customers initialize resource with existing customers. Act as database.
+ */
+ public CustomerResource(List customers) {
+ this.customers = customers;
+ }
+
+ /**
+ * @return : all customers in list.
+ */
+ public List getAllCustomers() {
+ return customers;
+ }
+
+ /**
+ * @param customer save new customer to list.
+ */
+ public void save(CustomerDto customer) {
+ customers.add(customer);
+ }
+
+ /**
+ * @param customerId delete customer with id {@code customerId}
+ */
+ public void delete(String customerId) {
+ customers.removeIf(customer -> customer.getId().equals(customerId));
+ }
+}
\ No newline at end of file
diff --git a/data-transfer-object/src/test/java/com/iluwatar/datatransfer/CustomerResourceTest.java b/data-transfer-object/src/test/java/com/iluwatar/datatransfer/CustomerResourceTest.java
new file mode 100644
index 000000000..adfe66b7d
--- /dev/null
+++ b/data-transfer-object/src/test/java/com/iluwatar/datatransfer/CustomerResourceTest.java
@@ -0,0 +1,81 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2017 Gopinath Langote
+ *
+ * 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.datatransfer;
+
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * tests {@link CustomerResource}.
+ */
+public class CustomerResourceTest {
+ @Test
+ public void shouldGetAllCustomers() {
+ CustomerDto customer = new CustomerDto("1", "Melody", "Yates");
+ List customers = new ArrayList<>();
+ customers.add(customer);
+
+ CustomerResource customerResource = new CustomerResource(customers);
+
+ List allCustomers = customerResource.getAllCustomers();
+
+ assertEquals(allCustomers.size(), 1);
+ assertEquals(allCustomers.get(0).getId(), "1");
+ assertEquals(allCustomers.get(0).getFirstName(), "Melody");
+ assertEquals(allCustomers.get(0).getLastName(), "Yates");
+ }
+
+ @Test
+ public void shouldSaveCustomer() {
+ CustomerDto customer = new CustomerDto("1", "Rita", "Reynolds");
+ CustomerResource customerResource = new CustomerResource(new ArrayList<>());
+
+ customerResource.save(customer);
+
+ List allCustomers = customerResource.getAllCustomers();
+ assertEquals(allCustomers.get(0).getId(), "1");
+ assertEquals(allCustomers.get(0).getFirstName(), "Rita");
+ assertEquals(allCustomers.get(0).getLastName(), "Reynolds");
+ }
+
+ @Test
+ public void shouldDeleteCustomer() {
+ CustomerDto customer = new CustomerDto("1", "Terry", "Nguyen");
+ List customers = new ArrayList<>();
+ customers.add(customer);
+
+ CustomerResource customerResource = new CustomerResource(customers);
+
+ customerResource.delete(customer.getId());
+
+ List allCustomers = customerResource.getAllCustomers();
+ assertEquals(allCustomers.size(), 0);
+ }
+
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 4976c14d5..992537f9b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -143,6 +143,7 @@
extension-objects
marker
cqrs
+ data-transfer-object