Skip to content

Commit 50986fa

Browse files
committed
iluwatar#590 arrange Layers into packages and add explanation
1 parent 8ecdee4 commit 50986fa

22 files changed

+164
-40
lines changed

layers/README.md

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ tags:
1212
---
1313

1414
## Intent
15-
Layers is an architectural style where software responsibilities are
15+
Layers is an architectural pattern where software responsibilities are
1616
divided among the different layers of the application.
1717

1818
![alt text](./etc/layers.png "Layers")
@@ -24,6 +24,84 @@ Use the Layers architecture when
2424
* you want to prevent a change from propagating throughout the application
2525
* you want to make your application more maintainable and testable
2626

27+
## Explanation
28+
29+
Real world example
30+
31+
> Consider a web site displaying decorated cakes for weddings and such. Instead of the web page directly reaching into the database, it relies on a service to deliver this information. The service then queries the data layer to assimilate the needed information.
32+
33+
In Plain Words
34+
35+
> With Layers architectural pattern different concerns reside on separate layers. View layer is interested only in rendering, service layer assembles the requested data from various sources, and data layer gets the bits from the data storage.
36+
37+
Wikipedia says
38+
39+
> In software engineering, multitier architecture (often referred to as n-tier architecture) or multilayered architecture is a client–server architecture in which presentation, application processing, and data management functions are physically separated.
40+
41+
**Programmatic Example**
42+
43+
On the data layer, we keep our cake building blocks. Cakes consist of layers and topping.
44+
45+
```java
46+
@Entity
47+
public class Cake {
48+
49+
@Id
50+
@GeneratedValue
51+
private Long id;
52+
53+
@OneToOne(cascade = CascadeType.REMOVE)
54+
private CakeTopping topping;
55+
56+
@OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER)
57+
private Set<CakeLayer> layers;
58+
}
59+
```
60+
61+
The service layer offers CakeBakingService for easy access to different aspects of cakes.
62+
63+
```java
64+
public interface CakeBakingService {
65+
66+
void bakeNewCake(CakeInfo cakeInfo) throws CakeBakingException;
67+
68+
List<CakeInfo> getAllCakes();
69+
70+
void saveNewTopping(CakeToppingInfo toppingInfo);
71+
72+
List<CakeToppingInfo> getAvailableToppings();
73+
74+
void saveNewLayer(CakeLayerInfo layerInfo);
75+
76+
List<CakeLayerInfo> getAvailableLayers();
77+
}
78+
```
79+
80+
On the top we have our view responsible of rendering the cakes.
81+
82+
```java
83+
public interface View {
84+
85+
void render();
86+
87+
}
88+
89+
public class CakeViewImpl implements View {
90+
91+
private static final Logger LOGGER = LoggerFactory.getLogger(CakeViewImpl.class);
92+
93+
private CakeBakingService cakeBakingService;
94+
95+
public CakeViewImpl(CakeBakingService cakeBakingService) {
96+
this.cakeBakingService = cakeBakingService;
97+
}
98+
99+
public void render() {
100+
cakeBakingService.getAllCakes().forEach(cake -> LOGGER.info(cake.toString()));
101+
}
102+
}
103+
```
104+
27105
## Credits
28106

