Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit18a1a72

Browse files
ignite1771ohbus
andauthored
iluwatar#1469 Add lambda expressions implementation for Strategy Pattern (iluwatar#1631)
*iluwatar#1469 Add Strategy Pattern lambda implementationAfter Java 8.Also take advantage of enum*iluwatar#1469 Update class diagrams*iluwatar#1469 Update README.mdAdd lambda programmatic example*iluwatar#1469 Remove unused importsCo-authored-by: Subhrodip Mohanta <subhrodipmohanta@gmail.com>
1 parent25ed254 commit18a1a72

File tree

5 files changed

+103
-2
lines changed

5 files changed

+103
-2
lines changed

‎strategy/README.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,51 @@ Program output:
122122
You cast the spell of disintegration and the dragon vaporizes in a pile of dust!
123123
```
124124

125+
What's more, the new feature Lambda Expressions in Java 8 provides another approach for the implementation:
126+
127+
```java
128+
publicclassLambdaStrategy {
129+
130+
privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(LambdaStrategy.class);
131+
132+
publicenumStrategyimplementsDragonSlayingStrategy {
133+
MeleeStrategy(() -> LOGGER.info(
134+
"WithyourExcaliburyouseverethedragon'shead!")),
135+
ProjectileStrategy(() -> LOGGER.info(
136+
"Youshootthedragonwiththemagicalcrossbowanditfallsdeadontheground!")),
137+
SpellStrategy(() -> LOGGER.info(
138+
"Youcastthespellofdisintegrationandthedragonvaporizesinapileofdust!"));
139+
140+
privatefinalDragonSlayingStrategy dragonSlayingStrategy;
141+
142+
Strategy(DragonSlayingStrategydragonSlayingStrategy) {
143+
this.dragonSlayingStrategy= dragonSlayingStrategy;
144+
}
145+
146+
@Override
147+
publicvoidexecute() {
148+
dragonSlayingStrategy.execute();
149+
}
150+
}
151+
}
152+
```
153+
154+
And here's the dragonslayer in action.
155+
156+
```java
157+
LOGGER.info("Green dragon spotted ahead!");
158+
dragonSlayer.changeStrategy(LambdaStrategy.Strategy.MeleeStrategy);
159+
dragonSlayer.goToBattle();
160+
LOGGER.info("Red dragon emerges.");
161+
dragonSlayer.changeStrategy(LambdaStrategy.Strategy.ProjectileStrategy);
162+
dragonSlayer.goToBattle();
163+
LOGGER.info("Black dragon lands before you.");
164+
dragonSlayer.changeStrategy(LambdaStrategy.Strategy.SpellStrategy);
165+
dragonSlayer.goToBattle();
166+
```
167+
168+
Program output is the same as above one.
169+
125170
##Class diagram
126171

127172
![alt text](./etc/strategy_urm.png"Strategy")

‎strategy/etc/strategy.urm.puml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,19 @@ package com.iluwatar.strategy {
1414
interfaceDragonSlayingStrategy {
1515
+execute() {abstract}
1616
}
17+
classLambdaStrategy {
18+
-LOGGER : Logger {static}
19+
+LambdaStrategy()
20+
}
21+
enumStrategy {
22+
+MeleeStrategy {static}
23+
+ProjectileStrategy {static}
24+
+SpellStrategy {static}
25+
-dragonSlayingStrategy :DragonSlayingStrategy
26+
+execute()
27+
+valueOf(name : String) : Strategy {static}
28+
+values() : Strategy[] {static}
29+
}
1730
classMeleeStrategy {
1831
-LOGGER : Logger {static}
1932
+MeleeStrategy()
@@ -30,7 +43,10 @@ package com.iluwatar.strategy {
3043
+execute()
3144
}
3245
}
46+
Strategy..+LambdaStrategy
47+
Strategy--> "-dragonSlayingStrategy"DragonSlayingStrategy
3348
DragonSlayer--> "-strategy"DragonSlayingStrategy
49+
Strategy..|>DragonSlayingStrategy
3450
MeleeStrategy..|>DragonSlayingStrategy
3551
ProjectileStrategy..|>DragonSlayingStrategy
3652
SpellStrategy..|>DragonSlayingStrategy

‎strategy/etc/strategy_urm.png

111 KB
Loading

‎strategy/src/main/java/com/iluwatar/strategy/App.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public class App {
4545

4646
/**
4747
* Program entry point.
48-
*
48+
*
4949
* @param args command line args
5050
*/
5151
publicstaticvoidmain(String[]args) {
@@ -60,7 +60,7 @@ public static void main(String[] args) {
6060
dragonSlayer.changeStrategy(newSpellStrategy());
6161
dragonSlayer.goToBattle();
6262

63-
// Java 8 Strategy pattern
63+
// Java 8functional implementationStrategy pattern
6464
LOGGER.info("Green dragon spotted ahead!");
6565
dragonSlayer =newDragonSlayer(
6666
() ->LOGGER.info("With your Excalibur you severe the dragon's head!"));
@@ -73,5 +73,16 @@ public static void main(String[] args) {
7373
dragonSlayer.changeStrategy(() ->LOGGER.info(
7474
"You cast the spell of disintegration and the dragon vaporizes in a pile of dust!"));
7575
dragonSlayer.goToBattle();
76+
77+
// Java 8 lambda implementation with enum Strategy pattern
78+
LOGGER.info("Green dragon spotted ahead!");
79+
dragonSlayer.changeStrategy(LambdaStrategy.Strategy.MeleeStrategy);
80+
dragonSlayer.goToBattle();
81+
LOGGER.info("Red dragon emerges.");
82+
dragonSlayer.changeStrategy(LambdaStrategy.Strategy.ProjectileStrategy);
83+
dragonSlayer.goToBattle();
84+
LOGGER.info("Black dragon lands before you.");
85+
dragonSlayer.changeStrategy(LambdaStrategy.Strategy.SpellStrategy);
86+
dragonSlayer.goToBattle();
7687
}
7788
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
packagecom.iluwatar.strategy;
2+
3+
importorg.slf4j.Logger;
4+
importorg.slf4j.LoggerFactory;
5+
6+
publicclassLambdaStrategy {
7+
8+
privatestaticfinalLoggerLOGGER =LoggerFactory.getLogger(LambdaStrategy.class);
9+
10+
publicenumStrategyimplementsDragonSlayingStrategy {
11+
MeleeStrategy(() ->LOGGER.info(
12+
"With your Excalibur you severe the dragon's head!")),
13+
ProjectileStrategy(() ->LOGGER.info(
14+
"You shoot the dragon with the magical crossbow and it falls dead on the ground!")),
15+
SpellStrategy(() ->LOGGER.info(
16+
"You cast the spell of disintegration and the dragon vaporizes in a pile of dust!"));
17+
18+
privatefinalDragonSlayingStrategydragonSlayingStrategy;
19+
20+
Strategy(DragonSlayingStrategydragonSlayingStrategy) {
21+
this.dragonSlayingStrategy =dragonSlayingStrategy;
22+
}
23+
24+
@Override
25+
publicvoidexecute() {
26+
dragonSlayingStrategy.execute();
27+
}
28+
}
29+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp