diff --git a/README.md b/README.md
index 45bc0a9..3f14d16 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,3 @@
-# supermarket
\ No newline at end of file
+# supermarket
+
+this is one of my solutions for ["Back to the checkout code cata"](http://codekata.com/kata/kata09-back-to-the-checkout/)
diff --git a/pom.xml b/pom.xml
index 317ed20..e80366b 100755
--- a/pom.xml
+++ b/pom.xml
@@ -13,19 +13,24 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.2
+ 3.6.1
- 1.7
- 1.7
+ 1.8
+ 1.8
+
+ org.apache.commons
+ commons-text
+ 1.0
+
junit
junit
- 4.11
+ 4.12
test
diff --git a/src/main/java/de/dj_steam/CheckOut.java b/src/main/java/de/dj_steam/CheckOut.java
index f32f428..d369024 100755
--- a/src/main/java/de/dj_steam/CheckOut.java
+++ b/src/main/java/de/dj_steam/CheckOut.java
@@ -1,6 +1,10 @@
package de.dj_steam;
-import de.dj_steam.strategy.*;
+import de.dj_steam.strategy.AStrategy;
+import de.dj_steam.strategy.BStrategy;
+import de.dj_steam.strategy.CStrategy;
+import de.dj_steam.strategy.DStrategy;
+import de.dj_steam.strategy.PriceCalculator;
import java.util.ArrayList;
import java.util.List;
@@ -8,12 +12,12 @@ import java.util.List;
/**
* Created by steam on 24.02.15.
*/
-public class CheckOut {
+class CheckOut {
private String bucket = "";
- private List strategies;
+ private List strategies;
- public CheckOut(){
+ CheckOut() {
initPriceStrategies();
}
@@ -28,28 +32,28 @@ public class CheckOut {
strategies.add(new DStrategy());
}
- public int scan(char product){
+ int scan(char product) {
putIntoBucket(product);
return updateTotalPrice();
}
- public int calculatePriceForBucket(String products){
+ int calculatePriceForBucket(String products) {
int total = 0;
this.bucket = products;
PriceContext context = new PriceContext();
- for(PricingStrategy strategy : strategies){
+ for (PriceCalculator strategy : strategies) {
context.setStrategy(strategy, bucket);
total += context.calculatePriceForProduct();
}
return total;
}
- private void putIntoBucket(char product){
+ private void putIntoBucket(char product) {
bucket += product;
}
- private int updateTotalPrice(){
- return calculatePriceForBucket(bucket);
+ private int updateTotalPrice() {
+ return calculatePriceForBucket(bucket);
}
}
diff --git a/src/main/java/de/dj_steam/PriceContext.java b/src/main/java/de/dj_steam/PriceContext.java
index d115a56..f095408 100755
--- a/src/main/java/de/dj_steam/PriceContext.java
+++ b/src/main/java/de/dj_steam/PriceContext.java
@@ -1,20 +1,20 @@
package de.dj_steam;
-import de.dj_steam.strategy.PricingStrategy;
+import de.dj_steam.strategy.PriceCalculator;
/**
* Created by steam on 24.02.15.
*/
-public class PriceContext {
- private PricingStrategy strategy = null;
+class PriceContext {
+ private PriceCalculator strategy = null;
private String bucket = "";
- public void setStrategy(final PricingStrategy strategy, String bucket){
+ void setStrategy(final PriceCalculator strategy, final String bucket){
this.strategy = strategy;
this.bucket = bucket;
}
- public int calculatePriceForProduct() {
+ int calculatePriceForProduct() {
if (strategy != null){
return strategy.calculatePrice(bucket);
}
diff --git a/src/main/java/de/dj_steam/strategy/AStrategy.java b/src/main/java/de/dj_steam/strategy/AStrategy.java
index d50f2ed..d2f0e70 100755
--- a/src/main/java/de/dj_steam/strategy/AStrategy.java
+++ b/src/main/java/de/dj_steam/strategy/AStrategy.java
@@ -3,7 +3,7 @@ package de.dj_steam.strategy;
/**
* Created by steam on 24.02.15.
*/
-public class AStrategy extends AbstractPricingStrategy implements PricingStrategy {
+public class AStrategy extends PricingStrategy implements PriceCalculator {
private static final char PRODUCT_ID = 'A';
private static final int PRICE = 50;
@@ -12,9 +12,8 @@ public class AStrategy extends AbstractPricingStrategy implements PricingStrateg
@Override
- public int calculatePrice(String products) {
- int productsNumber = calculateNumberOfProductsForType(products, PRODUCT_ID);
- return calculatePriceForAllProducts(productsNumber, PRICE, PRICE_THRESHOLD, DISCOUNT);
+ public int calculatePrice(final String bucket) {
+ return calculatePriceForGivenProduct(bucket, PRODUCT_ID, PRICE, PRICE_THRESHOLD, DISCOUNT);
}
}
diff --git a/src/main/java/de/dj_steam/strategy/AbstractPricingStrategy.java b/src/main/java/de/dj_steam/strategy/AbstractPricingStrategy.java
deleted file mode 100755
index af2e59c..0000000
--- a/src/main/java/de/dj_steam/strategy/AbstractPricingStrategy.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package de.dj_steam.strategy;
-
-/**
- * Created by steam on 24.02.15.
- */
-public class AbstractPricingStrategy {
-
- protected int calculateNumberOfProductsForType(String products, char product) {
- int numberOfProducts = 0;
- for (int i = 0; i < products.length(); i++) {
- if (products.charAt(i) == product) {
- numberOfProducts++;
- }
- }
- return numberOfProducts;
- }
-
- protected int calculatePriceForAllProducts(int numberOfProducts, int price, int priceThreshold, int discount) {
- if (priceThreshold > 0) {
- int remainder = numberOfProducts % priceThreshold;
- int triples = numberOfProducts / priceThreshold;
- return (triples * discount) + (remainder * price);
- } else {
- return numberOfProducts * price;
- }
- }
-}
diff --git a/src/main/java/de/dj_steam/strategy/BStrategy.java b/src/main/java/de/dj_steam/strategy/BStrategy.java
index 7cfd0bc..4294eb7 100755
--- a/src/main/java/de/dj_steam/strategy/BStrategy.java
+++ b/src/main/java/de/dj_steam/strategy/BStrategy.java
@@ -3,7 +3,7 @@ package de.dj_steam.strategy;
/**
* Created by steam on 24.02.15.
*/
-public class BStrategy extends AbstractPricingStrategy implements PricingStrategy {
+public class BStrategy extends PricingStrategy implements PriceCalculator{
private static final char PRODUCT_ID = 'B';
private static final int PRICE = 30;
@@ -11,8 +11,7 @@ public class BStrategy extends AbstractPricingStrategy implements PricingStrateg
private static final int DISCOUNT = 45;
@Override
- public int calculatePrice(String products) {
- int productsNumber = calculateNumberOfProductsForType(products, PRODUCT_ID);
- return calculatePriceForAllProducts(productsNumber, PRICE, PRICE_THRESHOLD, DISCOUNT);
+ public int calculatePrice(final String bucket) {
+ return calculatePriceForGivenProduct(bucket, PRODUCT_ID, PRICE, PRICE_THRESHOLD, DISCOUNT);
}
}
diff --git a/src/main/java/de/dj_steam/strategy/CStrategy.java b/src/main/java/de/dj_steam/strategy/CStrategy.java
index a602eeb..acacdec 100755
--- a/src/main/java/de/dj_steam/strategy/CStrategy.java
+++ b/src/main/java/de/dj_steam/strategy/CStrategy.java
@@ -3,7 +3,7 @@ package de.dj_steam.strategy;
/**
* Created by steam on 24.02.15.
*/
-public class CStrategy extends AbstractPricingStrategy implements PricingStrategy {
+public class CStrategy extends PricingStrategy implements PriceCalculator {
private static final char PRODUCT_ID = 'C';
private static final int PRICE = 20;
@@ -12,8 +12,7 @@ public class CStrategy extends AbstractPricingStrategy implements PricingStrateg
@Override
- public int calculatePrice(String products) {
- int productsNumber = calculateNumberOfProductsForType(products, PRODUCT_ID);
- return calculatePriceForAllProducts(productsNumber, PRICE, PRICE_THRESHOLD, DISCOUNT);
+ public int calculatePrice(final String bucket) {
+ return calculatePriceForGivenProduct(bucket, PRODUCT_ID, PRICE, PRICE_THRESHOLD, DISCOUNT);
}
}
diff --git a/src/main/java/de/dj_steam/strategy/DStrategy.java b/src/main/java/de/dj_steam/strategy/DStrategy.java
index a7cb558..0f3cc0f 100755
--- a/src/main/java/de/dj_steam/strategy/DStrategy.java
+++ b/src/main/java/de/dj_steam/strategy/DStrategy.java
@@ -3,7 +3,7 @@ package de.dj_steam.strategy;
/**
* Created by steam on 24.02.15.
*/
-public class DStrategy extends AbstractPricingStrategy implements PricingStrategy {
+public class DStrategy extends PricingStrategy implements PriceCalculator {
private static final char PRODUCT_ID = 'D';
private static final int PRICE = 15;
@@ -11,8 +11,7 @@ public class DStrategy extends AbstractPricingStrategy implements PricingStrateg
private static final int DISCOUNT = 0;
@Override
- public int calculatePrice(String products) {
- int productsNumber = calculateNumberOfProductsForType(products, PRODUCT_ID);
- return calculatePriceForAllProducts(productsNumber, PRICE, PRICE_THRESHOLD, DISCOUNT);
+ public int calculatePrice(final String bucket) {
+ return calculatePriceForGivenProduct(bucket, PRODUCT_ID, PRICE, PRICE_THRESHOLD, DISCOUNT);
}
}
diff --git a/src/main/java/de/dj_steam/strategy/PriceCalculator.java b/src/main/java/de/dj_steam/strategy/PriceCalculator.java
new file mode 100755
index 0000000..a0a3e28
--- /dev/null
+++ b/src/main/java/de/dj_steam/strategy/PriceCalculator.java
@@ -0,0 +1,8 @@
+package de.dj_steam.strategy;
+
+/**
+ * Created by steam on 24.02.15.
+ */
+public interface PriceCalculator {
+ int calculatePrice(String bucket);
+}
diff --git a/src/main/java/de/dj_steam/strategy/PricingStrategy.java b/src/main/java/de/dj_steam/strategy/PricingStrategy.java
index a8848ca..4e21c6b 100755
--- a/src/main/java/de/dj_steam/strategy/PricingStrategy.java
+++ b/src/main/java/de/dj_steam/strategy/PricingStrategy.java
@@ -1,8 +1,28 @@
package de.dj_steam.strategy;
+import org.apache.commons.lang3.StringUtils;
+
/**
* Created by steam on 24.02.15.
*/
-public interface PricingStrategy {
- public int calculatePrice(String products);
+class PricingStrategy {
+
+ int calculatePriceForGivenProduct( final String bucket, final char productId, final int productPrice, final int priceThreshold, final int discount){
+ int productsNumber = calculateNumberOfProductsForType(bucket, productId);
+ return calculatePriceForAllProducts(productsNumber, productPrice, priceThreshold, discount);
+ }
+
+ private int calculateNumberOfProductsForType(final String products, final char product) {
+ return StringUtils.countMatches(products, product);
+ }
+
+ private int calculatePriceForAllProducts(final int numberOfProducts, final int price, final int priceThreshold, final int discount) {
+ if (priceThreshold > 0) {
+ int remainder = numberOfProducts % priceThreshold;
+ int triples = numberOfProducts / priceThreshold;
+ return (triples * discount) + (remainder * price);
+ } else {
+ return numberOfProducts * price;
+ }
+ }
}