diff --git a/src/oops/SOLID/DependencyInversionPrinciple/before/main/PayEmployeesMain.java b/src/oops/SOLID/DependencyInversionPrinciple/before/main/PayEmployeesMain.java index b3f8baff..49a3e7a2 100644 --- a/src/oops/SOLID/DependencyInversionPrinciple/before/main/PayEmployeesMain.java +++ b/src/oops/SOLID/DependencyInversionPrinciple/before/main/PayEmployeesMain.java @@ -1,11 +1,12 @@ package oops.SOLID.DependencyInversionPrinciple.before.main; - +import oops.SOLID.DependencyInversionPrinciple.before.serielizer.EmployeeFileSerializer; import oops.SOLID.DependencyInversionPrinciple.before.payments.PaymentProcessor; public class PayEmployeesMain { public static void main(String[] args) { - PaymentProcessor paymentProcessor = new PaymentProcessor(); + EmployeeFileSerializer serializer = new EmployeeFileSerializer(); + PaymentProcessor paymentProcessor = new PaymentProcessor(serializer); int totalPayments = paymentProcessor.sendPayments(); System.out.println("Total payments " + totalPayments); } diff --git a/src/oops/SOLID/DependencyInversionPrinciple/before/payments/PaymentProcessor.java b/src/oops/SOLID/DependencyInversionPrinciple/before/payments/PaymentProcessor.java index 453853f3..390bfd82 100644 --- a/src/oops/SOLID/DependencyInversionPrinciple/before/payments/PaymentProcessor.java +++ b/src/oops/SOLID/DependencyInversionPrinciple/before/payments/PaymentProcessor.java @@ -8,11 +8,13 @@ import oops.SOLID.DependencyInversionPrinciple.before.serielizer.EmployeeFileSerializer; public class PaymentProcessor { + private EmployeeFileSerializer serializer; + public PaymentProcessor(EmployeeFileSerializer serializer) { + this.serializer = serializer; + } public int sendPayments(){ - EmployeeFileSerializer serializer = - new EmployeeFileSerializer(); EmployeeFileRepository employeeRepository = new EmployeeFileRepository(serializer); diff --git a/src/oops/SOLID/lsp/stack/before/ClientMain.java b/src/oops/SOLID/lsp/stack/before/ClientMain.java new file mode 100644 index 00000000..1a12600a --- /dev/null +++ b/src/oops/SOLID/lsp/stack/before/ClientMain.java @@ -0,0 +1,15 @@ +package oops.SOLID.lsp.stack.before; + +class ClientMain{ + + public static void main(String[] args) { + Stack st = new Stack<>(); + st.push(1); + st.push(2); + System.out.println(st.top()); + st.pop(); + System.out.println(st.top()); + st.clear(); + System.out.println(st.top()); + } +} \ No newline at end of file diff --git a/src/oops/SOLID/lsp/stack/before/Stack.java b/src/oops/SOLID/lsp/stack/before/Stack.java new file mode 100644 index 00000000..52c56e53 --- /dev/null +++ b/src/oops/SOLID/lsp/stack/before/Stack.java @@ -0,0 +1,26 @@ +package oops.SOLID.lsp.stack.before; + +import java.util.ArrayList; + +public class Stack { + private int topPointer; + private List arr; + public StackWrong(){ + this.topPointer=0; + this.arr=new ArrayList<>(); + } + public void push(T a) { + arr.add(topPointer, a); + topPointer++; + } + public void pop() { + arr.remove(topPointer-1); + topPointer--; + } + public void clear() { + arr.removeAll(arr); + topPointer=0; + } + public T top() { + return arr.get(topPointer-1); + } \ No newline at end of file diff --git a/src/oops/SOLID/lsp/stack/before/StackWrong.java b/src/oops/SOLID/lsp/stack/before/StackWrong.java deleted file mode 100644 index 1170e573..00000000 --- a/src/oops/SOLID/lsp/stack/before/StackWrong.java +++ /dev/null @@ -1,42 +0,0 @@ -package oops.SOLID.lsp.stack.before; - -import java.util.ArrayList; -/* - * Stack is-a list with push() pop() methods. - * So can we create a stack by extending an ArrayList class? - * - * No! This implementation violates the Liskov Substitution Principle. - * Which states that - * "Objects in a program should be replaceable with instances of their subtypes - * without altering the correctness of that program." - * - * In this case ArrayList has multiple methods which stack is not supposed to have (ex clear(), get(i) etc) - * so objects of ArrayList are not fully replaceable by the objects of stack. - * - */ -public class StackWrong extends ArrayList{ - private int topPointer = 0; - - public void push(Integer a) { - add(topPointer, a); - topPointer++; - } - public void pop() { - remove(topPointer-1); - topPointer--; - } - public Integer top() { - return get(topPointer-1); - } - - public static void main(String[] args) { - StackWrong st = new StackWrong(); - st.push(1); - st.push(2); - System.out.println(st.top()); - st.pop(); - System.out.println(st.top()); - st.clear(); - System.out.println(st.top()); - } -} diff --git a/src/oops/SOLID/openClosePrinciple/before/client/CalculateTaxesClient.java b/src/oops/SOLID/openClosePrinciple/before/client/CalculateTaxesClient.java index 1651161c..b5bc26a1 100644 --- a/src/oops/SOLID/openClosePrinciple/before/client/CalculateTaxesClient.java +++ b/src/oops/SOLID/openClosePrinciple/before/client/CalculateTaxesClient.java @@ -26,10 +26,10 @@ public static void main(String[] args) { for (Employee employee: employees){ // compute individual tax - double tax = TaxCalculator.calculate(employee); + double tax = employee.getTax(); String formattedTax = currencyFormatter.format(tax); // add to company total taxes - totalTaxes += TaxCalculator.calculate(employee); + totalTaxes += tax; } } } diff --git a/src/oops/SOLID/openClosePrinciple/before/employees/Employee.java b/src/oops/SOLID/openClosePrinciple/before/employees/Employee.java index a84b72a3..4923f922 100644 --- a/src/oops/SOLID/openClosePrinciple/before/employees/Employee.java +++ b/src/oops/SOLID/openClosePrinciple/before/employees/Employee.java @@ -57,5 +57,8 @@ public void setNbHoursPerWeek(int nbHoursPerWeek) { public String getFullName(){ return this.firstName + " " + this.lastName; } + + public abstract double getTax(); + } diff --git a/src/oops/SOLID/openClosePrinciple/before/employees/FullTimeEmployee.java b/src/oops/SOLID/openClosePrinciple/before/employees/FullTimeEmployee.java index cd9e9384..9d6882a7 100644 --- a/src/oops/SOLID/openClosePrinciple/before/employees/FullTimeEmployee.java +++ b/src/oops/SOLID/openClosePrinciple/before/employees/FullTimeEmployee.java @@ -1,8 +1,14 @@ package oops.SOLID.openClosePrinciple.before.employees; +package oops.SOLID.openClosePrinciple.before.taxes; -public class FullTimeEmployee extends Employee { +public class FullTimeEmployee extends Employee{ public FullTimeEmployee(String fullName, int monthlyIncome) { super(fullName, monthlyIncome); this.setNbHoursPerWeek(40); } + + public double getTax(){ + TaxCalculator tc =new FullTimeEmployeeTaxCalculator(); + return tc.calculate(this); + } } diff --git a/src/oops/SOLID/openClosePrinciple/before/employees/Intern.java b/src/oops/SOLID/openClosePrinciple/before/employees/Intern.java index 80191de2..68f13c67 100644 --- a/src/oops/SOLID/openClosePrinciple/before/employees/Intern.java +++ b/src/oops/SOLID/openClosePrinciple/before/employees/Intern.java @@ -1,8 +1,14 @@ package oops.SOLID.openClosePrinciple.before.employees; +package oops.SOLID.openClosePrinciple.before.taxes; public class Intern extends Employee { public Intern(String fullName, int monthlyIncome, int nbHours) { super(fullName, monthlyIncome); setNbHoursPerWeek(nbHours); } + + public double getTax(){ + TaxCalculator tc =new InternTaxCalculator(); + return tc.calculate(this); + } } diff --git a/src/oops/SOLID/openClosePrinciple/before/employees/PartTimeEmployee.java b/src/oops/SOLID/openClosePrinciple/before/employees/PartTimeEmployee.java index 5c491175..30bc3c6c 100644 --- a/src/oops/SOLID/openClosePrinciple/before/employees/PartTimeEmployee.java +++ b/src/oops/SOLID/openClosePrinciple/before/employees/PartTimeEmployee.java @@ -1,8 +1,14 @@ package oops.SOLID.openClosePrinciple.before.employees; +package oops.SOLID.openClosePrinciple.before.taxes; public class PartTimeEmployee extends Employee { public PartTimeEmployee(String fullName, int monthlyIncome) { super(fullName, monthlyIncome); this.setNbHoursPerWeek(20); } + + public double getTax(){ + TaxCalculator tc =new PartTimeEmployeeTaxCalculator(); + return tc.calculate(this); + } } \ No newline at end of file diff --git a/src/oops/SOLID/openClosePrinciple/before/taxes/FullTimeEmployeeTaxCalculator.java b/src/oops/SOLID/openClosePrinciple/before/taxes/FullTimeEmployeeTaxCalculator.java new file mode 100644 index 00000000..2debdf07 --- /dev/null +++ b/src/oops/SOLID/openClosePrinciple/before/taxes/FullTimeEmployeeTaxCalculator.java @@ -0,0 +1,19 @@ +package oops.SOLID.openClosePrinciple.before.taxes; + +import oops.SOLID.openClosePrinciple.before.employees.Employee; + +class FullTimeEmployeeTaxCalculator implements TaxCalculator{ + + private final static int INCOME_TAX_PERCENTAGE = 30; + private final static int PROFESSIONAL_TAX_PERCENTAGE = 2; + private final static int EDUCATIONAL_CESS = 1; + + + public double calculate(Employee employee) { + return + (employee.getMonthlyIncome() * INCOME_TAX_PERCENTAGE) / 100 + + (employee.getMonthlyIncome() * PROFESSIONAL_TAX_PERCENTAGE) / 100 + + (employee.getMonthlyIncome() * EDUCATIONAL_CESS) / 100; + + } +} \ No newline at end of file diff --git a/src/oops/SOLID/openClosePrinciple/before/taxes/InternTaxCalculator.java b/src/oops/SOLID/openClosePrinciple/before/taxes/InternTaxCalculator.java new file mode 100644 index 00000000..4d324b9f --- /dev/null +++ b/src/oops/SOLID/openClosePrinciple/before/taxes/InternTaxCalculator.java @@ -0,0 +1,20 @@ +package oops.SOLID.openClosePrinciple.before.taxes; + +import oops.SOLID.openClosePrinciple.before.employees.Employee; + +class InternTaxCalculator implements TaxCalculator{ + + private final static int INCOME_TAX_PERCENTAGE = 15; + + + public double calculate(Employee employee) { + if(employee.getMonthlyIncome()*12<300000){ + return 0; + }else{ + return + (employee.getMonthlyIncome() * INCOME_TAX_PERCENTAGE) / 100; + } + + + } +} \ No newline at end of file diff --git a/src/oops/SOLID/openClosePrinciple/before/taxes/PartTimeEmployeeTaxCalculator.java b/src/oops/SOLID/openClosePrinciple/before/taxes/PartTimeEmployeeTaxCalculator.java new file mode 100644 index 00000000..d5139b91 --- /dev/null +++ b/src/oops/SOLID/openClosePrinciple/before/taxes/PartTimeEmployeeTaxCalculator.java @@ -0,0 +1,19 @@ +package oops.SOLID.openClosePrinciple.before.taxes; + +import oops.SOLID.openClosePrinciple.before.employees.Employee; + +class PartTimeEmployeeTaxCalculator implements TaxCalculator{ + + private final static int INCOME_TAX_PERCENTAGE = 20; + private final static int PROFESSIONAL_TAX_PERCENTAGE = 3; + private final static int EDUCATIONAL_CESS = 1; + + + public double calculate(Employee employee) { + return + (employee.getMonthlyIncome() * INCOME_TAX_PERCENTAGE) / 100 + + (employee.getMonthlyIncome() * PROFESSIONAL_TAX_PERCENTAGE) / 100 + + (employee.getMonthlyIncome() * EDUCATIONAL_CESS) / 100; + + } +} \ No newline at end of file diff --git a/src/oops/SOLID/openClosePrinciple/before/taxes/TaxCalculator.java b/src/oops/SOLID/openClosePrinciple/before/taxes/TaxCalculator.java index ab0300be..04006fa4 100644 --- a/src/oops/SOLID/openClosePrinciple/before/taxes/TaxCalculator.java +++ b/src/oops/SOLID/openClosePrinciple/before/taxes/TaxCalculator.java @@ -1,16 +1,6 @@ package oops.SOLID.openClosePrinciple.before.taxes; - import oops.SOLID.openClosePrinciple.before.employees.Employee; -public class TaxCalculator { - private final static int INCOME_TAX_PERCENTAGE = 20; - private final static int PROFESSIONAL_TAX_PERCENTAGE = 3; - - - public static double calculate(Employee employee) { - return - (employee.getMonthlyIncome() * PROFESSIONAL_TAX_PERCENTAGE) / 100 + - (employee.getMonthlyIncome() * INCOME_TAX_PERCENTAGE) / 100; - - } +public interface TaxCalculator{ + public double calculate(Employee employee); } \ No newline at end of file diff --git a/src/oops/SOLID/singleResponsibilityPrinciple/before/CreatePath.java b/src/oops/SOLID/singleResponsibilityPrinciple/before/CreatePath.java new file mode 100644 index 00000000..8dd3b393 --- /dev/null +++ b/src/oops/SOLID/singleResponsibilityPrinciple/before/CreatePath.java @@ -0,0 +1,10 @@ +package oops.SOLID.singleResponsibilityPrinciple.before; + +import java.nio.file.Paths; +class CreatePath{ + + public Path getPath(Employee employee){ + return Paths.get(employee.getFullName() + .replace(" ","_") + ".rec"); + } +} \ No newline at end of file diff --git a/src/oops/SOLID/singleResponsibilityPrinciple/before/Employee.java b/src/oops/SOLID/singleResponsibilityPrinciple/before/Employee.java index a742fac0..3195be38 100644 --- a/src/oops/SOLID/singleResponsibilityPrinciple/before/Employee.java +++ b/src/oops/SOLID/singleResponsibilityPrinciple/before/Employee.java @@ -1,10 +1,5 @@ package oops.SOLID.singleResponsibilityPrinciple.before; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - /* Models an employee form a business perspective */ @@ -62,33 +57,5 @@ public void setNbHoursPerWeek(int nbHoursPerWeek) { public String getFullName(){ return this.firstName + " " + this.lastName; } - - public void save(){ - try { - Employee employee =this; - StringBuilder sb = new StringBuilder(); - sb.append("### EMPLOYEE RECORD ####"); - sb.append(System.lineSeparator()); - sb.append("NAME: "); - sb.append(employee.firstName + " " + employee.lastName); - sb.append(System.lineSeparator()); - sb.append("POSITION: "); - sb.append(employee.getClass().getTypeName()); - sb.append(System.lineSeparator()); - sb.append("EMAIL: "); - sb.append(employee.getEmail()); - sb.append(System.lineSeparator()); - sb.append("MONTHLY WAGE: "); - sb.append(employee.monthlyIncome); - sb.append(System.lineSeparator()); - - Path path = Paths.get(employee.getFullName() - .replace(" ","_") + ".rec"); - Files.write(path, sb.toString().getBytes()); - - System.out.println("Saved employee " + employee.toString()); - } catch (IOException e){ - System.out.println("ERROR: Could not save employee. " + e); - } - } + } diff --git a/src/oops/SOLID/singleResponsibilityPrinciple/before/SaveEmployeesMain.java b/src/oops/SOLID/singleResponsibilityPrinciple/before/SaveEmployeesMain.java index 3e30e5e9..4c873840 100644 --- a/src/oops/SOLID/singleResponsibilityPrinciple/before/SaveEmployeesMain.java +++ b/src/oops/SOLID/singleResponsibilityPrinciple/before/SaveEmployeesMain.java @@ -1,6 +1,9 @@ package oops.SOLID.singleResponsibilityPrinciple.before; import java.util.List; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; public class SaveEmployeesMain { public static void main(String[] args) { @@ -10,7 +13,21 @@ public static void main(String[] args) { // Save all for (Employee e : employees){ - e.save(); + this.save(e); + } + } + + public void save(Employee employee){ + try { + SerializeData serialData=new SerializeData(); + String sb=serialData.getSerializeData(employee); + CreatePath cp=new getSerializeData(); + Path path = cp.getPath(employee); + Files.write(path, sb.getBytes()); + + System.out.println("Saved employee " + employee.toString()); + } catch (IOException e){ + System.out.println("ERROR: Could not save employee. " + e); } } } \ No newline at end of file diff --git a/src/oops/SOLID/singleResponsibilityPrinciple/before/SerializeData.java b/src/oops/SOLID/singleResponsibilityPrinciple/before/SerializeData.java new file mode 100644 index 00000000..108698cf --- /dev/null +++ b/src/oops/SOLID/singleResponsibilityPrinciple/before/SerializeData.java @@ -0,0 +1,25 @@ +package oops.SOLID.singleResponsibilityPrinciple.before; + +class SerializeData{ + + + public String getSerializeData(Employee employee){ + StringBuilder sb = new StringBuilder(); + sb.append("### EMPLOYEE RECORD ####"); + sb.append(System.lineSeparator()); + sb.append("NAME: "); + sb.append(employee.firstName + " " + employee.lastName); + sb.append(System.lineSeparator()); + sb.append("POSITION: "); + sb.append(employee.getClass().getTypeName()); + sb.append(System.lineSeparator()); + sb.append("EMAIL: "); + sb.append(employee.getEmail()); + sb.append(System.lineSeparator()); + sb.append("MONTHLY WAGE: "); + sb.append(employee.monthlyIncome); + sb.append(System.lineSeparator()); + return sb.toString(); + } + +} \ No newline at end of file diff --git a/src/oops/designPatterns/adapter/EmployeeClient.java b/src/oops/designPatterns/adapter/EmployeeClient.java index 6085419a..da9ae0cd 100644 --- a/src/oops/designPatterns/adapter/EmployeeClient.java +++ b/src/oops/designPatterns/adapter/EmployeeClient.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.List; +import oops.designPatterns.adapter.adaptors.EmpCSVAdaptor; +import oops.designPatterns.adapter.adaptors.EmpLdapAdaptor; import oops.designPatterns.adapter.employees.Employee; import oops.designPatterns.adapter.employees.EmployeeCSV; import oops.designPatterns.adapter.employees.EmployeeDB; @@ -23,7 +25,18 @@ public List getEmployeeList() { //We have to add the data of all the employees to the employees list //But it only accepts objects of type Employee - + + employees.add(employeeFromDB); // it does not require an adaptor as it is already implementing Employee Interface + employees.add(new EmpCSVAdaptor((employeeFromCSV))); + employees.add(new EmpLdapAdaptor(employeeFromLdap)); + +// for (Employee employee : employees) { +// System.out.print(employee.getId()); +// System.out.print(employee.getFirstName()); +// System.out.print(employee.getLastName()); +// System.out.print(employee.getEmail()); +// System.out.println(); +// } return employees; diff --git a/src/oops/designPatterns/adapter/adaptors/EmpCSVAdaptor.java b/src/oops/designPatterns/adapter/adaptors/EmpCSVAdaptor.java new file mode 100644 index 00000000..52071530 --- /dev/null +++ b/src/oops/designPatterns/adapter/adaptors/EmpCSVAdaptor.java @@ -0,0 +1,31 @@ +package oops.designPatterns.adapter.adaptors; + +import oops.designPatterns.adapter.employees.Employee; +import oops.designPatterns.adapter.employees.EmployeeCSV; + +public class EmpCSVAdaptor implements Employee { + EmployeeCSV csv; + public EmpCSVAdaptor(EmployeeCSV csv){ + this.csv=csv; + } + + @Override + public String getId() { + return csv.getId()+""; + } + + @Override + public String getEmail() { + return csv.getEmailAddress(); + } + + @Override + public String getFirstName() { + return csv.getLastname(); + } + + @Override + public String getLastName() { + return csv.getLastname(); + } +} diff --git a/src/oops/designPatterns/adapter/adaptors/EmpLdapAdaptor.java b/src/oops/designPatterns/adapter/adaptors/EmpLdapAdaptor.java new file mode 100644 index 00000000..d9112795 --- /dev/null +++ b/src/oops/designPatterns/adapter/adaptors/EmpLdapAdaptor.java @@ -0,0 +1,31 @@ +package oops.designPatterns.adapter.adaptors; + +import oops.designPatterns.adapter.employees.Employee; +import oops.designPatterns.adapter.employees.EmployeeLdap; + +public class EmpLdapAdaptor implements Employee { + EmployeeLdap ldap; + public EmpLdapAdaptor(EmployeeLdap ldap){ + this.ldap=ldap; + } + + @Override + public String getId() { + return ldap.getCn(); + } + + @Override + public String getFirstName() { + return ldap.getGivenName(); + } + + @Override + public String getLastName() { + return ldap.getSurname(); + } + + @Override + public String getEmail() { + return ldap.getMail(); + } +} diff --git a/src/oops/designPatterns/decorator/Client.java b/src/oops/designPatterns/decorator/Client.java index f4ae96ae..469ee925 100644 --- a/src/oops/designPatterns/decorator/Client.java +++ b/src/oops/designPatterns/decorator/Client.java @@ -3,30 +3,35 @@ import oops.designPatterns.decorator.beverages.Beverage; import oops.designPatterns.decorator.beverages.Cappuccino; import oops.designPatterns.decorator.beverages.decorators.ChocolateDecorator; +import oops.designPatterns.decorator.visualComponents.ButtonView; import oops.designPatterns.decorator.visualComponents.TextView; import oops.designPatterns.decorator.visualComponents.VisualComponent; -import oops.designPatterns.decorator.visualComponents.decorators.BorderDecorator; -import oops.designPatterns.decorator.visualComponents.decorators.ScrollDecorator; +import oops.designPatterns.decorator.visualComponents.decorator.BorderDecorator; +import oops.designPatterns.decorator.visualComponents.decorator.ScrollDecorator; +//import oops.designPatterns.decorator.visualComponents.decorators.BorderDecorator; +//import oops.designPatterns.decorator.visualComponents.decorators.ScrollDecorator; public class Client { public static void main(String[] args) { - /* + VisualComponent textBox = new TextView("This is the text of my text-box"); VisualComponent textBoxWithBorder = new BorderDecorator(textBox); VisualComponent textBoxWithScroll = new ScrollDecorator(textBoxWithBorder); - - + textBoxWithScroll.draw(); + + VisualComponent button = new ButtonView("This is the Button"); + VisualComponent buttonWithBorder = new BorderDecorator(button); + + buttonWithBorder.draw(); - */ - - Beverage coffee = new Cappuccino(); - System.out.println(coffee.cost()); - - Beverage coffeeWithCoholate = new ChocolateDecorator(new ChocolateDecorator(coffee)); - System.out.println(coffeeWithCoholate.cost()); +// Beverage coffee = new Cappuccino(); +// System.out.println(coffee.cost()); +// +// Beverage coffeeWithCoholate = new ChocolateDecorator(new ChocolateDecorator(coffee)); +// System.out.println(coffeeWithCoholate.cost()); diff --git a/src/oops/designPatterns/decorator/visualComponents/ButtonView.java b/src/oops/designPatterns/decorator/visualComponents/ButtonView.java new file mode 100644 index 00000000..343938a3 --- /dev/null +++ b/src/oops/designPatterns/decorator/visualComponents/ButtonView.java @@ -0,0 +1,19 @@ +package oops.designPatterns.decorator.visualComponents; + +public class ButtonView extends VisualComponent{ + private String content; + public ButtonView(String content){ + this.content=content; + } + @Override + public void draw(){ + System.out.println("Button is drawn with: "+this.content); + } + public String getContent(){ + return this.content; + } + public void setContent(String content){ + this.content=content; + } + +} diff --git a/src/oops/designPatterns/decorator/visualComponents/decorator/BorderDecorator.java b/src/oops/designPatterns/decorator/visualComponents/decorator/BorderDecorator.java new file mode 100644 index 00000000..6a496af2 --- /dev/null +++ b/src/oops/designPatterns/decorator/visualComponents/decorator/BorderDecorator.java @@ -0,0 +1,14 @@ +package oops.designPatterns.decorator.visualComponents.decorator; + +import oops.designPatterns.decorator.visualComponents.VisualComponent; + +public class BorderDecorator extends ComponentDecorator{ + + public BorderDecorator(VisualComponent component){ + super(component); + } + public void draw(){ + this.component.draw(); + System.out.println("Border added"); + } +} diff --git a/src/oops/designPatterns/decorator/visualComponents/decorator/ComponentDecorator.java b/src/oops/designPatterns/decorator/visualComponents/decorator/ComponentDecorator.java new file mode 100644 index 00000000..858af0c3 --- /dev/null +++ b/src/oops/designPatterns/decorator/visualComponents/decorator/ComponentDecorator.java @@ -0,0 +1,11 @@ +package oops.designPatterns.decorator.visualComponents.decorator; + +import oops.designPatterns.decorator.visualComponents.VisualComponent; + +public abstract class ComponentDecorator extends VisualComponent { + VisualComponent component; + public ComponentDecorator(VisualComponent component){ + this.component=component; + } + +} diff --git a/src/oops/designPatterns/decorator/visualComponents/decorator/ScrollDecorator.java b/src/oops/designPatterns/decorator/visualComponents/decorator/ScrollDecorator.java new file mode 100644 index 00000000..e09f5860 --- /dev/null +++ b/src/oops/designPatterns/decorator/visualComponents/decorator/ScrollDecorator.java @@ -0,0 +1,13 @@ +package oops.designPatterns.decorator.visualComponents.decorator; + +import oops.designPatterns.decorator.visualComponents.VisualComponent; + +public class ScrollDecorator extends ComponentDecorator{ + public ScrollDecorator(VisualComponent component){ + super(component); + } + public void draw(){ + this.component.draw(); + System.out.println("Scroll added"); + } +} diff --git a/src/oops/designPatterns/factory/AddressValidator/Address.java b/src/oops/designPatterns/factory/AddressValidator/Address.java new file mode 100644 index 00000000..cec985d0 --- /dev/null +++ b/src/oops/designPatterns/factory/AddressValidator/Address.java @@ -0,0 +1,77 @@ +package oops.designPatterns.factory.AddressValidator; +import lombok.Getter; + +//Implemented Builder Pattern so that user can give address in any format. It can also be done by simple getter and setters +// Just tried this example. Builder are only implemented when we need immutable objects and parameters can be of any order. + +@Getter +public class Address { + private String cc; + private String country; + private String state; + private String district; + private String zipcode; + private String landmark; + private String street; + private String houseNo; + + public Address(Builder b){ + this.cc=b.cc; + this.country=b.country; + this.state=b.state; + this.district=b.district; + this.zipcode=b.zipcode; + this.landmark=b.landmark; + this.street=b.street; + this.houseNo=b.houseNo; + } + + static class Builder{ + private String cc; + private String country; + private String state; + private String district; + private String zipcode; + private String landmark; + private String street; + private String houseNo; + public Builder(){} + + public Builder setCc(String cc){ + this.cc=cc; + return this; + } + public Builder setCountry(String country){ + this.country=country; + return this; + } + public Builder setState(String state){ + this.state=state; + return this; + } + public Builder setDistrict(String district){ + this.district=district; + return this; + } + public Builder setZipcode(String zipcode){ + this.zipcode=zipcode; + return this; + } + public Builder setLandmark(String landmark){ + this.landmark=landmark; + return this; + } + public Builder setStreet(String street){ + this.street=street; + return this; + } + public Builder setHouseNo(String houseNo){ + this.houseNo=houseNo; + return this; + } + public Address build(){ + return new Address(this); + } + } + +} diff --git a/src/oops/designPatterns/factory/AddressValidator/AddressValidatorFactory.java b/src/oops/designPatterns/factory/AddressValidator/AddressValidatorFactory.java new file mode 100644 index 00000000..1f39bb98 --- /dev/null +++ b/src/oops/designPatterns/factory/AddressValidator/AddressValidatorFactory.java @@ -0,0 +1,32 @@ +package oops.designPatterns.factory.AddressValidator; + +import oops.designPatterns.factory.AddressValidator.Validator.IndiaValidator; +import oops.designPatterns.factory.AddressValidator.Validator.UsaValidator; +import oops.designPatterns.factory.AddressValidator.Validator.Validator; + +import java.util.HashMap; +import java.util.Map; + +public class AddressValidatorFactory { + private Map validatorMap; + private static AddressValidatorFactory instance=null; + private AddressValidatorFactory(){ + this.loadMap(); + } + public static AddressValidatorFactory getInstance(){ + if(instance==null){ + return new AddressValidatorFactory(); + }else{ + return instance; + } + } + + public Validator getValidator(String cc){ + return validatorMap.get(cc); + } + private void loadMap(){ + this.validatorMap=new HashMap<>(); + this.validatorMap.put("US",new UsaValidator()); + this.validatorMap.put("IN",new IndiaValidator()); + } +} diff --git a/src/oops/designPatterns/factory/AddressValidator/FactoryDemoClient.java b/src/oops/designPatterns/factory/AddressValidator/FactoryDemoClient.java new file mode 100644 index 00000000..b0ceb66a --- /dev/null +++ b/src/oops/designPatterns/factory/AddressValidator/FactoryDemoClient.java @@ -0,0 +1,13 @@ +package oops.designPatterns.factory.AddressValidator; + +public class FactoryDemoClient { + + public static void main(String[] args) { + Address addUsa=new Address.Builder().setCc("US").setCountry("USA").setZipcode("74738").setStreet("Baker's Lane").setHouseNo("114").build(); + Address addIndia=new Address.Builder().setCc("IN").setCountry("India").setZipcode("841227").setState("Bihar").setDistrict("Siwan").setLandmark("Near Tarwara More").setStreet("Atarsua Tola").build(); +// Address add=new Address("India","Bihar","Siwan","841226","IN"); +// Address add1=new Address("USA","Bihar","Siwan","841226","US"); + System.out.println(AddressValidatorFactory.getInstance().getValidator(addUsa.getCc()).validate(addUsa)); + System.out.println(AddressValidatorFactory.getInstance().getValidator(addIndia.getCc()).validate(addIndia)); + } +} diff --git a/src/oops/designPatterns/factory/AddressValidator/Validator/IndiaValidator.java b/src/oops/designPatterns/factory/AddressValidator/Validator/IndiaValidator.java new file mode 100644 index 00000000..11207300 --- /dev/null +++ b/src/oops/designPatterns/factory/AddressValidator/Validator/IndiaValidator.java @@ -0,0 +1,11 @@ +package oops.designPatterns.factory.AddressValidator.Validator; + +import oops.designPatterns.factory.AddressValidator.Address; + +public class IndiaValidator implements Validator{ + @Override + public boolean validate(Address add) { + System.out.println("India Validator: "+ add.getState()); + return true; + } +} diff --git a/src/oops/designPatterns/factory/AddressValidator/Validator/UsaValidator.java b/src/oops/designPatterns/factory/AddressValidator/Validator/UsaValidator.java new file mode 100644 index 00000000..67c579d2 --- /dev/null +++ b/src/oops/designPatterns/factory/AddressValidator/Validator/UsaValidator.java @@ -0,0 +1,11 @@ +package oops.designPatterns.factory.AddressValidator.Validator; + +import oops.designPatterns.factory.AddressValidator.Address; + +public class UsaValidator implements Validator{ + @Override + public boolean validate(Address add) { + System.out.println("US Validator: "+ add.getStreet()); + return true; + } +} diff --git a/src/oops/designPatterns/factory/AddressValidator/Validator/Validator.java b/src/oops/designPatterns/factory/AddressValidator/Validator/Validator.java new file mode 100644 index 00000000..64cb2211 --- /dev/null +++ b/src/oops/designPatterns/factory/AddressValidator/Validator/Validator.java @@ -0,0 +1,8 @@ +package oops.designPatterns.factory.AddressValidator.Validator; + +import oops.designPatterns.factory.AddressValidator.Address; + +public interface Validator { + boolean validate(Address add); + +} diff --git a/src/oops/designPatterns/prototype/PrototypeDemo.java b/src/oops/designPatterns/prototype/PrototypeDemo.java index e77eff9b..a910d282 100644 --- a/src/oops/designPatterns/prototype/PrototypeDemo.java +++ b/src/oops/designPatterns/prototype/PrototypeDemo.java @@ -5,22 +5,22 @@ public class PrototypeDemo { public static void main(String[] args) { - Registry registry = new Registry(); - Movie movie = (Movie) registry.createItem("Movie"); + Registry registry = Registry.getInstance(); + Movie movie = (Movie) registry.createItem("ArtMovie"); movie.setTitle("The Prestige"); System.out.println(movie); System.out.println(movie.getRuntime()); System.out.println(movie.getTitle()); - System.out.println(movie.getUrl()); + System.out.println(movie.getPrice()); - Movie anotherMovie = (Movie) registry.createItem("Movie"); + Movie anotherMovie = (Movie) registry.createItem("ShortMovie"); anotherMovie.setTitle("Gang of Wassepur"); System.out.println(anotherMovie); System.out.println(anotherMovie.getRuntime()); System.out.println(anotherMovie.getTitle()); - System.out.println(anotherMovie.getUrl()); + System.out.println(anotherMovie.getPrice()); } } diff --git a/src/oops/designPatterns/prototype/Registry.java b/src/oops/designPatterns/prototype/Registry.java index 0b62a0e7..9304286c 100644 --- a/src/oops/designPatterns/prototype/Registry.java +++ b/src/oops/designPatterns/prototype/Registry.java @@ -11,11 +11,20 @@ //Singleton public class Registry { - private Map items = new HashMap(); - - public Registry() { + private static Registry instance=null; + + private Map items = new HashMap<>(); + + private Registry() { loadItems(); } + public static Registry getInstance(){ + if(instance==null){ + return new Registry(); + }else{ + return instance; + } + } public Item createItem (String type) { Item item = null;