Skip to content

Commit 3ef63dc

Browse files
committed
Add pattern strategy. OverbookingPolicy example.
1 parent 9d246c7 commit 3ef63dc

File tree

6 files changed

+77
-0
lines changed

6 files changed

+77
-0
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import '../partners/cargo.dart';
2+
import '../partners/voyage.dart';
3+
import '../policy/overbooking_policy.dart';
4+
import 'order_confirmation_sequence.dart';
5+
6+
class Application {
7+
final OverbookingPolicy overbookingPolicy;
8+
final orderConfirmationSequence = OrderConfirmationSequence();
9+
10+
Application(this.overbookingPolicy);
11+
12+
void makeBooking(Cargo cargo, Voyage voyage) {
13+
if (overbookingPolicy.isAllowed(cargo, voyage)) {
14+
final confirmation = orderConfirmationSequence.next();
15+
voyage.addCargo(cargo, confirmation);
16+
} else {
17+
throw 'The weight of the cargo exceeds the permissible norm.';
18+
}
19+
}
20+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class OrderConfirmationSequence {
2+
var _index = 0;
3+
4+
int next() => _index++;
5+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import 'application/application.dart';
2+
import 'partners/cargo.dart';
3+
import 'partners/voyage.dart';
4+
import 'policy/overbooking_policy.dart';
5+
6+
void main() {
7+
final overbookingPolicy = OverbookingPolicy();
8+
final app = Application(overbookingPolicy);
9+
final voyage = Voyage();
10+
11+
try {
12+
app.makeBooking(Cargo(1000), voyage);
13+
app.makeBooking(Cargo(500), voyage);
14+
app.makeBooking(Cargo(800), voyage); // error
15+
} catch (e) {
16+
print(e);
17+
}
18+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class Cargo {
2+
final double size;
3+
4+
Cargo(this.size);
5+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import 'cargo.dart';
2+
3+
class Voyage {
4+
final _cargo = <int, Cargo>{};
5+
6+
double get capacity => 2000.0;
7+
8+
double bookedCargoSize() {
9+
return _cargo.values.fold(0, (prev, cargo) => prev + cargo.size);
10+
}
11+
12+
void addCargo(Cargo cargo, int confirmation) {
13+
_cargo.putIfAbsent(confirmation, () => cargo);
14+
print('Add Cargo(${cargo.size}) to voyage.');
15+
}
16+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import '../partners/cargo.dart';
2+
import '../partners/voyage.dart';
3+
4+
class OverbookingPolicy {
5+
static const allowableRedundancy = 1.1;
6+
7+
bool isAllowed(Cargo cargo, Voyage voyage) {
8+
final maxBooking = voyage.capacity * allowableRedundancy;
9+
final futureWeight = voyage.bookedCargoSize() + cargo.size;
10+
11+
return futureWeight < maxBooking;
12+
}
13+
}

0 commit comments

Comments
 (0)