29107
* [Pattern Oriented Software Architecture Vol I-V](http://www.amazon.com/Pattern-Oriented-Software-Architecture-Volume-Patterns/dp/0471958697)

layers/etc/layers.ucls

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<class-diagram version="1.1.8" icons="true" automaticImage="PNG" always-add-relationships="false" generalizations="true"
33
realizations="true" associations="true" dependencies="false" nesting-relationships="true">
4-
<interface id="1" language="java" name="com.iluwatar.layers.CakeDao" project="layers"
4+
<interface id="1" language="java" name="com.iluwatar.layers.dao.CakeDao" project="layers"
55
file="/layers/src/main/java/com/iluwatar/layers/CakeDao.java" binary="false" corner="BOTTOM_RIGHT">
66
<position height="-1" width="-1" x="289" y="916"/>
77
<display autosize="true" stereotype="true" package="true" initial-value="false" signature="true"
@@ -10,7 +10,7 @@
1010
<operations public="true" package="true" protected="true" private="true" static="true"/>
1111
</display>
1212
</interface>
13-
<class id="2" language="java" name="com.iluwatar.layers.CakeLayer" project="layers"
13+
<class id="2" language="java" name="com.iluwatar.layers.entity.CakeLayer" project="layers"
1414
file="/layers/src/main/java/com/iluwatar/layers/CakeLayer.java" binary="false" corner="BOTTOM_RIGHT">
1515
<position height="-1" width="-1" x="1438" y="826"/>
1616
<display autosize="true" stereotype="true" package="true" initial-value="false" signature="true"
@@ -19,7 +19,7 @@
1919
<operations public="true" package="true" protected="true" private="true" static="true"/>
2020
</display>
2121
</class>
22-
<class id="3" language="java" name="com.iluwatar.layers.CakeViewImpl" project="layers"
22+
<class id="3" language="java" name="com.iluwatar.layers.view.CakeViewImpl" project="layers"
2323
file="/layers/src/main/java/com/iluwatar/layers/CakeViewImpl.java" binary="false" corner="BOTTOM_RIGHT">
2424
<position height="-1" width="-1" x="456" y="221"/>
2525
<display autosize="true" stereotype="true" package="true" initial-value="false" signature="true"
@@ -28,7 +28,7 @@
2828
<operations public="true" package="true" protected="true" private="true" static="true"/>
2929
</display>
3030
</class>
31-
<class id="4" language="java" name="com.iluwatar.layers.CakeBakingException" project="layers"
31+
<class id="4" language="java" name="com.iluwatar.layers.exception.CakeBakingException" project="layers"
3232
file="/layers/src/main/java/com/iluwatar/layers/CakeBakingException.java" binary="false" corner="BOTTOM_RIGHT">
3333
<position height="-1" width="-1" x="143" y="502"/>
3434
<display autosize="true" stereotype="true" package="true" initial-value="false" signature="true"
@@ -37,7 +37,7 @@
3737
<operations public="true" package="true" protected="true" private="true" static="true"/>
3838
</display>
3939
</class>
40-
<class id="5" language="java" name="com.iluwatar.layers.CakeBakingServiceImpl" project="layers"
40+
<class id="5" language="java" name="com.iluwatar.layers.service.CakeBakingServiceImpl" project="layers"
4141
file="/layers/src/main/java/com/iluwatar/layers/CakeBakingServiceImpl.java" binary="false" corner="BOTTOM_RIGHT">
4242
<position height="-1" width="-1" x="456" y="694"/>
4343
<display autosize="true" stereotype="true" package="true" initial-value="false" signature="true"
@@ -46,7 +46,7 @@
4646
<operations public="true" package="true" protected="true" private="true" static="true"/>
4747
</display>
4848
</class>
49-
<interface id="6" language="java" name="com.iluwatar.layers.CakeLayerDao" project="layers"
49+
<interface id="6" language="java" name="com.iluwatar.layers.dao.CakeLayerDao" project="layers"
5050
file="/layers/src/main/java/com/iluwatar/layers/CakeLayerDao.java" binary="false" corner="BOTTOM_RIGHT">
5151
<position height="-1" width="-1" x="456" y="918"/>
5252
<display autosize="true" stereotype="true" package="true" initial-value="false" signature="true"
@@ -55,7 +55,7 @@
5555
<operations public="true" package="true" protected="true" private="true" static="true"/>
5656
</display>
5757
</interface>
58-
<interface id="7" language="java" name="com.iluwatar.layers.View" project="layers"
58+
<interface id="7" language="java" name="com.iluwatar.layers.view.View" project="layers"
5959
file="/layers/src/main/java/com/iluwatar/layers/View.java" binary="false" corner="BOTTOM_RIGHT">
6060
<position height="-1" width="-1" x="456" y="65"/>
6161
<display autosize="true" stereotype="true" package="true" initial-value="false" signature="true"
@@ -64,7 +64,7 @@
6464
<operations public="true" package="true" protected="true" private="true" static="true"/>
6565
</display>
6666
</interface>
67-
<class id="8" language="java" name="com.iluwatar.layers.CakeToppingInfo" project="layers"
67+
<class id="8" language="java" name="com.iluwatar.layers.dto.CakeToppingInfo" project="layers"
6868
file="/layers/src/main/java/com/iluwatar/layers/CakeToppingInfo.java" binary="false" corner="BOTTOM_RIGHT">
6969
<position height="-1" width="-1" x="817" y="530"/>
7070
<display autosize="true" stereotype="true" package="true" initial-value="false" signature="true"
@@ -73,7 +73,7 @@
7373
<operations public="true" package="true" protected="true" private="true" static="true"/>
7474
</display>
7575
</class>
76-
<class id="9" language="java" name="com.iluwatar.layers.CakeInfo" project="layers"
76+
<class id="9" language="java" name="com.iluwatar.layers.dto.CakeInfo" project="layers"
7777
file="/layers/src/main/java/com/iluwatar/layers/CakeInfo.java" binary="false" corner="BOTTOM_RIGHT">
7878
<position height="-1" width="-1" x="883" y="265"/>
7979
<display autosize="true" stereotype="true" package="true" initial-value="false" signature="true"
@@ -82,7 +82,7 @@
8282
<operations public="true" package="true" protected="true" private="true" static="true"/>
8383
</display>
8484
</class>
85-
<interface id="10" language="java" name="com.iluwatar.layers.CakeToppingDao" project="layers"
85+
<interface id="10" language="java" name="com.iluwatar.layers.dao.CakeToppingDao" project="layers"
8686
file="/layers/src/main/java/com/iluwatar/layers/CakeToppingDao.java" binary="false" corner="BOTTOM_RIGHT">
8787
<position height="-1" width="-1" x="633" y="918"/>
8888
<display autosize="true" stereotype="true" package="true" initial-value="false" signature="true"
@@ -91,7 +91,7 @@
9191
<operations public="true" package="true" protected="true" private="true" static="true"/>
9292
</display>
9393
</interface>
94-
<interface id="11" language="java" name="com.iluwatar.layers.CakeBakingService" project="layers"
94+
<interface id="11" language="java" name="com.iluwatar.layers.service.CakeBakingService" project="layers"
9595
file="/layers/src/main/java/com/iluwatar/layers/CakeBakingService.java" binary="false" corner="BOTTOM_RIGHT">
9696
<position height="-1" width="-1" x="456" y="431"/>
9797
<display autosize="true" stereotype="true" package="true" initial-value="false" signature="true"
@@ -100,7 +100,7 @@
100100
<operations public="true" package="true" protected="true" private="true" static="true"/>
101101
</display>
102102
</interface>
103-
<class id="12" language="java" name="com.iluwatar.layers.CakeLayerInfo" project="layers"
103+
<class id="12" language="java" name="com.iluwatar.layers.dto.CakeLayerInfo" project="layers"
104104
file="/layers/src/main/java/com/iluwatar/layers/CakeLayerInfo.java" binary="false" corner="BOTTOM_RIGHT">
105105
<position height="-1" width="-1" x="1055" y="530"/>
106106
<display autosize="true" stereotype="true" package="true" initial-value="false" signature="true"
@@ -109,7 +109,7 @@
109109
<operations public="true" package="true" protected="true" private="true" static="true"/>
110110
</display>
111111
</class>
112-
<class id="13" language="java" name="com.iluwatar.layers.Cake" project="layers"
112+
<class id="13" language="java" name="com.iluwatar.layers.entity.Cake" project="layers"
113113
file="/layers/src/main/java/com/iluwatar/layers/Cake.java" binary="false" corner="BOTTOM_RIGHT">
114114
<position height="-1" width="-1" x="1160" y="826"/>
115115
<display autosize="true" stereotype="true" package="true" initial-value="false" signature="true"
@@ -118,7 +118,7 @@
118118
<operations public="true" package="true" protected="true" private="true" static="true"/>
119119
</display>
120120
</class>
121-
<class id="14" language="java" name="com.iluwatar.layers.CakeTopping" project="layers"
121+
<class id="14" language="java" name="com.iluwatar.layers.entity.CakeTopping" project="layers"
122122
file="/layers/src/main/java/com/iluwatar/layers/CakeTopping.java" binary="false" corner="BOTTOM_RIGHT">
123123
<position height="-1" width="-1" x="876" y="826"/>
124124
<display autosize="true" stereotype="true" package="true" initial-value="false" signature="true"

layers/src/main/java/com/iluwatar/layers/App.java renamed to layers/src/main/java/com/iluwatar/layers/app/App.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,21 @@
2121
* THE SOFTWARE.
2222
*/
2323

24-
package com.iluwatar.layers;
24+
package com.iluwatar.layers.app;
2525

26+
import com.iluwatar.layers.dao.CakeDao;
27+
import com.iluwatar.layers.dao.CakeLayerDao;
28+
import com.iluwatar.layers.dao.CakeToppingDao;
29+
import com.iluwatar.layers.dto.CakeInfo;
30+
import com.iluwatar.layers.dto.CakeLayerInfo;
31+
import com.iluwatar.layers.dto.CakeToppingInfo;
32+
import com.iluwatar.layers.entity.Cake;
33+
import com.iluwatar.layers.entity.CakeLayer;
34+
import com.iluwatar.layers.entity.CakeTopping;
35+
import com.iluwatar.layers.exception.CakeBakingException;
36+
import com.iluwatar.layers.service.CakeBakingService;
37+
import com.iluwatar.layers.service.CakeBakingServiceImpl;
38+
import com.iluwatar.layers.view.CakeViewImpl;
2639
import java.util.List;
2740

2841
/**

layers/src/main/java/com/iluwatar/layers/CakeDao.java renamed to layers/src/main/java/com/iluwatar/layers/dao/CakeDao.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@
2121
* THE SOFTWARE.
2222
*/
2323

24-
package com.iluwatar.layers;
24+
package com.iluwatar.layers.dao;
2525

26+
import com.iluwatar.layers.entity.Cake;
2627
import org.springframework.data.repository.CrudRepository;
2728
import org.springframework.stereotype.Repository;
2829

layers/src/main/java/com/iluwatar/layers/CakeLayerDao.java renamed to layers/src/main/java/com/iluwatar/layers/dao/CakeLayerDao.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@
2121
* THE SOFTWARE.
2222
*/
2323

24-
package com.iluwatar.layers;
24+
package com.iluwatar.layers.dao;
2525

26+
import com.iluwatar.layers.entity.CakeLayer;
2627
import org.springframework.data.repository.CrudRepository;
2728
import org.springframework.stereotype.Repository;
2829

layers/src/main/java/com/iluwatar/layers/CakeToppingDao.java renamed to layers/src/main/java/com/iluwatar/layers/dao/CakeToppingDao.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@
2121
* THE SOFTWARE.
2222
*/
2323

24-
package com.iluwatar.layers;
24+
package com.iluwatar.layers.dao;
2525

26+
import com.iluwatar.layers.entity.CakeTopping;
2627
import org.springframework.data.repository.CrudRepository;
2728
import org.springframework.stereotype.Repository;
2829

layers/src/main/java/com/iluwatar/layers/CakeInfo.java renamed to layers/src/main/java/com/iluwatar/layers/dto/CakeInfo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
* THE SOFTWARE.
2222
*/
2323

24-
package com.iluwatar.layers;
24+
package com.iluwatar.layers.dto;
2525

2626
import java.util.List;
2727
import java.util.Optional;

layers/src/main/java/com/iluwatar/layers/CakeLayerInfo.java renamed to layers/src/main/java/com/iluwatar/layers/dto/CakeLayerInfo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
* THE SOFTWARE.
2222
*/
2323

24-
package com.iluwatar.layers;
24+
package com.iluwatar.layers.dto;
2525

2626
import java.util.Optional;
2727

layers/src/main/java/com/iluwatar/layers/CakeToppingInfo.java renamed to layers/src/main/java/com/iluwatar/layers/dto/CakeToppingInfo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
* THE SOFTWARE.
2222
*/
2323

24-
package com.iluwatar.layers;
24+
package com.iluwatar.layers.dto;
2525

2626
import java.util.Optional;
2727

layers/src/main/java/com/iluwatar/layers/Cake.java renamed to layers/src/main/java/com/iluwatar/layers/entity/Cake.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
* THE SOFTWARE.
2222
*/
2323

24-
package com.iluwatar.layers;
24+
package com.iluwatar.layers.entity;
2525

2626
import java.util.HashSet;
2727
import java.util.Set;
@@ -74,7 +74,7 @@ public Set<CakeLayer> getLayers() {
7474
return layers;
7575
}
7676

77-
public final void setLayers(Set<CakeLayer> layers) {
77+
public void setLayers(Set<CakeLayer> layers) {
7878
this.layers = layers;
7979
}
8080

layers/src/main/java/com/iluwatar/layers/CakeLayer.java renamed to layers/src/main/java/com/iluwatar/layers/entity/CakeLayer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
* THE SOFTWARE.
2222
*/
2323

24-
package com.iluwatar.layers;
24+
package com.iluwatar.layers.entity;
2525

2626
import javax.persistence.CascadeType;
2727
import javax.persistence.Entity;
@@ -66,15 +66,15 @@ public String getName() {
6666
return name;
6767
}
6868

69-
public final void setName(String name) {
69+
public void setName(String name) {
7070
this.name = name;
7171
}
7272

7373
public int getCalories() {
7474
return calories;
7575
}
7676

77-
public final void setCalories(int calories) {
77+
public void setCalories(int calories) {
7878
this.calories = calories;
7979
}
8080

layers/src/main/java/com/iluwatar/layers/CakeTopping.java renamed to layers/src/main/java/com/iluwatar/layers/entity/CakeTopping.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
* THE SOFTWARE.
2222
*/
2323

24-
package com.iluwatar.layers;
24+
package com.iluwatar.layers.entity;
2525

2626
import javax.persistence.CascadeType;
2727
import javax.persistence.Entity;
@@ -66,11 +66,11 @@ public String getName() {
6666
return name;
6767
}
6868

69-
public final void setName(String name) {
69+
public void setName(String name) {
7070
this.name = name;
7171
}
7272

73-
public final int getCalories() {
73+
public int getCalories() {
7474
return calories;
7575
}
7676

layers/src/main/java/com/iluwatar/layers/CakeBakingException.java renamed to layers/src/main/java/com/iluwatar/layers/exception/CakeBakingException.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
* THE SOFTWARE.
2222
*/
2323

24-
package com.iluwatar.layers;
24+
package com.iluwatar.layers.exception;
2525

2626
/**
2727
* Custom exception used in cake baking.

layers/src/main/java/com/iluwatar/layers/CakeBakingService.java renamed to layers/src/main/java/com/iluwatar/layers/service/CakeBakingService.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,12 @@
2121
* THE SOFTWARE.
2222
*/
2323

24-
package com.iluwatar.layers;
24+
package com.iluwatar.layers.service;
2525

26+
import com.iluwatar.layers.dto.CakeInfo;
27+
import com.iluwatar.layers.dto.CakeLayerInfo;
28+
import com.iluwatar.layers.dto.CakeToppingInfo;
29+
import com.iluwatar.layers.exception.CakeBakingException;
2630
import java.util.List;
2731

2832
/**

0 commit comments

Comments
 (0)