diff --git a/separated-interface/README.md b/separated-interface/README.md index b26d5c7da..ca7a12e44 100644 --- a/separated-interface/README.md +++ b/separated-interface/README.md @@ -3,7 +3,7 @@ layout: pattern title: Separated Interface folder: separated-interface permalink: /patterns/separated-interface/ -categories: Architectural +categories: Structural tags: - Decoupling --- @@ -22,7 +22,7 @@ In plain words > Separated interface pattern encourages to keep the implementations of an interface decoupled from the client and its definition, so the client is not dependent on the implementation. -A client code may abstract some specific functionality to an interface, and define the definition of the interface as an SPI. Another package may implement this interface definition with a concrete logic, which will be injected into the client code at runtime (with a third class, injecting the implementation in the client) or at compile time (using Plugin pattern with some configurable file). +A client code may abstract some specific functionality to an interface, and define the definition of the interface as an SPI ([Service Programming Interface](https://en.wikipedia.org/wiki/Service_provider_interface) is an API intended and open to be implemented or extended by a third party). Another package may implement this interface definition with a concrete logic, which will be injected into the client code at runtime (with a third class, injecting the implementation in the client) or at compile time (using Plugin pattern with some configurable file). **Programmatic Example** @@ -60,9 +60,9 @@ public interface TaxCalculator { **Implementation package** In another package (which the client is completely unaware of) there exist multiple implementations of the ```TaxCalculator``` interface -```ForeignTax``` which levies 60% tax for international products. +```ForeignTaxCalculator``` which levies 60% tax for international products. ```java -public class ForeignTax implements TaxCalculator { +public class ForeignTaxCalculator implements TaxCalculator { public static final double TAX_PERCENTAGE = 60; @@ -74,9 +74,9 @@ public class ForeignTax implements TaxCalculator { } ``` -```DomesticTax``` which levies 20% tax for international products. +```DomesticTaxCalculator``` which levies 20% tax for international products. ```java -public class DomesticTax implements TaxCalculator { +public class DomesticTaxCalculator implements TaxCalculator { public static final double TAX_PERCENTAGE = 20; @@ -91,11 +91,11 @@ public class DomesticTax implements TaxCalculator { These both implementations are instantiated and injected in the client class by the ```App.java``` class ```java - var internationalProductInvoice = new InvoiceGenerator(PRODUCT_COST, new ForeignTax()); + var internationalProductInvoice = new InvoiceGenerator(PRODUCT_COST, new ForeignTaxCalculator()); LOGGER.info("Foreign Tax applied: {}", "" + internationalProductInvoice.getAmountWithTax()); - var domesticProductInvoice = new InvoiceGenerator(PRODUCT_COST, new DomesticTax()); + var domesticProductInvoice = new InvoiceGenerator(PRODUCT_COST, new DomesticTaxCalculator()); LOGGER.info("Domestic Tax applied: {}", "" + domesticProductInvoice.getAmountWithTax()); ``` diff --git a/separated-interface/etc/class_diagram.png b/separated-interface/etc/class_diagram.png index a0edbac8d..10d509801 100644 Binary files a/separated-interface/etc/class_diagram.png and b/separated-interface/etc/class_diagram.png differ diff --git a/separated-interface/etc/separated-interface.urm.puml b/separated-interface/etc/separated-interface.urm.puml index a406acd40..eab2ad60c 100644 --- a/separated-interface/etc/separated-interface.urm.puml +++ b/separated-interface/etc/separated-interface.urm.puml @@ -8,14 +8,14 @@ package com.iluwatar.separatedinterface { } } package com.iluwatar.separatedinterface.taxes { - class DomesticTax { + class DomesticTaxCalculator { + TAX_PERCENTAGE : double {static} - + DomesticTax() + + DomesticTaxCalculator() + calculate(amount : double) : double } - class ForeignTax { + class ForeignTaxCalculator { + TAX_PERCENTAGE : double {static} - + ForeignTax() + + ForeignTaxCalculator() + calculate(amount : double) : double } } @@ -31,6 +31,6 @@ package com.iluwatar.separatedinterface.invoice { } } InvoiceGenerator --> "-taxCalculator" TaxCalculator -DomesticTax ..|> TaxCalculator -ForeignTax ..|> TaxCalculator +DomesticTaxCalculator ..|> TaxCalculator +ForeignTaxCalculator ..|> TaxCalculator @enduml \ No newline at end of file diff --git a/separated-interface/src/main/java/com/iluwatar/separatedinterface/App.java b/separated-interface/src/main/java/com/iluwatar/separatedinterface/App.java index 67eeec054..1951e738b 100644 --- a/separated-interface/src/main/java/com/iluwatar/separatedinterface/App.java +++ b/separated-interface/src/main/java/com/iluwatar/separatedinterface/App.java @@ -24,8 +24,8 @@ package com.iluwatar.separatedinterface; import com.iluwatar.separatedinterface.invoice.InvoiceGenerator; -import com.iluwatar.separatedinterface.taxes.DomesticTax; -import com.iluwatar.separatedinterface.taxes.ForeignTax; +import com.iluwatar.separatedinterface.taxes.DomesticTaxCalculator; +import com.iluwatar.separatedinterface.taxes.ForeignTaxCalculator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,11 +51,12 @@ public class App { */ public static void main(String[] args) { //Create the invoice generator with product cost as 50 and foreign product tax - var internationalProductInvoice = new InvoiceGenerator(PRODUCT_COST, new ForeignTax()); + var internationalProductInvoice = new InvoiceGenerator(PRODUCT_COST, + new ForeignTaxCalculator()); LOGGER.info("Foreign Tax applied: {}", "" + internationalProductInvoice.getAmountWithTax()); //Create the invoice generator with product cost as 50 and domestic product tax - var domesticProductInvoice = new InvoiceGenerator(PRODUCT_COST, new DomesticTax()); + var domesticProductInvoice = new InvoiceGenerator(PRODUCT_COST, new DomesticTaxCalculator()); LOGGER.info("Domestic Tax applied: {}", "" + domesticProductInvoice.getAmountWithTax()); } } diff --git a/separated-interface/src/main/java/com/iluwatar/separatedinterface/taxes/DomesticTax.java b/separated-interface/src/main/java/com/iluwatar/separatedinterface/taxes/DomesticTaxCalculator.java similarity index 95% rename from separated-interface/src/main/java/com/iluwatar/separatedinterface/taxes/DomesticTax.java rename to separated-interface/src/main/java/com/iluwatar/separatedinterface/taxes/DomesticTaxCalculator.java index ebe0e306e..788afb90a 100644 --- a/separated-interface/src/main/java/com/iluwatar/separatedinterface/taxes/DomesticTax.java +++ b/separated-interface/src/main/java/com/iluwatar/separatedinterface/taxes/DomesticTaxCalculator.java @@ -28,7 +28,7 @@ import com.iluwatar.separatedinterface.invoice.TaxCalculator; /** * TaxCalculator for Domestic goods with 20% tax. */ -public class DomesticTax implements TaxCalculator { +public class DomesticTaxCalculator implements TaxCalculator { public static final double TAX_PERCENTAGE = 20; diff --git a/separated-interface/src/main/java/com/iluwatar/separatedinterface/taxes/ForeignTax.java b/separated-interface/src/main/java/com/iluwatar/separatedinterface/taxes/ForeignTaxCalculator.java similarity index 96% rename from separated-interface/src/main/java/com/iluwatar/separatedinterface/taxes/ForeignTax.java rename to separated-interface/src/main/java/com/iluwatar/separatedinterface/taxes/ForeignTaxCalculator.java index 583f70d3b..c2b12e2f5 100644 --- a/separated-interface/src/main/java/com/iluwatar/separatedinterface/taxes/ForeignTax.java +++ b/separated-interface/src/main/java/com/iluwatar/separatedinterface/taxes/ForeignTaxCalculator.java @@ -28,7 +28,7 @@ import com.iluwatar.separatedinterface.invoice.TaxCalculator; /** * TaxCalculator for foreign goods with 60% tax. */ -public class ForeignTax implements TaxCalculator { +public class ForeignTaxCalculator implements TaxCalculator { public static final double TAX_PERCENTAGE = 60; diff --git a/separated-interface/src/test/java/com/iluwatar/separatedinterface/taxes/DomesticTaxTest.java b/separated-interface/src/test/java/com/iluwatar/separatedinterface/taxes/DomesticTaxCalculatorTest.java similarity index 89% rename from separated-interface/src/test/java/com/iluwatar/separatedinterface/taxes/DomesticTaxTest.java rename to separated-interface/src/test/java/com/iluwatar/separatedinterface/taxes/DomesticTaxCalculatorTest.java index d070d8b0a..dac3ec2d6 100644 --- a/separated-interface/src/test/java/com/iluwatar/separatedinterface/taxes/DomesticTaxTest.java +++ b/separated-interface/src/test/java/com/iluwatar/separatedinterface/taxes/DomesticTaxCalculatorTest.java @@ -26,13 +26,13 @@ package com.iluwatar.separatedinterface.taxes; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -public class DomesticTaxTest { +public class DomesticTaxCalculatorTest { - private DomesticTax target; + private DomesticTaxCalculator target; @Test - public void testTaxCaluclation(){ - target = new DomesticTax(); + public void testTaxCalculation(){ + target = new DomesticTaxCalculator(); var tax=target.calculate(100.0); Assertions.assertEquals(tax,20.0); diff --git a/separated-interface/src/test/java/com/iluwatar/separatedinterface/taxes/ForeignTaxTest.java b/separated-interface/src/test/java/com/iluwatar/separatedinterface/taxes/ForeignTaxCalculatorTest.java similarity index 89% rename from separated-interface/src/test/java/com/iluwatar/separatedinterface/taxes/ForeignTaxTest.java rename to separated-interface/src/test/java/com/iluwatar/separatedinterface/taxes/ForeignTaxCalculatorTest.java index df184276c..22526b6df 100644 --- a/separated-interface/src/test/java/com/iluwatar/separatedinterface/taxes/ForeignTaxTest.java +++ b/separated-interface/src/test/java/com/iluwatar/separatedinterface/taxes/ForeignTaxCalculatorTest.java @@ -26,13 +26,13 @@ package com.iluwatar.separatedinterface.taxes; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -public class ForeignTaxTest { +public class ForeignTaxCalculatorTest { - private ForeignTax target; + private ForeignTaxCalculator target; @Test - public void testTaxCaluclation(){ - target = new ForeignTax(); + public void testTaxCalculation(){ + target = new ForeignTaxCalculator(); var tax=target.calculate(100.0); Assertions.assertEquals(tax,60.0);